Simple line layout: Small tweaks to improve performance.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Jan 2017 00:17:04 +0000 (00:17 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Jan 2017 00:17:04 +0000 (00:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=167611
<rdar://problem/30274294>

Reviewed by Simon Fraser.

PerformanceTests:

* Layout/simple-line-layout-non-repeating-text.html: Added.

Source/WebCore:

This is ~10% progression on the attached test case (paragraphs with non-redundant content).
median: 102.08 runs/s -> median: 114.25 runs/s

* rendering/SimpleLineLayout.cpp:
(WebCore::SimpleLineLayout::LineState::appendFragmentAndCreateRunIfNeeded):
* rendering/SimpleLineLayoutFlowContents.cpp:
(WebCore::SimpleLineLayout::initializeSegments):
(WebCore::SimpleLineLayout::FlowContents::FlowContents):
* rendering/SimpleLineLayoutFlowContents.h:
* rendering/SimpleLineLayoutTextFragmentIterator.cpp:
(WebCore::SimpleLineLayout::TextFragmentIterator::nextNonWhitespacePosition):
(WebCore::SimpleLineLayout::TextFragmentIterator::skipToNextPosition):
* rendering/SimpleLineLayoutTextFragmentIterator.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@211394 268f45cc-cd09-0410-ab3c-d52691b4dbfc

PerformanceTests/ChangeLog
PerformanceTests/Layout/simple-line-layout-non-repeating-text.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/rendering/SimpleLineLayout.cpp
Source/WebCore/rendering/SimpleLineLayoutFlowContents.cpp
Source/WebCore/rendering/SimpleLineLayoutFlowContents.h
Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp
Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.h

index 370b80d..e2966e1 100644 (file)
@@ -1,3 +1,13 @@
+2017-01-30  Zalan Bujtas  <zalan@apple.com>
+
+        Simple line layout: Small tweaks to improve performance.
+        https://bugs.webkit.org/show_bug.cgi?id=167611
+        <rdar://problem/30274294>
+
+        Reviewed by Simon Fraser.
+
+        * Layout/simple-line-layout-non-repeating-text.html: Added.
+
 2017-01-13  Said Abou-Hallawa  <sabouhallawa@apple.com>
 
         26 MotionMark performance tests failing
diff --git a/PerformanceTests/Layout/simple-line-layout-non-repeating-text.html b/PerformanceTests/Layout/simple-line-layout-non-repeating-text.html
new file mode 100644 (file)
index 0000000..3b06883
--- /dev/null
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Line breaking performance test</title>
+    <script src="../resources/runner.js"></script>
+</head>
+<body>
+    <pre id="log"></pre>
+    <div id="target" style="width: 300px; display: none;">
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc iaculis eu turpis varius euismod. Curabitur sed aliquet ante. Nunc pharetra egestas justo vitae placerat. Integer rhoncus elit at orci euismod, eu convallis dui pretium. Integer in libero at orci tincidunt tempor id ut nisi. Duis ullamcorper sollicitudin ex ac pulvinar. Morbi nec commodo nisl, id consectetur justo. Donec euismod velit eu libero varius elementum. Fusce bibendum sed ligula at hendrerit. Sed tincidunt justo convallis eros imperdiet varius. Sed ut neque ut tellus pretium bibendum. Pellentesque sapien felis, placerat id risus eget, congue tincidunt velit. Curabitur a arcu metus. Vivamus vel arcu sed ex volutpat viverra a nec tortor.</p>
+<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus id leo malesuada, iaculis sem a, tristique nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed vitae sollicitudin nulla, sed auctor arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer commodo, odio sed auctor hendrerit, ex magna porta ipsum, a bibendum justo risus in sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet nec erat ac sagittis. Vivamus mattis, metus vel ullamcorper aliquam, ipsum tellus tempor erat, vitae sodales arcu erat sed lorem. Morbi consequat, dolor ut vestibulum sodales, nunc mi ultricies ex, ac egestas sem risus at purus. Morbi sem libero, bibendum vel porta et, commodo non nulla. Nullam non nibh leo.</p>
+<p>Praesent in leo id lorem egestas posuere at in erat. Pellentesque interdum laoreet odio, vel iaculis orci ullamcorper ut. Sed sed quam nec mi lobortis sollicitudin non non ipsum. Donec placerat molestie massa ut euismod. Pellentesque sed diam ac risus pharetra pulvinar eu vel purus. Donec ut ornare risus. Proin ultrices felis mattis tempus molestie. Etiam sollicitudin, enim quis placerat pellentesque, justo nisl consequat magna, ut tincidunt enim purus in diam. Etiam ut tempus erat. Mauris at diam sed sapien molestie blandit at hendrerit nisi. Quisque justo neque, pellentesque sit amet tellus ut, bibendum cursus lectus. Curabitur viverra nunc nisi. Sed nec mi at sapien lobortis dapibus non eu nunc. In hac habitasse platea dictumst. Donec accumsan auctor lorem a porttitor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+<p>Pellentesque a viverra risus. In ultricies enim nulla, nec venenatis mauris consectetur eget. Cras dignissim posuere interdum. Morbi malesuada tortor justo, at placerat augue sodales nec. Morbi risus urna, rhoncus at risus in, dapibus sollicitudin quam. Donec egestas turpis aliquet luctus efficitur. Integer lacinia elementum massa et mollis. Phasellus vehicula tincidunt aliquet.</p>
+<p>Sed ut efficitur dui. Phasellus vel lectus diam. Fusce aliquet pulvinar dictum. Pellentesque laoreet venenatis risus eu blandit. Aliquam facilisis cursus eleifend. Sed ac interdum magna. Fusce non molestie mauris. Integer ullamcorper dui a enim dictum varius. Vivamus faucibus ornare iaculis. Praesent finibus turpis a turpis fringilla congue. Morbi ultricies augue in lectus congue, tincidunt pellentesque ligula dictum.</p>
+<p>Vivamus pulvinar tortor nec quam facilisis feugiat. Praesent id nibh nec ligula euismod sollicitudin. Ut posuere ligula diam. Nulla molestie tristique luctus. Proin imperdiet efficitur arcu, nec vestibulum libero egestas vitae. Curabitur sed urna non urna bibendum aliquam. Donec congue eu sapien hendrerit volutpat. Nam in tellus et arcu tincidunt sagittis. Nam arcu justo, varius vel velit nec, ultrices faucibus odio. Praesent placerat erat ac velit accumsan finibus. Nam tempor consequat vehicula. Duis nibh elit, laoreet ut lacus in, scelerisque aliquam arcu. Suspendisse iaculis ac tellus suscipit cursus.</p>
+<p>Proin feugiat fringilla nunc vel finibus. Nam eu diam id leo semper ultricies in et eros. Praesent tempus tellus sit amet turpis scelerisque, in vestibulum arcu mollis. Praesent lacus massa, consectetur nec eleifend vel, porttitor vel augue. Vivamus eu condimentum dui, eu tempor arcu. Cras efficitur orci eu enim convallis, at mollis quam blandit. Suspendisse potenti. Maecenas fermentum nunc felis, id suscipit risus sollicitudin ut. Donec euismod pellentesque elit vel lacinia.</p>
+<p>Nam et luctus tortor. Aliquam sollicitudin mauris eget quam ultrices, ac rutrum velit pellentesque. Sed feugiat sem libero, non lacinia tellus egestas quis. Morbi cursus turpis a erat rutrum euismod et quis ex. In tempor euismod imperdiet. Aliquam imperdiet iaculis hendrerit. Mauris mollis interdum nulla, id laoreet orci dignissim ac. Sed eget nunc vehicula, accumsan lectus ultricies, ullamcorper ipsum.</p>
+<p>Phasellus vitae volutpat leo. Etiam rutrum elementum tellus, vitae pretium lorem ornare quis. In hac habitasse platea dictumst. Integer mattis malesuada arcu, ac laoreet lorem commodo sit amet. Cras lobortis id nunc elementum scelerisque. Donec enim lorem, ultrices id magna sed, ornare rutrum augue. Integer et augue at dui tristique facilisis. Curabitur eros arcu, luctus quis justo vel, tincidunt suscipit nisl. Vestibulum suscipit blandit eros eget semper. Suspendisse eu bibendum ante, ut convallis nibh. Mauris sed ultricies magna. Pellentesque porttitor massa in nunc placerat suscipit. Suspendisse a fermentum dui.</p>
+<p>Mauris eros lacus, posuere ut dui vehicula, malesuada condimentum nisi. Cras a est neque. Cras ex tortor, dignissim non laoreet quis, rutrum non odio. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo nunc eu metus mollis, consectetur facilisis lacus scelerisque. Mauris congue lectus a neque tempus, sollicitudin venenatis nulla auctor. Etiam non ligula imperdiet, tincidunt risus in, tempor justo. Aliquam ac egestas justo. Donec tempus dictum velit. Suspendisse convallis, sem in sollicitudin molestie, dolor lacus elementum dui, at blandit lacus nisi sit amet velit. Aenean porttitor eros eu velit tincidunt tempor. Phasellus a risus hendrerit, blandit massa eu, laoreet sapien. Donec eget sapien quis tortor efficitur porttitor non vel ex. Praesent eget lorem quis metus euismod varius quis non lorem.</p>
+<p>Mauris non dolor erat. Curabitur vitae sodales mi. Sed eget dui ultricies, bibendum tortor eget, pharetra mi. Phasellus placerat feugiat euismod. Phasellus ultrices, libero at tristique consectetur, arcu nunc ultrices sapien, ac euismod elit enim quis nisl. Donec a neque id mi luctus ultricies in id nibh. Praesent pellentesque ipsum turpis, id convallis urna consequat vel. Mauris hendrerit hendrerit ex sed sollicitudin. Praesent sit amet est est. Pellentesque lorem lectus, pharetra vel posuere nec, faucibus in dolor.</p>
+<p>Nullam a est condimentum ante tempus blandit eget vitae nulla. Ut diam risus, semper non vulputate eget, aliquet et ipsum. Donec lacinia suscipit diam ut rutrum. Etiam pellentesque pulvinar nunc eu fermentum. Sed auctor mi in bibendum mollis. Ut porta, tellus nec accumsan sollicitudin, dolor mauris lobortis sem, nec ultrices quam sapien vitae quam. Quisque dapibus, ex ut ullamcorper rhoncus, nisl nulla pellentesque erat, quis mattis velit ante a erat. Vivamus auctor tellus eu imperdiet molestie.</p>
+<p>Proin ac risus enim. Morbi lacus urna, mollis at lacus sed, consectetur sodales sem. Vivamus in rutrum dolor. Donec pulvinar odio nec diam ultrices porttitor. Cras pulvinar ut sapien sit amet vehicula. Praesent ac maximus felis, id dignissim diam. Etiam eget venenatis sapien, a ullamcorper tellus. Donec mauris turpis, pretium eu eros ac, egestas laoreet ex.</p>
+<p>Duis nulla nisl, elementum at ante vel, iaculis hendrerit mi. Praesent blandit aliquet nunc, vitae dapibus dolor facilisis quis. Proin nibh augue, fringilla sed egestas vel, tristique at dui. Suspendisse vitae tortor quis lacus luctus volutpat. Proin viverra eros a tortor luctus molestie. Pellentesque sit amet lacus neque. Mauris accumsan eu velit sit amet facilisis. Suspendisse potenti. Sed imperdiet sed odio nec semper. Cras interdum risus non nulla sodales, eu ultrices nulla vehicula. Proin ac scelerisque purus. Sed luctus egestas massa, a luctus lorem consectetur ac.</p>
+<p>Vivamus semper ante orci, sit amet ultricies urna elementum vel. Proin volutpat erat eleifend, feugiat nisl sit amet, rhoncus quam. Curabitur consectetur luctus libero, sit amet volutpat nulla sollicitudin ac. Integer at ornare ipsum. Nullam eleifend sapien ac sodales bibendum. Nunc nec est imperdiet, aliquet mi vel, volutpat dolor. Nam consequat nisi vel nibh consequat, non consequat metus dictum. Mauris vel sagittis nisl. Phasellus mauris risus, semper eu ligula nec, lacinia finibus justo. Ut consequat tempus fringilla. Cras vestibulum risus eu mi faucibus eleifend. Curabitur bibendum justo eget ligula tincidunt viverra. Vestibulum id fringilla ex, in finibus justo. Ut dignissim turpis vel erat egestas semper.</p>
+<p>Curabitur et blandit lectus. Proin euismod ultrices tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ac mi eget metus laoreet cursus. Aenean at fringilla massa, at ornare felis. Duis congue venenatis turpis, a rutrum nulla. Vestibulum sed dui quis felis fermentum consequat. Proin sit amet mauris et turpis aliquam facilisis. Praesent non urna non arcu tempus varius. Vestibulum eros lorem, feugiat non justo nec, viverra scelerisque sem. Aenean in nisl metus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce tincidunt ante elit, a auctor quam egestas eget. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque pretium lectus et metus ullamcorper, ut lacinia purus mollis.</p>
+<p>Duis molestie vel felis et iaculis. Pellentesque interdum hendrerit eros sed vehicula. Curabitur varius est eget nunc tincidunt, non porttitor est vestibulum. Pellentesque nec bibendum leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent tempus, lectus non condimentum mattis, enim ipsum tempus erat, et facilisis elit dui in risus. Integer tempor neque eget tempor facilisis. Integer ut nibh nisi. Donec dapibus elit eget porta molestie. Aenean a nibh diam.</p>
+<p>Fusce condimentum suscipit efficitur. Donec aliquet tempor blandit. Aliquam quis libero rutrum, mollis elit ac, dapibus ante. Fusce fringilla euismod dolor eget elementum. In congue lectus leo, nec faucibus massa pellentesque in. Donec id laoreet nibh, a placerat quam. Donec non ex non lacus hendrerit varius eu commodo tellus. Curabitur in laoreet risus, in blandit purus. Donec dictum magna tristique est mattis venenatis.</p>
+<p>Nunc elementum, enim elementum consequat ultricies, felis tellus pellentesque odio, in laoreet est quam lobortis sem. Aenean euismod euismod sagittis. Donec ut elementum nisi. Praesent volutpat, ligula nec dignissim aliquet, augue nisi dignissim ipsum, a volutpat mi urna non nisi. Aliquam ligula quam, vestibulum sit amet tortor a, pellentesque aliquet ex. Sed tempor eros sed urna posuere aliquet. Nam sagittis elit sed arcu auctor consequat. Curabitur suscipit est orci, vel vehicula leo laoreet sit amet. Aliquam viverra mattis mi. Nam iaculis eu lectus non elementum. Nam vitae vestibulum metus. Curabitur mollis a massa vel rhoncus. Praesent a massa tristique, ornare metus aliquam, tempor risus.</p>
+<p>Mauris ultrices facilisis vehicula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam non pharetra leo, a facilisis urna. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas aliquam venenatis vestibulum. Sed ornare turpis et justo posuere, sit amet eleifend ex laoreet. Maecenas dignissim ac purus vitae tempor. In hac habitasse platea dictumst. Aliquam ac pulvinar erat. Donec aliquam vulputate sapien, eget dictum velit pulvinar vehicula. Phasellus dapibus tincidunt nisi. Ut in sem vel orci varius viverra id quis enim. Nullam aliquam tincidunt nulla. Proin ante lorem, ultricies eu mollis non, auctor at lacus.</p>
+<p>Morbi non purus vitae nisi semper euismod. Nam blandit pretium ligula, id semper sapien volutpat eu. Fusce efficitur pretium nisi malesuada lobortis. Curabitur vel auctor tortor, ac rhoncus diam. Quisque ornare suscipit turpis, sed gravida leo aliquam ut. Pellentesque sed mauris eget tellus sollicitudin condimentum. Morbi tincidunt, lacus in lacinia venenatis, orci mauris malesuada nisi, non aliquet mauris arcu eget sem. Morbi massa metus, interdum vel interdum et, sagittis auctor odio. Suspendisse ullamcorper feugiat turpis quis auctor. Integer sed lorem nulla. Mauris porta purus vel risus venenatis, sit amet congue urna varius. Praesent euismod fringilla metus vel porta. Morbi mollis urna eget lectus consequat finibus. Integer maximus nibh et leo fermentum, eget ultrices lectus congue.</p>
+<p>Duis sed ex tempor metus porta eleifend. Proin et tempus dui. Vivamus arcu tellus, aliquam non venenatis nec, accumsan condimentum ipsum. Ut in quam vitae nisl faucibus aliquam et non metus. Integer cursus pellentesque nunc, eu varius est rutrum eget. Fusce sit amet luctus justo. Nam velit nisl, consectetur molestie orci in, dignissim convallis sem. Nulla dictum leo sed nunc pretium, volutpat dapibus enim sodales. Sed vehicula magna eros, lobortis ultrices enim ultricies non. Fusce sit amet vulputate mauris.</p>
+<p>Proin varius metus nec nisl posuere accumsan. In ut dignissim felis. Proin eu condimentum mi. Donec placerat eu augue et tempor. Vestibulum in velit egestas, scelerisque ante quis, rutrum nisl. Duis vel faucibus diam. Mauris ornare, leo quis imperdiet porttitor, lectus nisl ullamcorper felis, a iaculis purus tortor sit amet purus. Proin eu tincidunt erat, sed sagittis nulla. Curabitur efficitur nisl eu volutpat facilisis. Nulla mauris elit, aliquet at nisl eu, faucibus iaculis tortor. Praesent egestas eros vulputate lectus interdum malesuada. Ut erat sem, iaculis vitae volutpat id, pharetra id purus. Ut sollicitudin tristique feugiat.</p>
+<p>Mauris tincidunt nec nisl vitae iaculis. Proin efficitur magna dolor, a pellentesque erat pharetra nec. Duis interdum turpis bibendum, convallis augue vitae, luctus quam. Quisque sagittis leo ac suscipit ultrices. Curabitur non porta ante. Integer sodales consectetur neque, a lacinia dolor. Sed sollicitudin lacus non erat iaculis, non placerat elit ullamcorper. Cras accumsan nulla in eleifend mollis. Nam id porttitor dui. Mauris ut sem eget sapien viverra malesuada. Nullam mattis, enim sit amet ullamcorper scelerisque, quam massa bibendum urna, sit amet egestas est nulla a augue. Suspendisse risus mi, ornare nec vulputate at, auctor at quam. Ut sodales ultrices hendrerit. Donec porta ligula vitae nisl ornare, dignissim pretium quam efficitur.</p>
+<p>Aliquam sit amet interdum lacus. Aenean vehicula, ligula vel porttitor posuere, enim odio dignissim lorem, quis viverra felis sem a mauris. Etiam posuere augue nec nisl convallis, et pulvinar sapien consectetur. Ut felis metus, ultricies vel magna et, viverra pharetra felis. Curabitur egestas felis vitae turpis maximus, eu rutrum libero malesuada. Nullam interdum gravida mi, ac volutpat dui posuere vel. Aliquam mattis non risus id maximus. Donec lacus lacus, bibendum vel magna volutpat, rutrum pellentesque urna.</p>
+<p>Nam orci nisl, vulputate a ipsum auctor, imperdiet tincidunt dolor. Nunc placerat augue nunc, ac egestas est volutpat et. Vivamus sagittis nunc sed ex facilisis dapibus. Nunc semper sagittis dolor, eget pharetra enim facilisis nec. Nam ut metus porttitor, lobortis elit in, rutrum nisi. Curabitur iaculis gravida fermentum. Duis mattis porta orci sit amet convallis. Cras sed arcu et nisi facilisis accumsan ut eu lacus. Fusce aliquet egestas porta. Cras vel mollis urna, eu mattis tellus.</p>
+<p>Cras luctus mauris ligula, at placerat ligula varius eget. Duis sem turpis, eleifend nec vehicula sit amet, eleifend vel leo. Maecenas pretium sodales ante, a dictum urna tincidunt ac. Nulla quis nulla a nisi mattis pharetra. Sed sem nunc, egestas vel bibendum sed, rhoncus ut ipsum. Pellentesque faucibus dui magna, a rhoncus arcu accumsan quis. Mauris et metus suscipit, tempor magna nec, semper velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Quisque id suscipit erat. Sed id metus eu nulla consequat convallis vitae vel orci. Integer a sagittis diam. Donec vestibulum massa rhoncus, egestas risus eleifend, tincidunt augue. Maecenas vestibulum a mauris sit amet congue. Curabitur condimentum convallis eros sit amet sodales. Integer non mauris lacus.</p>
+<p>Vivamus non quam suscipit, aliquet tellus sit amet, blandit augue. Pellentesque maximus ligula velit. Mauris bibendum lobortis quam, eget euismod enim. Suspendisse lectus felis, vulputate at condimentum vel, luctus imperdiet quam. Maecenas maximus imperdiet ipsum, eget efficitur neque porttitor vitae. Donec efficitur a ante nec accumsan. Nulla facilisi. Nulla mollis orci eget est elementum, ornare pellentesque magna ultrices. Donec lobortis ac urna tincidunt dapibus. Morbi non facilisis nisl. Phasellus at laoreet neque. Morbi eu quam et nibh cursus porttitor eu sit amet nunc. Mauris aliquam, velit vel consequat viverra, urna urna ornare magna, et rhoncus arcu lacus viverra nulla. Cras varius ultricies mauris, ac pharetra eros luctus sed. Aenean pulvinar lorem lorem, id facilisis leo viverra nec. Quisque eu lectus in odio mattis ultrices quis vitae ex.</p>
+<p>Etiam vestibulum ligula augue, ac iaculis nisl mattis et. Pellentesque fringilla ullamcorper ultrices. Pellentesque egestas gravida elementum. Aenean quis pellentesque quam, non feugiat dui. Donec tempus nibh ut mauris viverra, eget rutrum diam tristique. Vivamus eu dapibus elit. Maecenas feugiat maximus dignissim. Nam sed eros lobortis erat porta placerat. Fusce ut neque a sapien molestie varius. Nullam dui odio, fermentum et nibh in, elementum tincidunt arcu.</p>
+<p>Nam convallis eros eu sem pellentesque ultrices. Pellentesque semper risus eget mauris fringilla egestas. Integer laoreet euismod malesuada. Morbi iaculis ante sed erat blandit pharetra. Cras ipsum turpis, dictum ut felis non, maximus placerat nulla. Aliquam in fringilla est, sed facilisis enim. Suspendisse potenti. Phasellus blandit, ipsum ut faucibus scelerisque, sem velit luctus risus, vel pretium magna lacus sed nulla. Ut placerat sit amet neque non condimentum.</p>
+<p>Nulla ut eros ut felis porta vestibulum eget eu mi. Duis congue commodo commodo. Proin orci quam, suscipit nec sapien sit amet, ullamcorper sagittis lorem. Aliquam erat volutpat. Donec sed dictum ligula, at blandit nibh. Phasellus euismod dolor in est elementum venenatis. Phasellus varius malesuada malesuada. Ut finibus augue vitae elementum interdum. Sed vel dignissim enim, at euismod ante. Etiam suscipit mattis mi id posuere. Aliquam posuere lorem in erat congue semper. Cras luctus eros at posuere placerat. Nulla non vehicula elit. Suspendisse pretium placerat mauris in tincidunt. Nunc a sapien est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;</p>
+<p>Vivamus consectetur fermentum lorem. Phasellus blandit enim sapien, ut dignissim sem luctus non. Pellentesque pellentesque risus a cursus ultricies. Donec lacinia, orci vitae malesuada tempus, augue elit vulputate leo, eu porttitor turpis ipsum eu augue. Mauris interdum ex a magna ultricies luctus. Phasellus at molestie enim. Morbi accumsan dolor eget magna cursus, sit amet interdum massa tristique. Aliquam purus risus, convallis ut blandit quis, porta vel turpis. Donec nec nisi lectus.</p>
+<p>Mauris ut mi at urna efficitur molestie. Nunc vestibulum ex non volutpat dapibus. Donec ut felis justo. Aenean molestie, neque quis pulvinar aliquam, tortor erat varius nibh, nec faucibus tellus urna sed velit. Proin gravida sagittis nisi ut porta. Mauris quis lorem a est varius venenatis. Pellentesque id egestas lacus. Praesent vestibulum accumsan leo, a malesuada elit dictum vestibulum. Fusce ut ante dui.</p>
+<p>Morbi volutpat mattis diam sit amet viverra. Curabitur elementum molestie nulla, quis consectetur mauris. Praesent purus quam, sagittis vitae sem id, sollicitudin bibendum nunc. Nam tempus orci velit, sed lacinia dui placerat a. Donec convallis luctus iaculis. In in urna quis ipsum pharetra auctor. Sed sollicitudin ipsum sit amet tortor accumsan viverra. Pellentesque pharetra nunc vitae quam malesuada malesuada. Pellentesque dolor lectus, consectetur ut tincidunt sed, ultrices nec neque.</p>
+<p>Phasellus scelerisque velit et nisl faucibus tincidunt id at augue. Morbi laoreet tristique ante, eget interdum lorem pellentesque at. Aliquam erat volutpat. Etiam nec metus id ex lobortis mattis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras leo nulla, rutrum ac sollicitudin non, dapibus at nibh. Proin vitae laoreet mi, sed consectetur tortor. Pellentesque facilisis a purus eu faucibus. In tempor risus nec semper rhoncus. Morbi in fermentum dolor, id ultrices felis. Curabitur convallis mollis neque eu posuere. Pellentesque vitae laoreet nibh. Nam finibus laoreet neque, vitae iaculis nulla venenatis a. Integer facilisis viverra urna, id maximus arcu rhoncus nec. In hac habitasse platea dictumst. Curabitur consequat, ligula ac luctus malesuada, tortor eros pretium arcu, scelerisque commodo leo nisi eu arcu.</p>
+<p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla facilisi. Morbi at nunc nec metus molestie vestibulum. Morbi facilisis tristique sodales. Donec faucibus, risus pellentesque imperdiet aliquam, dui turpis molestie lacus, eu maximus enim nisi eu massa. Duis tempor elit a nibh fermentum tincidunt. Etiam vitae justo lobortis, pellentesque elit non, convallis nisi. Donec sed rhoncus tortor, sed imperdiet dolor. Donec bibendum bibendum accumsan. Ut sagittis feugiat nisl ut tempor. Donec vitae tortor eget quam egestas rhoncus.</p>
+<p>Sed sit amet dictum metus. Curabitur dictum nec justo id fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec tristique eros at felis vehicula lobortis eget vitae nunc. Integer elementum viverra tortor, sed commodo leo dapibus a. Morbi quis lorem id erat vulputate pulvinar ut at sapien. Aenean vitae elementum velit. Donec vel justo et ipsum cursus interdum eu eu nisi. In malesuada convallis mauris, sed mollis lacus sagittis ut. Vestibulum consequat arcu metus.</p>
+<p>Donec posuere mauris ante, non placerat lacus lacinia non. Aliquam porttitor diam sed ligula vestibulum luctus. Pellentesque nec dolor eu quam fermentum dictum. Mauris hendrerit elit nec eros rhoncus fringilla. Nunc vitae odio eu odio luctus malesuada at eu arcu. Nam dapibus nec magna id cursus. Donec feugiat vitae ante sit amet pellentesque. Donec finibus, orci et feugiat viverra, dui odio rutrum risus, eget faucibus magna ante id libero. Ut sodales metus arcu, eu placerat quam venenatis id. Ut enim lacus, accumsan in ligula sed, fermentum dapibus metus. Proin faucibus, lacus at congue pellentesque, est nunc vehicula urna, vel dignissim tellus justo in turpis. Vestibulum in lorem id eros ullamcorper gravida id non velit.</p>
+<p>Duis pretium ipsum ante, et vulputate ante aliquet eget. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse convallis blandit consequat. Nulla imperdiet turpis non magna ultricies, eu bibendum ante consectetur. Maecenas tortor purus, consequat id lectus id, porttitor auctor urna. Fusce ut mollis ex, ac feugiat est. Suspendisse ultricies quam enim, et dictum velit dictum vel. Fusce vel arcu lacinia purus ornare sodales vitae sed orci. Praesent vestibulum tortor eget ante sodales auctor. Morbi faucibus erat diam, a elementum velit vulputate vitae. Aliquam tincidunt vel eros in mollis. Ut mattis est non eros pretium, non gravida lacus faucibus. Donec posuere nec nulla eget lacinia. Vivamus tristique commodo metus, in cursus risus blandit a.</p>
+<p>Maecenas eleifend quam eros, nec fringilla quam lobortis ac. Suspendisse sem tortor, condimentum et lectus ut, consectetur volutpat lectus. Vivamus maximus orci at enim facilisis semper. Proin et commodo felis. Aenean vel interdum risus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum bibendum suscipit leo id imperdiet. Pellentesque volutpat odio dui, eu congue sem sagittis scelerisque. Cras nibh velit, commodo a quam hendrerit, convallis fermentum nisl. Donec pellentesque augue a tortor scelerisque varius. Nullam vel massa imperdiet, eleifend nulla efficitur, molestie augue. Vivamus hendrerit aliquam sapien, ut venenatis enim bibendum et. Duis at gravida dui, et accumsan nunc. In quis ullamcorper lacus. Ut cursus, odio vel ultricies vestibulum, leo tortor sollicitudin ipsum, ut luctus ipsum est ac ante.</p>
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vel nunc hendrerit aliquam. Nam mollis in metus porta ultricies. Suspendisse potenti. Sed venenatis, orci et egestas facilisis, lorem lorem porta felis, sed tempus erat nunc vitae nisl. Cras consectetur odio at lorem rhoncus pellentesque. Phasellus nec dolor vulputate, hendrerit lorem sit amet, placerat lectus. Etiam a libero laoreet justo ornare dictum. Proin a ligula ac leo luctus pretium. Suspendisse potenti. Morbi dictum laoreet libero, et laoreet augue accumsan eget. Nullam enim tortor, ultricies eu sagittis non, consequat sed lacus. Nulla luctus suscipit faucibus. Praesent ultrices non lectus a vulputate. Sed varius ante ac dui volutpat consequat. Interdum et malesuada fames ac ante ipsum primis in faucibus.</p>
+<p>Suspendisse blandit nisl sem, non tempor justo ullamcorper et. Curabitur ut mauris ultricies, cursus lectus at, semper ligula. Praesent a sodales augue. Nam quis rhoncus augue. Integer eros nulla, facilisis sed ligula vel, eleifend hendrerit elit. Donec sollicitudin sem mauris, nec laoreet mauris interdum id. Donec consequat vitae lorem at tincidunt. Integer sagittis, risus eget interdum dictum, augue nisl imperdiet sapien, a fringilla libero urna non ligula. Vestibulum rhoncus, dui id finibus fermentum, orci leo rhoncus ante, vel maximus turpis ante pretium diam. Quisque euismod enim ipsum, quis blandit tortor posuere ut. In hac habitasse platea dictumst. Sed sed auctor ex. Sed semper, purus quis ornare faucibus, ante lectus commodo ligula, eget accumsan justo magna lacinia nisi. Donec egestas cursus erat vel porttitor.</p>
+<p>Sed sed ex nec ligula aliquet dignissim at eu lacus. Mauris tincidunt lorem ac ipsum aliquet volutpat. Integer ipsum purus, volutpat nec orci eget, suscipit egestas sem. Praesent sagittis sagittis nunc, quis tristique ex facilisis eu. Aliquam eu ligula non libero posuere euismod. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam commodo semper augue ac semper. Pellentesque in ornare libero, at iaculis purus. Donec ante nisi, malesuada eu scelerisque eu, sodales ac arcu. Aenean et semper massa, et fringilla diam.</p>
+<p>Vivamus semper vel elit quis hendrerit. Morbi sollicitudin sapien non lacinia faucibus. Maecenas tincidunt ac felis sed egestas. Nulla convallis nibh sit amet leo venenatis vehicula. Mauris ornare metus at lacus feugiat volutpat. Donec tincidunt aliquam facilisis. Nulla vestibulum lacinia rhoncus. Duis ex augue, pharetra sed venenatis ut, rhoncus ac lorem. Quisque ut tincidunt sem, ut cursus mauris. Sed convallis condimentum luctus. Praesent ex purus, bibendum vitae mauris eu, semper suscipit dolor.</p>
+<p>Morbi nec mattis mi. Praesent sodales nunc dui, sit amet commodo purus maximus in. Proin auctor, libero id vehicula hendrerit, ante urna commodo diam, vitae bibendum nisl velit eget tortor. Mauris sodales augue ut consequat tempus. Donec sagittis nisi velit, vel convallis mauris cursus at. Phasellus eu egestas magna. Donec nibh lorem, placerat id lacus at, fringilla feugiat turpis. Quisque euismod mattis tortor et faucibus. Nullam vitae eros interdum, rhoncus risus ut, rhoncus mauris. Pellentesque at massa diam. Aenean eu felis eu eros porttitor bibendum. Ut iaculis ipsum massa, vel fringilla mauris facilisis id. Aenean justo lacus, interdum sit amet facilisis id, sagittis et justo. Curabitur et ligula mi. Pellentesque commodo, urna et vulputate scelerisque, magna mauris dictum lacus, ac accumsan lorem urna dapibus est. Suspendisse mollis commodo ipsum ac laoreet.</p>
+<p>Vestibulum vitae turpis enim. Maecenas ut tincidunt dui. Pellentesque sit amet faucibus enim. In hac habitasse platea dictumst. In malesuada, magna at dapibus convallis, metus diam faucibus nulla, id maximus felis ex at purus. Phasellus consequat pharetra nunc, et vestibulum ligula ultricies in. Morbi luctus nisi eros, ac sollicitudin metus egestas eu. Sed condimentum nibh in ullamcorper malesuada. Aliquam erat volutpat. Morbi tristique imperdiet augue quis porta. Curabitur elementum euismod turpis, id sagittis purus pretium nec. Ut lectus magna, tempor sit amet efficitur vel, maximus ac nulla. Suspendisse sit amet libero libero. In rutrum nunc sit amet metus facilisis, vitae interdum felis pulvinar. Sed in mauris ipsum.</p>
+<p>Ut ac molestie quam. Suspendisse condimentum cursus accumsan. Aliquam quis libero luctus nisi venenatis ullamcorper. Quisque massa neque, sagittis et rutrum nec, pulvinar quis sem. Vestibulum consequat euismod erat, sit amet feugiat ante hendrerit quis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in dolor porta, tristique nisl eget, consectetur nibh. Phasellus et lacinia urna. Sed convallis tellus eget laoreet faucibus. Phasellus id posuere justo.</p>
+<p>Proin a erat elementum arcu consequat pellentesque. Ut vehicula ante et lorem imperdiet, at viverra elit bibendum. Phasellus egestas vel turpis non porta. Maecenas imperdiet ornare posuere. Cras elit metus, congue sit amet libero dictum, hendrerit dictum dolor. Vestibulum rutrum, nisl sit amet gravida tincidunt, ligula ligula facilisis sapien, eget ullamcorper lorem elit sit amet nulla. Suspendisse finibus metus et felis consequat, quis iaculis massa mollis. Cras fermentum, purus ac maximus luctus, libero lectus interdum lorem, nec dapibus orci eros at turpis. In vestibulum vestibulum lectus, nec lobortis mauris vestibulum id. Suspendisse potenti. Pellentesque sit amet interdum purus, quis elementum neque. Aliquam sit amet libero eu odio porta aliquam a in enim.</p>
+<p>Nam id blandit ligula, nec mattis turpis. Donec rutrum libero non mi ornare commodo. Donec pellentesque, neque non mattis ornare, eros velit dictum sapien, vitae pulvinar nunc odio nec ipsum. Quisque suscipit vitae nisi id varius. Vivamus sollicitudin, enim ornare vestibulum eleifend, erat nunc accumsan augue, quis varius ligula sapien ut lectus. Integer nunc massa, convallis in dictum tristique, rutrum sit amet ex. Nam ex diam, lacinia quis imperdiet sed, sollicitudin in arcu. Phasellus condimentum convallis tellus vitae maximus. Mauris sit amet est eros. Nulla eu quam vehicula, malesuada metus id, dignissim felis. Aenean at orci non mi pulvinar mattis. Ut a venenatis massa, nec tempor neque. Quisque condimentum, neque eu consequat congue, eros orci tincidunt ante, ac vestibulum sapien eros et eros. Fusce convallis imperdiet congue. Suspendisse sit amet lorem eu ligula accumsan blandit. Etiam et massa vel dui accumsan rutrum a quis elit.</p>
+<p>Nunc dapibus magna id lorem posuere, a pellentesque urna cursus. Pellentesque eu turpis nunc. Praesent dictum velit tincidunt leo sodales, sit amet malesuada lacus feugiat. Nullam quis sem ex. Donec at egestas mi, sit amet cursus orci. Phasellus enim nunc, volutpat vel velit ac, commodo condimentum diam. Quisque sed porta nunc. Morbi accumsan lectus mi, sed cursus sem lacinia sed. Sed varius risus condimentum ante venenatis, a maximus urna mattis. Phasellus aliquam leo sollicitudin enim bibendum elementum. Aliquam erat volutpat.</p>
+<p>Maecenas ex arcu, pulvinar sed accumsan vitae, egestas in lorem. Morbi nec tempus ligula, eget ultrices ligula. Nam ut metus orci. Curabitur venenatis nisi luctus, molestie elit ut, malesuada lorem. Duis ac dolor convallis, pretium enim quis, bibendum ligula. Cras eu feugiat nunc. Nulla ut dignissim justo. Donec id nunc quis arcu accumsan laoreet quis vel enim. Maecenas at leo facilisis, laoreet sapien at, iaculis lorem. Sed quis congue ex, vel consectetur nisi. Maecenas ut auctor tellus. Etiam venenatis arcu eget augue tempus scelerisque.</p>
+<p>Cras consectetur volutpat consequat. Phasellus nec lectus mollis ex dignissim porta id eget dolor. Cras vulputate bibendum mollis. Pellentesque ornare, purus nec pellentesque egestas, est mi convallis tortor, quis consectetur quam diam sit amet mi. Donec ut consectetur sem. Pellentesque ut nibh ut ipsum rutrum venenatis sed quis purus. Mauris eleifend odio sit amet enim interdum tempus. Morbi quis elit sit amet nisl aliquam sagittis. Nulla a lacinia augue. Donec mattis pharetra bibendum. Sed pellentesque sed sapien at consectetur.</p>
+<p>Vivamus velit velit, ullamcorper id fringilla a, sagittis ac elit. Vivamus at dui sed arcu hendrerit dictum. Aenean gravida cursus tortor. Fusce fermentum enim quam, nec mattis tellus sollicitudin suscipit. Curabitur vitae mauris sodales, congue odio ac, accumsan tellus. Mauris aliquam pulvinar mi sit amet ultrices. Morbi sodales nulla in risus vulputate, ac condimentum lorem sodales. Integer dapibus aliquam sem eget suscipit. Praesent pellentesque magna vel viverra maximus. Vivamus eget eleifend dui. Vestibulum ut egestas erat.</p>
+<p>Duis tincidunt porttitor leo, non vestibulum neque mattis id. Fusce lectus ipsum, sagittis eu luctus sit amet, luctus et orci. Donec commodo pulvinar erat, at eleifend sem ultricies vitae. Nullam nec nibh at lorem pretium eleifend et at tellus. Nam laoreet mauris nec lacus sodales, sit amet aliquet quam elementum. Cras sollicitudin molestie ex vitae sollicitudin. Donec mollis accumsan dui, eget facilisis turpis suscipit eget. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis in tempus leo.</p>
+<p>Nulla enim arcu, rhoncus vel magna iaculis, facilisis vestibulum mi. In hac habitasse platea dictumst. Sed ut convallis sapien, eu aliquet arcu. Mauris non augue eget magna gravida dignissim. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam vitae consequat purus. Ut consequat magna et dui aliquet, ac mattis metus ullamcorper.</p>
+<p>Nunc ac dui id lacus volutpat imperdiet. Nullam tempor dolor quis dui venenatis, ac consectetur nunc ultricies. Fusce suscipit felis nec porttitor placerat. Donec lobortis suscipit lectus. Nulla nunc urna, congue non nibh sit amet, lacinia elementum orci. Praesent molestie, nunc eget vestibulum convallis, magna sem scelerisque velit, sed vehicula elit mauris et est. Phasellus sed arcu eget massa blandit eleifend eget sit amet ante. Duis malesuada pulvinar ligula in ultrices.</p>
+<p>Aliquam quam leo, venenatis ut lorem id, dapibus porttitor metus. Quisque id nunc sed metus tempus tincidunt eu vel ex. Pellentesque volutpat laoreet lacus, vitae tincidunt justo auctor at. In feugiat condimentum risus, et lobortis velit auctor quis. Sed tempus felis congue nibh feugiat imperdiet. Ut hendrerit aliquam orci nec viverra. Nullam at quam cursus, efficitur felis sed, cursus sapien. Curabitur pulvinar libero quam, eu pellentesque nisi scelerisque non. Quisque at sem eget turpis porttitor aliquam posuere eget diam. Curabitur vel sapien accumsan eros viverra euismod non id leo. Sed tempus scelerisque libero sit amet molestie. Duis non massa semper, luctus turpis vel, venenatis quam.</p>
+<p>Etiam interdum nisl nisl, et euismod est viverra eget. Phasellus sollicitudin dictum mi, nec interdum quam euismod non. Suspendisse tempus eros in elit dapibus, a luctus felis eleifend. Morbi eu sem id massa posuere tincidunt. In suscipit metus at felis sagittis, vel consectetur sapien aliquet. Suspendisse gravida, mi ornare sollicitudin consectetur, odio odio viverra ex, non pharetra nulla nunc et mi. Cras tristique neque a ipsum egestas lobortis. Ut convallis ex tellus, et eleifend nunc lobortis a. Sed consectetur ligula quis quam fringilla imperdiet. Quisque quis lectus eget odio eleifend vestibulum et vel risus. Integer a enim ac nulla posuere porta eu sed enim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer consectetur arcu dolor.</p>
+<p>Sed molestie bibendum nulla vel tincidunt. Sed accumsan convallis sapien, ut dapibus lectus aliquam ac. Aliquam ut erat a ligula consectetur placerat et at enim. Quisque eu ligula dictum, dictum sem nec, eleifend tortor. Nunc at lectus libero. Curabitur suscipit urna nec urna dapibus facilisis. Quisque suscipit quam non tortor bibendum congue. Aliquam at eros eleifend, tempor enim quis, vestibulum arcu. Phasellus mattis tempor massa, id tempor nisl maximus nec. Quisque ut tellus ornare, rutrum leo non, convallis mi. Aenean ullamcorper eros sed mauris condimentum dictum. Nulla posuere sapien ac nisl accumsan, consectetur imperdiet massa vulputate. Curabitur at lectus tincidunt, commodo ante id, hendrerit libero. Proin pellentesque tristique lobortis. In rhoncus metus quis laoreet tempus. Vestibulum fermentum at felis id lobortis.</p>
+<p>Nullam congue iaculis nisl. Fusce fringilla purus ut felis euismod, ut venenatis ex aliquam. Ut fringilla, erat quis mollis tempor, metus mauris pharetra nunc, id molestie turpis eros a velit. Morbi lorem lectus, sagittis aliquam tellus a, tempus tincidunt libero. Quisque sollicitudin tempor hendrerit. Curabitur auctor finibus ante ac vulputate. Nunc imperdiet diam eget urna viverra, eget tincidunt justo sagittis. Morbi finibus sollicitudin consectetur. Maecenas luctus maximus diam et egestas. Donec volutpat malesuada interdum. In hac habitasse platea dictumst. Nunc metus nisl, eleifend sit amet posuere in, fringilla a leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum eu iaculis diam, nec vulputate libero. Nulla nulla est, lobortis et tincidunt sagittis, pellentesque quis ipsum. Aenean consequat et nulla non malesuada.</p>
+<p>Phasellus ac ipsum at diam tincidunt elementum vel et quam. Maecenas non tempus ante, id congue erat. Fusce vel lacus blandit, elementum mi et, ultricies erat. Phasellus quis nibh sodales elit rutrum rutrum ut id elit. Aliquam odio tellus, sagittis vitae orci eget, ultrices lobortis ipsum. Morbi cursus efficitur est, in auctor sem dapibus non. Donec viverra imperdiet velit vitae molestie. Duis efficitur neque a congue dignissim. Mauris sit amet massa laoreet risus elementum cursus. Phasellus id mi vel velit varius pellentesque at vitae sapien. Fusce augue quam, gravida et neque tincidunt, vulputate lobortis magna. Etiam lorem purus, iaculis vel tempus quis, tempus eget arcu. Donec ac dui eget nunc facilisis pharetra.</p>
+<p>Nulla tincidunt quis elit quis lacinia. Nulla facilisi. Aliquam tincidunt iaculis est, sed pulvinar diam convallis non. Nulla sodales arcu ac rhoncus tristique. Maecenas at posuere diam. Pellentesque cursus nisi quis sapien scelerisque finibus. Mauris id tortor sed erat pellentesque convallis. Quisque fermentum sapien diam, eu convallis mauris tincidunt sed. Ut semper aliquam volutpat. Integer ut convallis diam, et consequat lectus. Cras quis mauris convallis dui dignissim efficitur vel in nisi. Nam lobortis mattis massa, eu sodales lorem iaculis nec. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam gravida lectus sit amet ullamcorper pellentesque. Nam in sem quis purus sollicitudin suscipit. Proin sit amet congue ante.</p>
+<p>Aenean tempor urna a quam ornare facilisis. Aenean blandit, sapien a vehicula pharetra, ligula nibh auctor odio, sed rhoncus justo tortor et velit. Ut ante magna, fermentum eu tristique rhoncus, ornare non ipsum. Nunc accumsan nibh ut nisi euismod sollicitudin. In sed neque condimentum libero gravida mattis. Aliquam nisi est, blandit et eros ut, venenatis volutpat nunc. Etiam suscipit mauris a vestibulum eleifend. Vestibulum at mattis mauris. Pellentesque ut tortor nisl. Curabitur eget elit ligula. Duis egestas luctus nulla, at pretium metus ornare vel. Fusce suscipit libero quis odio sollicitudin, eu elementum elit efficitur. Nam vel interdum ipsum.</p>
+<p>Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque id iaculis tortor. Nam at sapien nunc. Quisque accumsan nunc enim, commodo vulputate mi accumsan quis. Praesent ac efficitur eros. Quisque viverra, mi eget commodo ornare, ex enim viverra quam, luctus eleifend arcu mi ac augue. Phasellus in placerat nibh, vel congue turpis.</p>
+<p>Ut nec viverra nulla. Maecenas vitae mollis neque. Nam et libero laoreet, aliquet nisl vel, pulvinar eros. Praesent dapibus felis ligula, et blandit sapien mollis sit amet. Proin vehicula erat consectetur euismod convallis. Maecenas luctus elit lorem, ut aliquet ex bibendum id. Sed ullamcorper lectus turpis, in convallis libero pulvinar ac.</p>
+<p>Phasellus ut porttitor velit, at blandit dolor. Vivamus eu neque vitae orci tincidunt blandit. Cras tincidunt ac lorem non ornare. Nullam pretium rutrum turpis. Fusce tincidunt mauris pretium, vestibulum ligula sed, facilisis mi. Ut risus neque, interdum in pharetra eget, blandit vel mi. Etiam vulputate risus eleifend eros aliquam, vitae porttitor justo mattis. Duis mi elit, porta eu nulla at, auctor auctor urna. Ut gravida arcu diam, non facilisis metus auctor at. Mauris at purus est. Ut vitae dolor augue. Duis nec metus elementum, pretium magna consequat, iaculis augue.</p>
+<p>Vestibulum cursus nisi sed nisi auctor, eu finibus mi facilisis. Ut scelerisque sapien vel rhoncus posuere. Ut ultricies aliquam massa eu gravida. Nulla pharetra massa eget rutrum mattis. Praesent id suscipit magna, non vestibulum ex. Vestibulum a risus non odio semper vulputate ut vitae felis. Fusce in viverra arcu. Vestibulum pellentesque augue quis dapibus venenatis.</p>
+<p>Sed gravida ut erat ornare placerat. Praesent tristique scelerisque magna. Praesent tincidunt elit quam, ac sollicitudin felis ultrices accumsan. Suspendisse at ligula et justo fermentum ultricies eu et risus. Quisque vehicula commodo risus, quis dapibus diam volutpat ut. Duis blandit, diam id fringilla posuere, neque tortor pulvinar nunc, et pretium lorem enim in libero. Vivamus posuere risus non tempus dignissim. Maecenas quis tincidunt nunc, vitae blandit velit. Integer hendrerit fringilla odio in posuere. Curabitur a mi facilisis, condimentum urna sed, lacinia ligula. Fusce faucibus justo mi, sed posuere turpis maximus ut. Donec gravida purus velit, vitae tincidunt orci pharetra ac. In posuere luctus suscipit. Vivamus nec dui pulvinar, ultricies urna commodo, fringilla lorem.</p>
+<p>Vestibulum placerat arcu at feugiat varius. Phasellus vel lorem faucibus, scelerisque elit vel, ultrices dolor. Maecenas erat mauris, elementum ut lectus sit amet, maximus ultricies urna. Phasellus justo turpis, posuere vitae elementum vitae, venenatis quis nulla. In hac habitasse platea dictumst. Duis tempor lobortis lorem, at interdum nisi ullamcorper vel. Etiam eget posuere tellus. Fusce venenatis imperdiet rutrum. Vivamus tempus est libero, aliquam venenatis ante feugiat sed. Suspendisse tortor purus, venenatis et maximus sed, pretium hendrerit odio. Nam quis mauris non massa pretium aliquam. Aliquam quis efficitur lorem, eget efficitur turpis. Nunc sit amet finibus nunc.</p>
+<p>Mauris ut augue dui. Donec malesuada ipsum ac dolor accumsan aliquam. Vivamus ullamcorper, sapien eu vestibulum dictum, sem enim molestie urna, volutpat porta nunc orci sit amet augue. Aliquam velit purus, hendrerit at ultricies in, semper vitae metus. Aenean efficitur eu nisl sed tincidunt. Ut ac nulla sit amet justo finibus pellentesque eu non elit. Aliquam varius est non venenatis placerat. Maecenas finibus pulvinar ipsum non consectetur. Curabitur ornare semper ligula, id ultrices nibh pharetra at. Nunc lobortis purus non tellus vehicula interdum. Vivamus nec interdum quam, ut pellentesque nibh. Quisque gravida eros a mauris dictum, sed tempor nisl consequat.</p>
+<p>Maecenas malesuada nisl at mattis viverra. Quisque facilisis id purus ac dignissim. Proin ac vehicula mauris. Curabitur sit amet mollis eros, eu maximus justo. Phasellus dictum ultricies massa condimentum ornare. Nunc eget arcu et tortor ornare sodales pellentesque vel nulla. Etiam semper, augue a bibendum dapibus, est purus accumsan orci, a tincidunt leo metus sit amet neque. Nulla aliquet nunc a varius malesuada. Duis eu porttitor velit, quis vulputate lorem.</p>
+<p>Duis fringilla augue arcu, a laoreet erat lobortis sed. Morbi interdum volutpat tellus, dignissim fermentum justo. Pellentesque ac molestie dui, vitae sollicitudin justo. Phasellus gravida nulla ac tortor ullamcorper, vel lobortis tellus consectetur. Curabitur eu nibh at dui pharetra luctus quis ut purus. Quisque et erat dignissim, fermentum lectus nec, hendrerit magna. Ut maximus, diam eget efficitur ornare, justo augue convallis metus, at condimentum nisl mauris ut nisi. Proin iaculis est purus, a ullamcorper diam imperdiet ut. Etiam non elit a tortor congue tempor vitae quis odio. Duis rutrum, tellus commodo condimentum consequat, risus nisl accumsan augue, a eleifend nibh velit vel turpis. Pellentesque dolor odio, lacinia et porta vel, sodales sed leo. Nulla maximus lorem eget elit pulvinar iaculis. Phasellus et eleifend purus. Aliquam ac nunc ut est faucibus facilisis.</p>
+<p>Vivamus eget nibh consectetur velit condimentum volutpat. Sed sit amet maximus enim. Sed vitae dictum turpis. Ut volutpat diam id elit gravida, id sollicitudin metus porta. Nam sollicitudin ligula eu leo interdum egestas. Nulla ut neque placerat, suscipit massa ac, consectetur diam. Aliquam a ligula sit amet enim porttitor fringilla. Curabitur sed interdum diam, at auctor ex. Proin vestibulum mi eu velit ultricies suscipit eu eget elit.</p>
+<p>Vivamus laoreet lorem et urna tempor, ac consequat mauris scelerisque. Vivamus ac tellus et metus viverra suscipit vel vitae ipsum. Vivamus lobortis quis lectus vitae bibendum. Mauris consequat erat quam, id accumsan augue vestibulum ac. Fusce egestas lacinia libero. Sed erat ante, maximus eget facilisis vitae, viverra non diam. Nunc eu lectus id ante rhoncus suscipit. Etiam placerat lectus id sem finibus, interdum luctus justo tincidunt. Nam vel facilisis sapien, a tristique dui. Suspendisse in elementum dolor. In hac habitasse platea dictumst. Pellentesque bibendum, est eu scelerisque porta, nisi ligula hendrerit risus, nec scelerisque quam leo in mauris. Suspendisse rutrum, nisl at volutpat imperdiet, urna dui consectetur sem, eu iaculis metus urna et augue. Nulla lacus tellus, auctor sed vulputate in, tristique vel justo.</p>
+<p>Aenean ex ex, luctus nec pellentesque consectetur, luctus et metus. Quisque vel nisl eros. Curabitur nisi massa, congue ac ullamcorper ullamcorper, placerat ut ligula. Mauris ornare suscipit lacinia. Phasellus efficitur lacus eget turpis tincidunt ultrices. Proin condimentum posuere fringilla. Pellentesque non est feugiat, dapibus erat sit amet, dapibus arcu. Vivamus lacinia viverra bibendum. Donec sit amet pharetra ligula. Cras sed bibendum velit. Aenean eu purus nulla. Cras porttitor elementum lorem, ac elementum risus egestas vel. Integer ultrices nisi sit amet dolor efficitur luctus.</p>
+<p>Etiam tempus dui vitae nunc lobortis tristique. Vestibulum quis rhoncus mi. Donec ac justo sit amet leo sodales consequat posuere ut neque. Pellentesque gravida vestibulum congue. Pellentesque non est tellus. Vivamus luctus convallis faucibus. Fusce eget bibendum lacus. Cras ullamcorper, diam et tristique malesuada, nibh orci placerat ex, at porttitor leo metus non neque. Aliquam mattis dui ex, at porttitor nulla vehicula vitae.</p>
+<p>Nunc at enim sit amet purus euismod venenatis. Nulla elementum pharetra rutrum. Vivamus aliquam neque non ante rhoncus, eget efficitur enim tristique. Nullam mattis quam id augue rhoncus, a luctus dolor dictum. Fusce ut sagittis arcu, eu tristique lorem. Praesent varius facilisis libero vel gravida. Vivamus eget massa ipsum. Aliquam quis imperdiet justo, ac finibus enim. In hac habitasse platea dictumst. Morbi scelerisque nisl ac urna euismod eleifend. Curabitur condimentum mi eu aliquam viverra.</p>
+<p>Fusce molestie augue sed leo efficitur eleifend. Donec volutpat, quam in pellentesque finibus, tortor lacus aliquet quam, nec vestibulum nibh magna cursus metus. Aliquam tristique placerat velit, et tempor felis ultricies gravida. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque est sapien, pretium sed massa eleifend, hendrerit vestibulum metus. Cras placerat tellus a ornare sollicitudin. Vestibulum luctus viverra gravida. Vestibulum eget eros ac mauris fermentum gravida. Nam ante lectus, ullamcorper at nibh vel, dapibus congue sem. Sed condimentum finibus tincidunt. Suspendisse ullamcorper efficitur massa, sit amet eleifend neque finibus sit amet. Proin viverra mauris laoreet mi volutpat, maximus rhoncus nisi molestie. In urna erat, placerat et sem in, maximus convallis massa.</p>
+<p>Integer efficitur sem rhoncus, maximus ipsum eu, posuere velit. Nam nunc leo, dapibus at posuere eu, malesuada eget metus. Aenean mattis erat a metus viverra fringilla. Duis ac turpis ante. Etiam tempus sagittis lectus, eu rhoncus nibh. Duis ac laoreet mauris, vitae sodales orci. Morbi efficitur mauris ligula, a accumsan massa pellentesque in. Nam nisl justo, lacinia at sapien sed, elementum commodo eros. In quis enim erat. Quisque non pulvinar dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin eget dui mauris. Sed nec tincidunt sapien. Nunc ac dictum est. Etiam faucibus pulvinar neque, sed sollicitudin nibh efficitur nec.</p>
+<p>Etiam eu nisl sapien. Maecenas non tortor efficitur, vehicula ex ac, maximus velit. Aenean at blandit libero. Proin luctus felis massa, a rutrum neque rutrum ut. Donec consequat ac arcu et mattis. Nunc dapibus lectus neque, non posuere leo consequat eget. Ut vehicula auctor massa at porttitor. Vivamus feugiat erat lacus, eu finibus diam egestas vitae. Suspendisse nec lacus nec tortor posuere pulvinar ut in nibh. Praesent ullamcorper, elit vitae ullamcorper egestas, nisi nibh maximus ex, at sollicitudin quam felis nec neque. Pellentesque vehicula nec elit sagittis imperdiet. Suspendisse potenti. Nulla aliquam, libero vitae pretium scelerisque, sem diam condimentum erat, id tincidunt leo ante non risus.</p>
+<p>Nulla in neque sodales, porta dui ac, rutrum mauris. Aliquam a tellus est. Proin a risus volutpat, ultricies metus vitae, accumsan erat. Sed et volutpat mauris. Sed lacinia leo et libero luctus ultricies. Nam commodo odio mi, non aliquet magna fringilla sed. Quisque tincidunt sed ex eget fermentum. Cras vel imperdiet diam. Integer aliquet malesuada faucibus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce laoreet nulla odio, sed maximus nulla placerat ac. Donec viverra dictum semper. Ut sed tellus eu ligula porttitor scelerisque vitae vitae erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris eget lacus neque. Proin a tortor nec odio vestibulum molestie.</p>
+<p>Phasellus vitae urna sed libero ultricies feugiat. Duis quis orci eget lorem porttitor sollicitudin nec ac mauris. Donec non nibh eget nisl cursus posuere. Aenean fermentum urna tincidunt elementum venenatis. Donec iaculis nec lectus vitae sagittis. Praesent in mauris dignissim lectus eleifend luctus. Integer facilisis, mauris vitae venenatis semper, orci metus hendrerit risus, sit amet semper risus augue vitae enim. Nam egestas sollicitudin mi, eget vehicula turpis molestie non. Sed tempus lectus non iaculis bibendum. Integer elit magna, aliquam eget sollicitudin et, imperdiet in nisi. Morbi libero odio, consectetur eget egestas non, interdum et ante. Sed malesuada vulputate elit et consectetur. Curabitur venenatis eget augue nec blandit. Donec cursus sollicitudin molestie. Phasellus tincidunt tortor ac elit luctus pellentesque.</p>
+<p>Maecenas faucibus a arcu id dapibus. Proin ac leo sollicitudin, lobortis lorem vitae, luctus tellus. Nullam eget facilisis mi. Vivamus faucibus est id augue ullamcorper, eget tempus quam pellentesque. Duis varius auctor sem sed laoreet. Praesent tincidunt justo quis consectetur sollicitudin. Quisque ut placerat felis. Praesent in eros a nunc pulvinar luctus vitae ut lectus. Donec posuere porttitor nisi sed vulputate. Proin neque nulla, egestas nec justo sed, tempus maximus metus.</p>
+<p>Phasellus nec nunc malesuada, porttitor ipsum ut, aliquet velit. Nam sed nisi orci. Mauris vel orci id elit tristique ullamcorper. Curabitur a arcu a elit imperdiet cursus. Vestibulum lectus orci, semper at posuere a, gravida at sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse nec consequat nisi, eu auctor justo. Etiam congue, ligula eget gravida mollis, purus dolor ultrices erat, sollicitudin pulvinar tortor nisl posuere lectus. Nunc consectetur velit scelerisque, mattis tortor non, fermentum tortor.</p>
+<p>Nam non magna condimentum, aliquam tortor sit amet, tristique nisi. Aenean nec feugiat odio, quis dictum libero. Maecenas ut viverra metus. Etiam diam turpis, ultricies sed ipsum et, pharetra lacinia risus. Vestibulum accumsan massa ante, sollicitudin luctus arcu tempus eget. Maecenas blandit eleifend venenatis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam imperdiet sem quis euismod efficitur. Pellentesque sagittis, ex a sagittis iaculis, risus sapien rutrum elit, eu congue enim dolor sit amet nisi. Sed a augue est. Curabitur varius lacus ut volutpat mollis. Cras id tortor sed nulla volutpat viverra vel ac nisl. Vivamus a ex arcu. Suspendisse ut bibendum elit, a ornare elit. Sed tempor nisl a dolor tincidunt tristique.</p>
+<p>Vivamus elementum consectetur massa a porttitor. Integer velit ex, cursus quis porttitor eu, imperdiet at erat. Integer fringilla sagittis enim ac pharetra. Ut ac ligula molestie, elementum libero id, convallis libero. Pellentesque eu tincidunt sapien. Aenean dignissim ligula vitae bibendum pellentesque. Praesent fermentum tempor augue in facilisis.</p>
+<p>Praesent laoreet ut mauris nec molestie. Curabitur ut leo arcu. Proin a augue id mi blandit pharetra id eu justo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam ac nunc purus. Integer consequat elit vel lectus feugiat facilisis. Curabitur eget faucibus urna. Aenean auctor quam ut ante ornare convallis. Morbi in rhoncus leo, in imperdiet lacus.</p>
+<p>Quisque maximus erat orci, id semper massa mattis vel. Vivamus ut hendrerit ex. Ut vitae sodales nisl. Nulla lacus urna, dapibus quis aliquam sit amet, laoreet id lectus. Nulla facilisi. Nulla aliquet, diam non sollicitudin pharetra, orci leo pharetra mi, ac malesuada nisl dui vitae justo. Curabitur suscipit efficitur tincidunt. Cras consequat vehicula ante, sed feugiat libero fringilla vel. Aenean tempor libero mi, sit amet malesuada velit sagittis tristique. Integer sed nisl purus. Donec nec ante lectus. Integer eleifend, leo ac vehicula volutpat, quam lacus faucibus massa, non fringilla dolor purus vel nulla. Vestibulum egestas, augue quis dictum rhoncus, lorem felis pellentesque urna, in rhoncus tellus magna quis metus. Cras elementum leo sed finibus efficitur.</p>
+<p>Donec feugiat iaculis lobortis. Maecenas eros magna, malesuada non luctus quis, placerat eget libero. Nulla vulputate felis gravida orci fringilla pellentesque. Nam at imperdiet ante. Cras in tempus dui. Sed vestibulum augue sit amet nisi convallis, nec commodo lacus laoreet. Donec commodo vulputate gravida. Praesent posuere lacus nec sapien posuere rhoncus.</p>
+<p>Pellentesque commodo mollis est sed sodales. Etiam rutrum lorem quis mi mollis, in scelerisque mauris rutrum. Nullam in pulvinar metus. Ut ullamcorper gravida iaculis. Proin nunc quam, pellentesque et luctus quis, hendrerit ut purus. Nulla vitae orci pharetra, ornare ex eget, fermentum velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed tempor nec nulla sed scelerisque. Vestibulum vel posuere arcu. Sed sed imperdiet diam.</p>
+<p>Sed facilisis efficitur mauris cursus consequat. Mauris fringilla bibendum justo ac tempor. Aliquam quis ultricies magna, id molestie lectus. Fusce mattis sapien a diam blandit, a tincidunt urna posuere. Sed dignissim maximus commodo. Phasellus fringilla efficitur quam, sit amet auctor felis. Nunc non porttitor erat, vel ultricies est. Etiam hendrerit id magna eu dictum. Quisque vulputate sem lacinia felis bibendum cursus. Donec tortor turpis, vestibulum et consequat quis, interdum sed est. Nulla ac laoreet mauris, ac lacinia neque. Duis vitae nibh leo. Cras sed odio vel odio luctus gravida et sed nisi. Nullam placerat vitae quam sit amet dignissim.</p>
+<p>Donec ullamcorper posuere nulla id placerat. Fusce tincidunt sapien et sem finibus, eu pharetra risus maximus. Fusce lobortis vitae risus ut viverra. In hac habitasse platea dictumst. Morbi tempus at turpis nec sodales. Nam venenatis erat eu aliquet finibus. Suspendisse vehicula nunc magna, non commodo nulla ornare ut.</p>
+<p>Fusce tellus nunc, pharetra sit amet auctor a, dapibus maximus leo. Integer ac quam risus. Etiam diam nibh, luctus eu hendrerit at, blandit ut neque. Aenean nunc eros, pulvinar ut tortor sit amet, mattis elementum eros. Morbi orci neque, porta ut est sed, convallis convallis ligula. Mauris libero augue, dignissim vel pulvinar non, accumsan at risus. Suspendisse potenti. Etiam id fermentum sem, varius efficitur libero. Etiam vestibulum accumsan metus, non pharetra ipsum dictum vel. Pellentesque sollicitudin vulputate lacus non lacinia. Integer placerat quam vitae blandit porttitor.</p>
+<p>Maecenas sit amet dui efficitur, auctor leo eget, malesuada nunc. Mauris vehicula sagittis nibh a convallis. Vivamus id tellus vestibulum, ultrices orci vel, scelerisque nisl. Morbi laoreet sit amet sem eget rhoncus. Aenean placerat leo quis ligula aliquet varius. Integer posuere, lacus sed ullamcorper convallis, sem eros sollicitudin nisl, vitae pharetra erat quam ut est. Vestibulum vitae velit vehicula, lacinia massa vel, suscipit ligula. Sed eget orci vel purus efficitur ullamcorper. Maecenas aliquet risus ligula, sed aliquet odio semper quis. Suspendisse euismod ac nisi id vehicula. In dapibus tempor risus, ac posuere orci aliquet ut. Ut tempus, nibh sed convallis consectetur, mi dui malesuada enim, et ultrices lacus ante ac purus. Ut sapien orci, tincidunt tristique ultrices eget, tempus a urna. Praesent eget elit mollis, blandit enim vel, fringilla tortor.</p>
+<p>Sed gravida felis eu urna porttitor pulvinar. Duis eget ligula eget augue sollicitudin tincidunt eu ut est. Suspendisse vitae sapien ornare, semper sem ut, lacinia ligula. Vestibulum varius quis mi ut mollis. Nullam pulvinar interdum mattis. Nunc consectetur felis sed ex imperdiet gravida quis in sem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque eget lectus erat. Sed laoreet posuere lacus ultrices lobortis. Aenean sit amet eros ligula. Ut dignissim accumsan odio quis aliquam. Fusce vitae porttitor urna. Donec id volutpat nisi. Cras mattis facilisis ultrices. Ut vitae dui in diam accumsan cursus sit amet quis massa. Donec finibus tellus eget pellentesque suscipit.</p>
+<p>Praesent imperdiet odio vel ante malesuada posuere. Fusce quis enim arcu. Donec eget aliquam elit, id sodales massa. Proin vel maximus purus, ut semper mauris. Nulla aliquet vel felis vel faucibus. Praesent malesuada velit vitae nulla tincidunt congue et quis sapien. Donec consectetur, tellus at fermentum mollis, nulla ante tincidunt felis, dapibus laoreet est arcu sit amet dolor. Etiam et suscipit purus, ut sagittis nunc. Sed vel ex enim. Cras facilisis leo at porta viverra.</p>
+<p>Curabitur hendrerit sit amet ipsum a luctus. Sed sit amet maximus nisi. Nulla bibendum placerat eros et ultrices. Nam hendrerit vitae felis sit amet aliquet. Nam in aliquet ante, quis rutrum massa. Duis massa felis, consequat ut risus id, vestibulum hendrerit sem. Nullam in sodales augue.</p>
+<p>Etiam erat odio, posuere et libero at, cursus pretium sapien. Mauris lectus massa, fermentum eget lacus porta, viverra semper nulla. Sed et ex id dui suscipit sollicitudin. Vestibulum eros sapien, efficitur id ipsum sit amet, efficitur semper enim. Etiam eget lacus quis mauris vestibulum iaculis eu et lorem. Quisque neque diam, viverra eu diam non, euismod eleifend mauris. Sed viverra eleifend est a euismod.</p>
+<p>Vestibulum at vehicula orci. Phasellus nec sollicitudin libero. Etiam commodo feugiat laoreet. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam eros nulla, pretium et efficitur at, iaculis a velit. Ut condimentum velit mi, nec dapibus mauris lacinia ut. Aenean porta porttitor pharetra. Vivamus convallis dapibus elit, et ultricies arcu sollicitudin eget. Mauris nunc diam, ultricies nec vehicula sed, elementum ac lacus.</p>
+<p>Nunc nec pulvinar nisl, ut tincidunt nisl. Nunc ultrices dignissim neque eget dignissim. Duis sed facilisis sapien, dapibus facilisis nulla. Morbi quis ligula ac tortor dictum ultricies. Morbi urna diam, varius quis elementum vel, mollis sit amet arcu. Vestibulum lobortis hendrerit purus a blandit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac aliquet lacus.</p>
+<p>Sed hendrerit rutrum lorem quis consequat. Ut elementum, urna ullamcorper bibendum rutrum, risus nisl ultricies turpis, convallis finibus lorem felis nec erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus eget lectus id orci iaculis fermentum non sit amet enim. Nulla cursus ultricies dolor id posuere. Sed sed erat non enim venenatis mollis. Cras bibendum eros massa, vel tempus tortor sollicitudin vel. Mauris pharetra diam ac sollicitudin ullamcorper. Praesent congue rutrum laoreet. Praesent lobortis justo eu eros auctor, quis molestie velit commodo.</p>
+<p>In pellentesque massa metus, ut venenatis quam faucibus placerat. Quisque pulvinar neque id sem semper venenatis. Donec lectus eros, tempor a massa quis, sollicitudin mattis quam. Morbi vitae nisl in sem volutpat pulvinar eget eget leo. Sed dapibus fringilla dignissim. Aliquam ac lacus eleifend, imperdiet arcu eleifend, blandit erat. Aliquam aliquet massa non feugiat posuere. Sed at aliquet lacus, non maximus lorem. Etiam at turpis ut neque ultrices ultricies.</p>
+<p>Donec turpis sapien, rutrum dictum massa pharetra, consequat pretium sapien. Aenean at risus at ipsum tristique posuere. Proin id dignissim risus. Proin non sapien mattis metus aliquet tempus at in felis. Nunc porttitor odio a volutpat posuere. Praesent aliquet non tellus in rutrum. Phasellus ut lacinia elit, ac bibendum nisi. Suspendisse laoreet sapien id dui tempor tristique. Sed placerat ac tellus vel lobortis. Praesent dui est, rutrum at molestie in, laoreet vel massa.</p>
+<p>Vestibulum nec turpis eget augue egestas ullamcorper. Sed venenatis imperdiet magna accumsan consectetur. Vivamus vitae ligula ante. Aliquam porttitor lobortis lacus aliquam posuere. Nunc non lacus volutpat, condimentum diam non, rutrum libero. Quisque et pretium lorem. Pellentesque consequat sit amet lacus pellentesque auctor. Quisque sollicitudin, arcu quis convallis facilisis, diam neque ultricies dui, quis pulvinar erat felis eu massa. Maecenas dictum sodales tellus eget tempor. Fusce sed luctus neque. Phasellus orci lectus, semper eu neque id, interdum tempus lacus.</p>
+<p>Duis id arcu sed augue pulvinar porta. Maecenas efficitur sapien eget leo viverra, vel placerat mauris tristique. Integer tristique quam eget dui pretium feugiat. Sed vitae semper dui, in tristique libero. Aenean sit amet leo at elit bibendum rutrum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec tincidunt neque vitae metus volutpat, in venenatis magna sagittis. Morbi gravida commodo felis, eu pharetra lorem mattis sit amet. Donec a nulla eget enim consectetur cursus. Sed in finibus est.</p>
+<p>Aliquam nec quam quis augue pulvinar tincidunt. Vestibulum consequat vestibulum sem, sit amet malesuada justo lobortis eget. Praesent eu mattis diam. Donec a molestie felis. Vestibulum aliquam lorem viverra pharetra volutpat. Vivamus rhoncus risus quis venenatis vestibulum. Aenean fermentum nec ex sit amet eleifend. Nam orci ex, volutpat at arcu vitae, mattis maximus erat. Cras scelerisque varius erat, sit amet rhoncus ipsum placerat sit amet. Sed at purus aliquet lacus venenatis pharetra. Sed eget urna et felis facilisis aliquet nec vel urna. Sed elementum consequat augue. Cras tortor risus, maximus nec felis quis, maximus euismod nulla. Suspendisse potenti.</p>
+<p>Nunc eleifend ipsum pretium, finibus diam vel, ultricies nisi. Phasellus vehicula ornare nisi non condimentum. Curabitur sagittis, nisl non porta semper, arcu erat sodales mauris, id placerat sem ipsum id mi. Praesent vitae maximus ante. Phasellus vel est sit amet magna consectetur pharetra nec eget turpis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam luctus, leo sed maximus varius, neque dui tempus lacus, id porta justo tellus eu sapien. Pellentesque fringilla nec lorem quis tempus. Quisque finibus tortor a ligula mollis, at pharetra ligula luctus. Donec id neque at neque fermentum auctor. Vestibulum auctor, dolor sit amet porttitor iaculis, felis nisi fermentum mi, at bibendum arcu felis non est. Duis eget pharetra odio, eget tincidunt lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
+<p>Curabitur a elit at libero hendrerit pharetra. Quisque quam risus, sagittis vel sagittis eu, viverra finibus massa. Cras a hendrerit augue. Proin dignissim, quam vel varius mattis, sem leo feugiat risus, accumsan hendrerit massa tortor varius tellus. Duis fermentum finibus purus, vitae blandit turpis. In lobortis tortor et neque faucibus aliquam. Cras sed facilisis arcu, in fringilla mi. Aliquam pharetra elit quis ornare laoreet. Mauris nec congue nisl. Vestibulum pharetra lorem lacinia eros elementum, et egestas risus sodales. Cras euismod, ex ac accumsan mollis, enim augue lacinia leo, non viverra libero velit vitae velit. Curabitur tempor orci ut posuere vestibulum. Etiam accumsan ultricies elit, ac fringilla sem fringilla eget. Aliquam erat volutpat.</p>
+<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus vitae risus at lacus viverra interdum. Sed lacinia tincidunt tortor. Aliquam semper leo eget arcu suscipit vulputate. Proin dui ex, rutrum et quam ut, condimentum lacinia ipsum. Aliquam vitae ultrices metus, ut porta eros. Donec commodo dui at commodo porttitor. Quisque non risus interdum, rhoncus tortor sit amet, posuere mi. Donec sed eleifend orci. Phasellus non purus augue. Aliquam tempor mauris sit amet fermentum finibus. Sed vel lobortis quam. Nullam mollis sem in ornare feugiat. Nam sed venenatis neque, et lacinia erat.</p>
+<p>Nam dignissim id nulla ut fringilla. Donec nec lacinia lectus, et tincidunt massa. Sed ut laoreet urna. Cras facilisis suscipit viverra. Mauris condimentum erat eu nisl ullamcorper eleifend. Curabitur ac faucibus ligula. Duis ut consectetur erat, eget commodo ex. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam non dui bibendum, efficitur dolor eget, sagittis urna.</p>
+<p>In volutpat odio et lorem molestie, a finibus orci laoreet. Morbi sapien nisi, commodo sit amet orci in, tristique imperdiet urna. Cras felis arcu, mollis vitae imperdiet dapibus, pellentesque in diam. Nullam tristique risus a sem pharetra, hendrerit molestie sem varius. Praesent mattis ultricies suscipit. Maecenas sit amet rutrum turpis, sed egestas nisi. In ac auctor sapien, sed tempus est. Donec quis consequat dui, id sollicitudin nunc. Vivamus vestibulum ipsum a turpis congue, eu congue mauris vestibulum. Pellentesque hendrerit sodales est et convallis.</p>
+<p>Donec commodo mi sit amet libero viverra, nec cursus eros mattis. Suspendisse at nisl quis odio semper fermentum. Praesent leo magna, egestas nec tempor vitae, ornare vitae lectus. Morbi quis augue eget sapien congue gravida eu non sem. Aliquam convallis fermentum enim vel sodales. Sed sollicitudin semper posuere. Phasellus condimentum, urna eu porta commodo, lorem eros tincidunt orci, a bibendum est nibh eu nulla. Integer velit orci, interdum vel porta non, ullamcorper non arcu. Etiam pretium libero turpis, vitae iaculis risus cursus et. Vivamus sagittis pulvinar dictum. Cras feugiat facilisis tortor.</p>
+<p>Aenean nisi odio, sodales eu lacinia eu, facilisis a eros. Curabitur sapien tellus, commodo a justo luctus, molestie consequat tortor. Quisque rutrum lacus et magna pharetra suscipit. Pellentesque eget volutpat ex, sit amet laoreet sapien. Etiam tempus tristique purus non hendrerit. Fusce lobortis congue nisl. Pellentesque quis finibus dui. Cras imperdiet laoreet nulla, eu aliquet turpis laoreet non.</p>
+<p>Aliquam posuere fermentum ex, vitae eleifend tortor efficitur quis. Nulla quis fringilla dui. Sed lacinia ipsum libero, non euismod massa congue a. Cras varius et ipsum vel ultricies. Quisque sit amet magna mi. Integer congue turpis turpis, nec pretium diam convallis ut. Proin maximus velit id sagittis volutpat. Vestibulum vel fermentum purus. Ut id odio eu ipsum placerat tempor. Nulla lacus nisl, consectetur eu justo et, fermentum porttitor neque. Fusce non accumsan sapien, sit amet efficitur magna. Donec augue velit, fringilla aliquet posuere vel, accumsan ut nisl.</p>
+<p>Etiam in pharetra magna. Sed pulvinar congue massa. In non metus pharetra augue dignissim eleifend quis quis lorem. Aenean malesuada viverra tellus vel ultrices. Nam bibendum ut ligula quis lacinia. Vivamus sed faucibus augue. Duis ullamcorper, elit a consectetur bibendum, sem ligula ultricies nibh, et venenatis lorem ipsum a justo. Praesent condimentum lectus blandit erat porta gravida. Nullam ultricies ut mi ut molestie. Nulla pulvinar malesuada vestibulum. Vivamus vitae dolor ut ante viverra tempor.</p>
+<p>Cras accumsan arcu vitae laoreet commodo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean rutrum nunc nunc, ut imperdiet nibh maximus commodo. In mattis ultrices dolor, ut hendrerit nulla pharetra ac. Sed tempus neque at felis consequat tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla feugiat venenatis mauris sed mollis. Praesent consectetur mollis velit. Integer lorem urna, molestie vitae est et, volutpat mollis dui. Phasellus ultricies eget neque vel venenatis. Vestibulum non pretium augue, ultricies tristique ex. Aliquam non ex mi. In et sem vitae purus rutrum lacinia ut eget dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut viverra, tortor at consectetur hendrerit, orci urna iaculis arcu, eget tempus turpis nulla ut nulla.</p>
+<p>Vestibulum non ullamcorper risus, et aliquet metus. Sed eget fermentum urna, nec lobortis lectus. Fusce finibus nulla a est molestie, facilisis varius lacus mattis. Suspendisse diam dolor, molestie sit amet interdum et, blandit vitae mauris. Proin fringilla sit amet lorem quis sagittis. Etiam feugiat luctus euismod. Vivamus eget dignissim ante, ac tempor ex.</p>
+<p>Sed iaculis turpis a semper fermentum. Aenean id placerat justo. Pellentesque suscipit id velit in finibus. Cras lobortis vestibulum tortor, ac fermentum lorem vulputate a. Proin nisl neque, feugiat tincidunt justo nec, consectetur tincidunt ligula. Mauris purus augue, mattis ut lorem in, suscipit dapibus augue. Sed blandit, justo eget convallis vestibulum, felis tellus faucibus eros, ac ornare tortor eros id enim. Morbi consequat, tortor vel sodales iaculis, augue sem tempus urna, ut egestas tellus tortor sit amet arcu. Etiam efficitur neque eget fermentum congue.</p>
+<p>Nunc at iaculis elit. Sed ligula nisi, tempor non pellentesque at, posuere vel nisi. Cras aliquet orci metus, vel aliquam ante sollicitudin bibendum. Aenean quis rhoncus nisl. Sed condimentum vitae dolor vitae vulputate. Pellentesque vulputate sagittis sem, ac scelerisque nisi interdum id. Mauris malesuada leo sit amet bibendum finibus.</p>
+<p>Ut in augue ornare lacus suscipit dictum. Cras non sapien faucibus mauris maximus auctor in pharetra ipsum. Aliquam erat volutpat. Suspendisse at lectus sed mi volutpat congue. Aenean in quam facilisis, vulputate lorem at, posuere mi. Fusce et posuere urna. Praesent arcu ipsum, finibus vitae lacus vel, commodo ullamcorper felis. Mauris in tortor eget urna molestie commodo ut vel mi. Donec ut risus enim. Sed ex sapien, faucibus id urna sed, vulputate volutpat arcu. Morbi sollicitudin dictum nibh, id facilisis ipsum condimentum et. Pellentesque in turpis quis arcu venenatis cursus nec sit amet nulla. Maecenas tristique velit mauris, eget maximus nulla vulputate congue.</p>
+<p>Integer ultrices suscipit ex ac gravida. Cras pellentesque, orci vitae rutrum laoreet, ante odio accumsan elit, nec laoreet dolor eros a leo. Fusce a urna mattis, placerat eros malesuada, venenatis est. Aliquam blandit rutrum nunc, quis finibus nunc rhoncus efficitur. Sed a posuere odio. Pellentesque eros leo, varius eu hendrerit ac, aliquet eu nisi. Duis ac congue tortor. Maecenas mi dolor, ullamcorper ut rutrum et, molestie at libero. Sed at fermentum velit, a dapibus lorem. Suspendisse dictum vehicula nisl sed pellentesque. Quisque mollis bibendum facilisis.</p>
+<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In a velit augue. Morbi sollicitudin pharetra elit, sed tempor metus consequat quis. Vestibulum a enim urna. Duis maximus elit ut vestibulum bibendum. Suspendisse vehicula, ante id interdum luctus, lacus eros maximus nunc, auctor elementum neque nisl id risus. Nullam ex enim, molestie eget eleifend non, fermentum id massa. Vivamus vulputate sollicitudin hendrerit. In hac habitasse platea dictumst. Nam ultrices, odio eu maximus eleifend, leo turpis rutrum odio, ac auctor nisi sapien quis nulla. Suspendisse vel felis eu diam cursus interdum.</p>
+<p>Praesent accumsan at ex nec interdum. Aenean mattis consectetur mauris, id dignissim enim hendrerit quis. Nunc placerat pretium urna eu tristique. Integer sodales maximus velit, vitae efficitur odio ornare condimentum. Donec nec facilisis neque. Duis arcu turpis, pellentesque ut eleifend quis, iaculis id justo. Mauris pellentesque urna ut lacinia aliquam. Fusce mattis, dolor ut aliquam fermentum, augue magna elementum nunc, at mattis leo eros interdum elit. Curabitur in orci dignissim, interdum risus id, dapibus orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc vel placerat ligula. Integer et odio dictum, vestibulum est et, aliquet dui. Nulla cursus erat at consectetur sollicitudin. Suspendisse convallis vel neque quis rutrum. Morbi blandit ex justo, ac rutrum quam ultricies et.</p>
+<p>Nunc malesuada aliquet quam, vitae tincidunt turpis tempor consectetur. Fusce iaculis accumsan enim, non tincidunt nibh dictum eget. Pellentesque erat enim, sagittis sed enim ac, semper molestie urna. Proin sed tellus at urna lacinia elementum. Integer non gravida risus. Cras vel augue finibus justo consequat semper. Praesent non ornare tellus, sit amet mattis elit.</p>
+<p>Suspendisse euismod rutrum risus in consectetur. Phasellus augue justo, euismod vel urna tempor, ultricies aliquam turpis. Mauris aliquet malesuada metus non viverra. Donec sollicitudin dapibus porttitor. Vestibulum enim ligula, bibendum a sodales et, facilisis sit amet leo. Duis luctus ut odio in viverra. Nunc facilisis lacus ex. Cras aliquet vel tortor vel consectetur. Nulla ipsum nisi, mattis ac diam ut, consectetur interdum nunc. Sed pharetra diam ac turpis viverra gravida. Quisque maximus velit ac neque pellentesque, quis molestie turpis vestibulum. Vivamus aliquet condimentum pharetra.</p>
+<p>Nulla pulvinar justo sit amet lectus cursus euismod. Vivamus quis odio et elit ornare aliquam sit amet et turpis. Cras volutpat viverra malesuada. Quisque quis libero sit amet nisl porta aliquam. Ut ac ex non ex interdum elementum. In nec augue sed mauris convallis imperdiet. Aliquam semper sed arcu ut tristique. Praesent fermentum ornare ipsum malesuada dapibus. Suspendisse id velit magna.</p>
+<p>Quisque lorem ligula, lobortis in diam vitae, dignissim egestas leo. Curabitur at tincidunt odio. Morbi rutrum consectetur molestie. Cras tortor ligula, ultricies et diam a, bibendum pharetra nibh. Cras viverra dolor nulla, id dignissim odio interdum quis. Nulla tempus metus non imperdiet tempor. Etiam sit amet risus non arcu vulputate dignissim. Nulla facilisi. Etiam at vehicula risus. Suspendisse dapibus sollicitudin leo sit amet egestas.</p>
+<p>Donec faucibus, est non imperdiet eleifend, turpis nisl accumsan ipsum, vitae convallis sem metus at leo. Phasellus posuere tortor ut ante fringilla scelerisque. Sed dolor nunc, sagittis et est in, tempus rutrum nulla. Cras quis purus purus. Maecenas vitae nisl non magna elementum faucibus. In vel maximus tortor. Proin et commodo nunc. Nunc a arcu id sapien vestibulum dictum eu non orci.</p>
+<p>Nam consectetur tortor quis mollis mollis. Curabitur lacinia eu ante et eleifend. Sed pulvinar nulla diam, a volutpat nulla facilisis vel. Sed rhoncus aliquet sem, eget luctus diam eleifend ut. Integer quis pharetra eros, ac mattis risus. Quisque laoreet viverra sapien. Morbi pellentesque sem ut ante suscipit, ut tincidunt turpis finibus. Donec eu odio magna. Nullam at nisl quam. Curabitur molestie fringilla aliquam. Integer vehicula sem ut malesuada dapibus. Praesent urna nunc, facilisis vitae mi at, facilisis eleifend enim.</p>
+<p>Nam vitae augue quis urna laoreet consequat a sit amet ipsum. Aliquam augue purus, venenatis vel interdum vel, gravida eu orci. Sed commodo bibendum magna. Curabitur lacus magna, consequat et interdum sed, sagittis id sapien. Fusce rutrum varius erat, quis pellentesque diam tristique in. Sed ornare, urna ac laoreet accumsan, sem arcu egestas ante, nec convallis risus odio lacinia metus. Duis sagittis odio ut porttitor luctus. Aenean egestas felis sed lacus aliquam scelerisque semper non risus.</p>
+<p>Quisque in massa tempus, semper leo sed, laoreet justo. Fusce posuere felis tortor, id fermentum tortor mattis ac. Nulla ac pellentesque eros, ac luctus lacus. Curabitur suscipit gravida purus sodales condimentum. Duis ultrices nulla eros, sit amet blandit arcu fringilla vitae. Morbi congue velit eu metus tempus venenatis. Donec placerat sapien velit, non ullamcorper arcu porta id. Donec urna est, porta vitae porttitor sed, semper eu enim. Cras placerat faucibus nunc id tempor. Ut dui mauris, sodales ut mauris quis, pulvinar faucibus eros. Nulla tempus sed mi in laoreet.</p>
+<p>Nulla placerat ipsum nunc, vitae venenatis metus congue eget. Ut rutrum semper felis, non mollis metus molestie eu. Cras condimentum velit nec aliquet elementum. Quisque dignissim, ligula et euismod malesuada, dui elit mollis risus, in luctus nunc turpis sed ante. Nulla condimentum feugiat nisi, pretium vulputate purus auctor ac. Proin scelerisque quam ac dui sollicitudin pulvinar. Nullam eget dignissim elit, non tempus orci. Maecenas pharetra, leo eu tincidunt bibendum, erat augue feugiat odio, sit amet scelerisque libero elit id risus. Praesent tincidunt in libero a pellentesque. Quisque ullamcorper sit amet nisi nec ultricies. Etiam ut ex pretium arcu mattis molestie nec nec magna.</p>
+<p>Sed tempor ligula eu pharetra porttitor. Proin congue venenatis tincidunt. Vestibulum sit amet nisl augue. Aliquam sit amet nibh nisl. Suspendisse pretium, orci vitae egestas laoreet, orci ex gravida arcu, in fermentum urna diam in sapien. Maecenas fermentum ipsum sed lacus condimentum facilisis. Aliquam varius ipsum urna, porta porttitor diam pulvinar id.</p>
+<p>Aenean placerat lacus a mauris accumsan consectetur. In lacinia rutrum nulla nec ornare. Mauris hendrerit nisi et porta maximus. Pellentesque nec diam convallis, dictum dui vitae, placerat mauris. Mauris efficitur accumsan congue. Donec mattis eleifend enim, et lacinia quam. Cras lobortis pharetra velit, non auctor felis luctus lacinia. Sed vehicula euismod lectus, sed pharetra purus ullamcorper vitae. Sed sollicitudin, nisi eu maximus pellentesque, ex nisl maximus sapien, at rhoncus diam lectus ac nibh. Nam nec nunc eu leo finibus egestas sit amet in nunc.</p>
+<p>Quisque dictum eget leo a congue. Nullam sapien magna, fringilla et ipsum eget, ullamcorper dapibus risus. Fusce viverra congue velit posuere rutrum. Vivamus finibus mi et ligula viverra efficitur. Ut dapibus vehicula neque ac feugiat. Integer dictum, enim auctor efficitur ultricies, quam metus malesuada massa, at venenatis neque mauris non mi. Vivamus tempus gravida nisl. Aliquam erat volutpat. In mollis consectetur condimentum.</p>
+<p>Suspendisse potenti. Sed aliquet arcu magna, hendrerit porttitor risus egestas eget. Integer feugiat sapien semper metus placerat, ac viverra massa convallis. Praesent iaculis placerat arcu. Ut a dignissim ante. Nulla pellentesque quis justo eu efficitur. Etiam convallis magna nulla, malesuada venenatis neque volutpat et. In suscipit quis tellus a auctor. Duis quis nisi vehicula, consectetur turpis congue, suscipit ex. Cras sagittis laoreet leo a ornare. Aenean egestas enim et sapien tempus, in vehicula ligula gravida. Proin erat lacus, sagittis vitae scelerisque vel, malesuada id nisi.</p>
+<p>Cras fringilla libero at tristique fermentum. Cras tempor mi ac molestie ultrices. Aliquam dignissim ornare nibh, quis euismod leo faucibus quis. Donec eget sapien venenatis, finibus nibh in, convallis nisi. Mauris porttitor vehicula ante, quis sollicitudin tellus imperdiet non. Nullam ac gravida diam. Nullam non lectus nibh. Maecenas viverra non velit molestie elementum. Phasellus vehicula nisl in sollicitudin ultrices.</p>
+<p>Cras eu ligula eget neque egestas gravida vestibulum sed mauris. Vestibulum vehicula libero metus, quis elementum libero aliquam porta. Mauris volutpat id leo a auctor. Duis lectus nisl, dignissim id gravida ac, laoreet in neque. Sed et porttitor diam. Donec aliquam laoreet ex, vitae sodales justo ullamcorper lobortis. Phasellus volutpat, lacus non porta mollis, magna odio varius ante, in molestie dui sapien non tellus. Donec lacinia ac massa vel vestibulum. Fusce pulvinar tortor sed purus tempor, non aliquet ligula pretium.</p>
+<p>Duis commodo mi ac ornare sagittis. Fusce elementum nisl blandit mauris sollicitudin rhoncus. Sed feugiat molestie magna, non consequat magna facilisis et. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean euismod, ipsum at sollicitudin fermentum, ante sem cursus arcu, vitae aliquet risus est eu ante. Nulla vehicula dui id nisi feugiat semper. Praesent elementum porttitor mi, et commodo neque sollicitudin ut. Nam vestibulum augue ante, sit amet consequat nisl dapibus quis. Phasellus imperdiet nisi et semper vulputate. Donec facilisis turpis eget vehicula laoreet. Maecenas sit amet condimentum dolor, vel dapibus metus.</p>
+<p>Proin nec nulla justo. Quisque mattis vehicula eros, venenatis malesuada ipsum placerat vitae. Nulla facilisi. Nullam cursus ultrices nulla, sodales posuere odio porttitor eget. Praesent molestie luctus placerat. Vestibulum rutrum rutrum nisl, aliquam mollis quam imperdiet in. Suspendisse et risus a justo dignissim dictum ut a enim. Nam placerat auctor ante suscipit cursus. Aenean id mauris interdum metus tempus iaculis. Nam nec ultrices erat. Aliquam sodales erat at blandit bibendum. Quisque ut blandit mi. Sed at nisl ante. Aliquam non fringilla magna.</p>
+<p>Donec nec condimentum leo, ut tincidunt mauris. In fringilla lacinia lorem, id iaculis lorem suscipit id. Morbi lobortis eleifend quam. Pellentesque aliquet libero a iaculis fringilla. Aliquam viverra non metus at mollis. Nullam et est quis sem malesuada mollis. Praesent dignissim ultricies pulvinar. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque egestas urna eget commodo tempor. Phasellus in dolor urna. Maecenas nulla purus, congue ac aliquet et, rutrum sed nunc. Donec porttitor id enim vestibulum rhoncus. Cras id blandit massa. Interdum et malesuada fames ac ante ipsum primis in faucibus.</p>
+<p>Aenean condimentum ipsum et ligula mattis varius. Fusce ullamcorper leo vel ex varius tincidunt. Morbi sit amet eros ac nisl suscipit pharetra ut pharetra nisi. Morbi cursus eleifend viverra. Proin non egestas eros. In at accumsan lectus, eu venenatis velit. Suspendisse in massa quam.</p>
+<p>Fusce purus eros, cursus sed sollicitudin et, aliquam a felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In tincidunt neque in leo sagittis condimentum. Donec justo neque, imperdiet sed tellus et, ullamcorper dapibus felis. Nullam porta, nulla a eleifend fringilla, ligula felis placerat libero, ut luctus purus orci non enim. Curabitur justo nibh, scelerisque ut erat nec, cursus placerat felis. Nulla facilisi. Duis elementum quam sed vehicula tincidunt. Nulla tincidunt, elit id tincidunt fringilla, risus nisi feugiat urna, sit amet ultrices ante sapien eget arcu. Nullam eget tincidunt libero, nec feugiat orci. Nam ultricies, nibh vel finibus hendrerit, lorem enim rutrum orci, sit amet fringilla mauris turpis sed magna. Phasellus non dolor consequat, interdum ipsum ac, interdum odio. Aenean non lectus lectus.</p>
+<p>Nam nec nisi eu enim fringilla rutrum. Nam molestie id ligula quis auctor. Donec ac scelerisque dolor. In condimentum ligula velit, quis interdum nulla auctor et. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas ipsum enim, varius quis ante in, porta egestas magna. Phasellus a mauris in risus commodo sodales. Donec purus magna, sagittis id mauris vel, mattis convallis lacus. Mauris elementum nibh sit amet egestas aliquam. Vivamus ut augue lorem. Donec nec velit mi. Pellentesque vulputate blandit neque, et varius mauris condimentum vel. Praesent vitae tellus fermentum, ornare lorem eget, tempor leo. Integer varius, eros et tempor placerat, nunc magna consequat augue, eu imperdiet nisi quam at ipsum. Nullam vel fermentum ligula.</p>
+<p>Vivamus mattis justo suscipit laoreet porta. Donec congue nisl in elit efficitur dictum. Morbi nec ultricies tortor. Quisque sed ipsum euismod, placerat nibh non, efficitur nulla. Sed accumsan cursus egestas. Nulla at turpis tristique, cursus metus nec, ornare lorem. Morbi sit amet eros velit. Nulla sed tempor enim, eu iaculis mi. Maecenas ac urna dictum, sagittis risus in, aliquam ipsum. Proin rhoncus mi non dui placerat, sit amet sagittis elit euismod.</p>
+<p>Pellentesque eget urna eget orci convallis mattis et quis neque. Nulla ac magna finibus, condimentum metus ac, porttitor purus. In lacus augue, mattis bibendum tortor quis, congue hendrerit purus. Pellentesque molestie diam ut urna porta mattis. Fusce commodo suscipit tortor, in dapibus dolor molestie eu. Vivamus eget dignissim massa. Maecenas ut dignissim mauris. Curabitur pulvinar tellus in molestie semper. Sed molestie pellentesque ligula id interdum. Nullam maximus nibh sem, a mollis quam dignissim a. Proin semper viverra volutpat.</p>
+<p>Maecenas nec mi nisi. Pellentesque consectetur lectus vel vulputate viverra. Morbi accumsan rhoncus justo, ut pretium dolor dapibus in. Vestibulum in dictum felis. Suspendisse at finibus leo. Vestibulum ut augue vel metus porta molestie ac sed odio. In at facilisis enim, ac faucibus tellus. Aliquam et libero laoreet, feugiat velit ut, dictum ligula. Praesent sem purus, lobortis sed finibus ut, tincidunt malesuada dui. Sed ac scelerisque nisi, vitae aliquet metus. Aenean porttitor aliquet ligula sit amet maximus. Vivamus viverra ipsum in varius ornare. Suspendisse placerat enim vitae dictum finibus. Nam laoreet mauris vitae ipsum fermentum, a convallis odio ultrices.</p>
+<p>Donec ornare porttitor auctor. Aenean at sem sollicitudin, iaculis arcu id, consequat ante. Nam facilisis scelerisque lectus, at dignissim libero pellentesque ut. Pellentesque egestas arcu id lectus porttitor, ullamcorper scelerisque purus venenatis. Maecenas eros augue, finibus id turpis id, varius finibus velit. Pellentesque vitae orci est. Fusce in vulputate quam, in dignissim ante. Quisque quis egestas est, eu porta arcu. Donec ullamcorper elit vitae dolor consequat, a porta enim consequat. Curabitur quis mauris posuere, volutpat magna in, gravida mi. Ut ac mi diam.</p>
+<p>Cras ultricies condimentum nulla a tincidunt. Phasellus sagittis mauris eu commodo mattis. Nam imperdiet, elit maximus pulvinar dignissim, urna ex laoreet est, non interdum quam massa nec leo. Quisque tincidunt ultrices est ut ultricies. Nunc elementum blandit velit sit amet venenatis. Curabitur tristique ornare semper. Aenean finibus porttitor hendrerit. Integer volutpat dolor nec elit fringilla congue. In tincidunt lobortis tempus. Morbi mattis a eros sed volutpat. Nam non sapien eleifend, faucibus enim lacinia, luctus ipsum. Phasellus id blandit risus, non fringilla quam. Sed diam sem, vehicula ut sem vitae, commodo tempor ex. Cras eleifend mi sed neque dictum, in tempor libero suscipit. Vestibulum id semper justo. Proin interdum nulla velit, eget tristique neque efficitur et.</p>
+<p>Cras eget auctor dolor. Vestibulum metus diam, accumsan aliquam sagittis ac, vulputate a sapien. Cras vitae massa sit amet diam varius tristique. Curabitur molestie ac urna sed porttitor. Pellentesque cursus ipsum at iaculis consequat. Sed mattis molestie enim dapibus dapibus. Morbi dignissim, lacus in lobortis dictum, mauris tellus dignissim enim, sit amet porta ex ligula a lacus. Phasellus sagittis sapien a magna consectetur tempus. Proin aliquet ullamcorper diam at mattis. Praesent at sem luctus, sagittis elit a, eleifend eros. Cras sit amet dapibus orci, vel hendrerit erat. Duis rutrum pulvinar tempor. Curabitur pharetra ex ex, ut viverra augue semper non. Sed eu nulla porta, varius elit vel, auctor arcu.</p>
+    </div>
+    <script>
+        var target = document.getElementById("target");
+        var style = target.style;
+
+        function test() {
+            style.display = "block";
+            style.width = "280px";
+            target.offsetLeft;
+            style.width = "300px";
+            target.offsetLeft;
+            style.width = "290px";
+            target.offsetLeft;
+            style.display = "none";
+        }
+
+        PerfTestRunner.measureRunsPerSecond({ run: test });
+    </script>
+</body>
+</html>
index 615637c..24af377 100644 (file)
@@ -1,3 +1,25 @@
+2017-01-30  Zalan Bujtas  <zalan@apple.com>
+
+        Simple line layout: Small tweaks to improve performance.
+        https://bugs.webkit.org/show_bug.cgi?id=167611
+        <rdar://problem/30274294>
+
+        Reviewed by Simon Fraser.
+
+        This is ~10% progression on the attached test case (paragraphs with non-redundant content).
+        median: 102.08 runs/s -> median: 114.25 runs/s
+
+        * rendering/SimpleLineLayout.cpp:
+        (WebCore::SimpleLineLayout::LineState::appendFragmentAndCreateRunIfNeeded):
+        * rendering/SimpleLineLayoutFlowContents.cpp:
+        (WebCore::SimpleLineLayout::initializeSegments):
+        (WebCore::SimpleLineLayout::FlowContents::FlowContents):
+        * rendering/SimpleLineLayoutFlowContents.h:
+        * rendering/SimpleLineLayoutTextFragmentIterator.cpp:
+        (WebCore::SimpleLineLayout::TextFragmentIterator::nextNonWhitespacePosition):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::skipToNextPosition):
+        * rendering/SimpleLineLayoutTextFragmentIterator.h:
+
 2017-01-30  Chris Dumez  <cdumez@apple.com>
 
         Drop legacy constants on Event interface
index b488881..a93d835 100644 (file)
@@ -460,7 +460,7 @@ public:
         if (!m_runsWidth)
             runs.append(Run(fragment.start(), endPosition, m_runsWidth, m_runsWidth + fragment.width(), false, fragment.hasHyphen()));
         else {
-            const auto& lastFragment = m_fragments.last();
+            auto& lastFragment = m_fragments.last();
             // Advance last completed fragment when the previous fragment is all set (including multiple parts across renderers)
             if ((lastFragment.type() != fragment.type()) || !lastFragment.overlapsToNextRenderer())
                 m_lastCompleteFragment = lastFragment;
@@ -561,7 +561,8 @@ private:
     // Having one character on the line does not necessarily mean it actually fits.
     // First character of the first fragment might be forced on to the current line even if it does not fit.
     bool m_firstCharacterFits { false };
-    Vector<TextFragmentIterator::TextFragment> m_fragments;
+    // FIXME: We don't actually need this for all the simple cases. Try to remove/make it optional.
+    Vector<TextFragmentIterator::TextFragment, 30> m_fragments;
 };
 
 class FragmentForwardIterator : public std::iterator<std::forward_iterator_tag, unsigned> {
index d8a2d6f..5d09b63 100644 (file)
@@ -43,9 +43,9 @@ static Vector<FlowContents::Segment> initializeSegments(const RenderBlockFlow& f
     Vector<FlowContents::Segment> segments;
     segments.reserveCapacity(numberOfChildren);
     unsigned startPosition = 0;
-    for (const auto& child : childrenOfType<RenderObject>(flow)) {
+    for (auto& child : childrenOfType<RenderObject>(flow)) {
         if (is<RenderText>(child)) {
-            const auto& textChild = downcast<RenderText>(child);
+            auto& textChild = downcast<RenderText>(child);
             unsigned textLength = textChild.text()->length();
             segments.append(FlowContents::Segment { startPosition, startPosition + textLength, textChild.text(), textChild });
             startPosition += textLength;
@@ -62,7 +62,6 @@ static Vector<FlowContents::Segment> initializeSegments(const RenderBlockFlow& f
 
 FlowContents::FlowContents(const RenderBlockFlow& flow)
     : m_segments(initializeSegments(flow))
-    , m_lastSegmentIndex(0)
 {
 }
 
index bb331ec..24614f2 100644 (file)
@@ -45,7 +45,7 @@ public:
         unsigned toRenderPosition(unsigned position) const { return start + position; }
         unsigned start;
         unsigned end;
-        String text;
+        StringView text;
         const RenderObject& renderer;
     };
     const Segment& segmentForRun(unsigned start, unsigned end) const;
@@ -57,7 +57,7 @@ public:
 private:
     unsigned segmentIndexForRunSlow(unsigned start, unsigned end) const;
     const Vector<Segment, 8> m_segments;
-    mutable unsigned m_lastSegmentIndex;
+    mutable unsigned m_lastSegmentIndex { 0 };
 };
 
 inline const FlowContents::Segment& FlowContents::segmentForRun(unsigned start, unsigned end) const
index 21708e3..7ab34f3 100644 (file)
@@ -153,14 +153,12 @@ unsigned TextFragmentIterator::nextBreakablePosition(const FlowContents::Segment
     return segment.toRenderPosition(nextBreakablePositionInSegment(m_lineBreakIterator, segment.toSegmentPosition(startPosition), m_style.breakNBSP, m_style.keepAllWordsForCJK));
 }
 
-template <typename CharacterType>
 unsigned TextFragmentIterator::nextNonWhitespacePosition(const FlowContents::Segment& segment, unsigned startPosition)
 {
     ASSERT(startPosition < segment.end);
-    const auto* text = segment.text.characters<CharacterType>();
     unsigned position = startPosition;
     for (; position < segment.end; ++position) {
-        auto character = text[segment.toSegmentPosition(position)];
+        auto character = segment.text[segment.toSegmentPosition(position)];
         bool isWhitespace = character == ' ' || character == '\t' || (!m_style.preserveNewline && character == '\n');
         if (!isWhitespace)
             return position;
@@ -213,7 +211,7 @@ unsigned TextFragmentIterator::skipToNextPosition(PositionType positionType, uns
     unsigned nextPosition = currentPosition;
     // Collapsed whitespace has constant width. Do not measure it.
     if (positionType == NonWhitespace)
-        nextPosition = m_currentSegment->text.is8Bit() ? nextNonWhitespacePosition<LChar>(*m_currentSegment, currentPosition) : nextNonWhitespacePosition<UChar>(*m_currentSegment, currentPosition);
+        nextPosition = nextNonWhitespacePosition(*m_currentSegment, currentPosition);
     else if (positionType == Breakable) {
         nextPosition = nextBreakablePosition(*m_currentSegment, currentPosition);
         // nextBreakablePosition returns the same position for certain characters such as hyphens. Call next again with modified position unless we are at the end of the segment.
index a57a807..7a41eee 100644 (file)
@@ -133,7 +133,7 @@ private:
     bool isSoftLineBreak(unsigned position) const;
     bool isHardLineBreak(const FlowContents::Iterator& segment) const;
     unsigned nextBreakablePosition(const FlowContents::Segment&, unsigned startPosition);
-    template <typename CharacterType> unsigned nextNonWhitespacePosition(const FlowContents::Segment&, unsigned startPosition);
+    unsigned nextNonWhitespacePosition(const FlowContents::Segment&, unsigned startPosition);
     float runWidth(const FlowContents::Segment&, unsigned startPosition, unsigned endPosition, float xPosition) const;
 
     FlowContents m_flowContents;