commit 1f6a425bc29c502576f0bbec99f94fb17ce37441 Author: Elf M. Sternberg Date: Tue Jun 28 22:03:21 2016 -0700 Initial commit. Not really, but... diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45e4625 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*~ +*.swp +db.sqlite3 +bower_components +*.pyc +\#*# +.#* diff --git a/README.md b/README.md new file mode 100644 index 0000000..f71142d --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# Handy + +Handy is a simple Django app that provides the user with a working, if +simple, search rank algorithm matching maintenance experts with the +properties they've maintained. Handy starts with an initial dataset +provided from a CSV file. + +# Installation + +This script requires Python3 and Sqlite. + +1. Create a new virtual environment: + + $ virtualenv --python=python3 handy + $ cd handy + $ source bin/activate ;# this is the bash instruction; use what your env demands + $ pip install django + $ git clone handy + $ cd handy ;# Yes, twice: handy/handy. + $ rm db.sqlite3 + $ ./manage.py migrate auth admin sessions + $ ./manage.py migrate ranksearch 0001_initial + $ ./manage.py recoverhandy + $ ./manage.py runserver + +"Recoverhandy" is a custom command that imports the CSV into the +database, creating owners, properties, maintainers, and jobs +progressively. It does a lot of 'get\_or\_create' commands, so on +SQLite it's pretty slow. + +After entering the 'handy' app home, you can also + + $ ./manage.py test + +This will run a simple unit test that asserts both the database +structure and client status are adequate. + + +# Process + +The first thing is to understand the data. + +The problem: + +* A *maintainer* starts with a *score* +* For the problem space, the score is artificial +* A rating is given to a *maintainer* on a given *date* +* More precisely: The maintainer gets a set of scores in order +* The maintainer's *overall score* is: +* *score* when there are zero jobs +* *score* + (sum ratings / 10) between 1 and 9 jobs +* (sum ratings / num sits) for 10 o more jobs + +Tables: + Property Owners + Properties (owner_id) + Maintainers + Jobs (maintainer_id, property_id, start_date, end_date, rating, comments) + +I'm big on slugs. I'm *very* big on navigable and bookmarkable URLs. +If a property owner comes to like a particular maintainer, that +maintainer should have their own URL the owner can always navigate to, +to see if the maintainer is available. + +I know it's bad form to write your own pagination kit, but I couldn't +help myself; it's a bit of showing off, especially with the history +thing in-lined. + +# Analysis + +This was *fun*. I haven't worked in Django in almost three years, and +the things that have changed since 1.4 and within Python 3 make +development even more interesting than usual. + +# Postscript + +If you're reading this and you can't figure out what this is *really* +for, you probably don't need it. diff --git a/handy/__init__.py b/handy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/handy/settings.py b/handy/settings.py new file mode 100644 index 0000000..ec9c304 --- /dev/null +++ b/handy/settings.py @@ -0,0 +1,125 @@ +""" +Django settings for handy project. + +Generated by 'django-admin startproject' using Django 1.9.5. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.9/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '(7lr20h!n7!x5weddd#=sj5dp^hma4p!63kox%=eui+n)lpq$$' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'ranksearch' +] + +MIDDLEWARE_CLASSES = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'handy.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': ['templates'], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'handy.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.9/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.9/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.9/howto/static-files/ + +STATIC_URL = '/static/' +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, "static") +] diff --git a/handy/urls.py b/handy/urls.py new file mode 100644 index 0000000..380df51 --- /dev/null +++ b/handy/urls.py @@ -0,0 +1,22 @@ +"""handy URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.9/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url, include +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), + url(r'^search/', include('ranksearch.urls')) +] diff --git a/handy/wsgi.py b/handy/wsgi.py new file mode 100644 index 0000000..535fe77 --- /dev/null +++ b/handy/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for handy project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "handy.settings") + +application = get_wsgi_application() diff --git a/initial_data/newreviews.csv b/initial_data/newreviews.csv new file mode 100644 index 0000000..fbb353d --- /dev/null +++ b/initial_data/newreviews.csv @@ -0,0 +1,501 @@ +rating,http://lorempixel.com/300/300/people,end_date,Fusce neque. Justo dolor tellus scelerisque ipsum. Justo netus laoreet erat phasellus sed nam. Class porta. Donec ipsum orci conubia tristique nunc per in. Risus curae. Metus proin. Risus morbi class ullamcorper est libero dapibus nisl enim eget commodo.,http://lorempixel.com/300/300/people,The Leap at Lazy Sanctuary,Louann Sizer,Eleanor Krajewski,start_date +5,http://lorempixel.com/300/300/people,2013-04-08,Risus velit. Fusce risus non tortor. Dolor morbi. Purus donec urna montes parturient. Proin justo arcu amet odio pede nam. Lorem massa tempus elementum ve justo. Class lacus massa rhoncus nisi varius sed arcu placerat cum orci nascetur tortor odio. Neque risus.,http://lorempixel.com/300/300/people,Lychee Gulf,Gilda Puffer,Samatha Buskey,2013-02-26 +5,http://lorempixel.com/300/300/people,2012-05-17,Ipsum nulla auctor eu pulvinar elit hac amet. Lorem augue leo placerat potenti porttitor cursus molestie amet. Curae massa est duis non fames. Felis massa justo class mattis nibh felis dictum class vestibulum nascetur quis. Proin magna per enim ut pede etiam varius ac. Massa donec etiam quis leo orci parturient. Lorem neque ante ligula erat rutrum. Etiam ipsum etiam libero nulla rhoncus enim ac.,http://lorempixel.com/300/300/people,The Fields at Azalea Point|Flamingo Shore|Tamarind Quay,Ellsworth Rehman,Cinderella Laber,2012-04-03 +2,http://lorempixel.com/300/300/people,2012-07-28,Etiam justo quam commodo a turpis porta est ante eros. Magna ipsum sagittis porta nec orci odio vivamus tortor. Justo velit a nostra augue fringilla. Donec justo non pede penatibus sollicitudin egestas proin. Vitae ipsum integer curabitur sed diam ve diam lacus nam turpis a. Magna justo faucibus quis. Morbi nulla blandit at interdum nisl aenean platea. Porta magna senectus.,http://lorempixel.com/300/300/people,The Villas at Iroquois Timbers,Berniece Sulton,Dewayne Sisco,2012-06-22 +2,http://lorempixel.com/300/300/people,2013-05-31,Felis risus primis mollis sit auctor ad litora ad. Vitae donec a mauris elit. Netus justo fames fringilla conubia nisi amet lacinia. Lacus nulla mattis in dui nibh sagittis elit potenti ac. Proin morbi pretium rutrum sit eu fames felis sed turpis sociis convallis mi. Curae magna auctor donec scelerisque sociosqu eros taciti. Augue curae facilisi orci enim per rutrum ve ipsum eni arcu malesuada magnis sed odio cras. Metus ipsum sapien condimentum velit elementum phasellus arcu lectus eu sapien.,http://lorempixel.com/300/300/people,Whistling Heath,Maxie Hollifield,Norberto Dynes,2013-05-05 +2,http://lorempixel.com/300/300/people,2012-10-17,Felis metus lacus vel urna sem vitae sem rutrum leo turpis. Proin neque nulla cum elementum libero interdum velit. Augue lacus. Velit purus. Augue velit amet dui vitae rhoncus ligula facilisis fames convallis penatibus class facilisis adipiscing pretium leo. Curae donec netus enim vivamus id fermentum. Fusce porta. Ipsum felis magna neque class nec cras per orci dictum.,http://lorempixel.com/300/300/people,Charming Acres|Leeward Cove|The Lakes at Royal Dunes,Janean Nordby,Alex Groom,2012-09-17 +4,http://lorempixel.com/300/300/people,2013-01-18,Etiam augue fusce purus duis dolor laoreet bibendum felis. Fusce etiam. Risus fames risus pretium ac lacus ligula pulvinar cum. Curae etiam a posuere dictum curae lorem ligula parturient neque eros. Lacus dolor sed erat sem viverra nascetur in scelerisque ad nostra. Metus neque aptent maecenas sed quam fusce primis id arcu augue eu habitasse ullamcorper. Ipsum porta. Purus donec nunc etiam eleifend vitae sed enim sapien hymenaeos.,http://lorempixel.com/300/300/people,Thanksgiving Oaks,Jade Clutts,Frankie Desantiago,2012-10-30 +2,http://lorempixel.com/300/300/people,2012-05-03,Dolor porta ligula sed diam faucibus elementum maecenas senectus conubia neque. Proin class. Ipsum velit per. Vitae netus felis odio libero laoreet. Augue felis leo etiam. Ipsum neque vehicula hac cras. Metus netus non vitae. Etiam magna maecenas et cras.,http://lorempixel.com/300/300/people,The Inlet of Thanksgiving Downs|Guava Harbor,Kenda Scarboro,Lionel Hellen,2012-04-21 +3,http://lorempixel.com/300/300/people,2013-05-21,Dolor fusce mauris taciti nulla litora adipiscing pellentesque egestas. Magna curae semper suspendisse. Neque felis aenean lacus leo nisl sit ultrices etiam. Vitae curae ultrices proin a sodales nullam. Ipsum fusce magna purus torquent mi ullamcorper nunc arcu. Justo augue sociosqu curae facilisis eu. Purus dolor nisl. Fames metus sapien morbi eu.,http://lorempixel.com/300/300/people,Liberation Outlook|South Hills,Nila Styons,Armida Oddo,2013-02-21 +3,http://lorempixel.com/300/300/people,2012-06-14,Fusce metus cras ridiculus convallis lorem erat senectus hac dapibus. Augue vitae molestie parturient tristique suspendisse leo rutrum fames ultricies praesent elit non lacinia molestie. Purus curae litora morbi suspendisse inceptos sodales viverra taciti dolor diam cursus. Vitae risus pulvinar curae malesuada sodales eni ad nunc netus nascetur augue ac interdum dapibus ut non. Lorem fusce aliquam nostra dui vestibulum semper proin vestibulum ullamcorper rutrum ut et ac eros augue. Lacus fusce arcu pede elementum montes. Fusce felis rhoncus non ultricies nisi eni donec est nostra rutrum. Fusce ipsum eget mus fames magna.,http://lorempixel.com/300/300/people,The Corner at Gentle Crag,Clark Groce,Valarie Macbeth,2012-04-03 +4,http://lorempixel.com/300/300/people,2012-10-13,Netus nulla leo elit sed porta viverra euismod justo. Augue fames nam metus est lorem. Donec massa nam duis. Class metus pede in sollicitudin nonummy. Proin massa a arcu ve. Justo porta ligula fusce lorem aptent metus magna platea. Neque massa. Etiam neque non urna pede amet donec class.,http://lorempixel.com/300/300/people,Walrus Cliffs|The Springs at Summer Villas|Crystal Abbey,Winfred Begaye,Garry Thrall,2012-09-30 +3,http://lorempixel.com/300/300/people,2013-07-01,Justo augue posuere dictum cursus nibh nulla mi consequat justo ad montes quis. Nulla risus varius nec quis vehicula integer. Purus augue per congue. Fames lorem. Proin porta dapibus at integer diam ut volutpat nostra taciti fermentum. Lorem proin dictum condimentum. Donec porta. Donec neque cum.,http://lorempixel.com/300/300/people,The Haven at Antelope Junction,Seymour Bollig,Hollie Crochet,2013-05-08 +5,http://lorempixel.com/300/300/people,2012-08-20,Felis vitae rutrum senectus facilisis magna nec quam inceptos a. Donec fames fusce nulla libero bibendum conubia augue in turpis commodo odio enim leo. Etiam purus varius etiam facilisi. Metus justo leo dis pellentesque congue. Felis class sem vestibulum ac malesuada adipiscing cras vitae. Nulla fusce non cursus arcu sollicitudin parturient. Neque proin dui diam ultrices hac in a aptent eget mi. Lacus magna.,http://lorempixel.com/300/300/people,Darling Valley|The Estates at Old Orchards,Vikki Rufus,Elijah Manos,2012-05-26 +3,http://lorempixel.com/300/300/people,2012-06-26,Netus curae congue aptent inceptos vestibulum cubilia amet curae sapien tortor. Dolor porta porttitor potenti. Justo dolor a euismod tortor tempor fusce ultrices. Augue lorem senectus leo. Fusce vitae lacus cras. Fames massa viverra mus quis. Magna class. Etiam curae aptent velit non arcu ac sollicitudin euismod morbi rhoncus.,http://lorempixel.com/300/300/people,The Harbor at Fireside Promontory|The Estates at Spruce Brook|Sunrise Terrace,Catherina Entrekin,Jacque Behm,2012-06-10 +3,http://lorempixel.com/300/300/people,2012-10-16,Dolor curae felis dictumst ut aptent sociosqu nonummy faucibus et massa. Fames augue. Purus felis sit ridiculus odio nunc neque ac. Risus class. Fusce class morbi condimentum lobortis ultricies consectetuer. Fames velit enim libero sapien pede vivamus sed ultricies orci sed etiam adipiscing. Neque curae scelerisque eget habitasse eni vehicula aliquet dictum imperdiet proin dictumst felis. Vitae purus primis ut.,http://lorempixel.com/300/300/people,Maple Farms,Candice Vidrio,Bridgette Efird,2012-09-10 +4,http://lorempixel.com/300/300/people,2013-05-23,Risus etiam erat dolor neque ultricies pulvinar netus litora. Etiam magna eget ornare non montes. Curae etiam tristique. Morbi vitae nibh scelerisque. Augue porta. Lorem massa. Felis augue ultrices adipiscing consequat enim pretium tellus. Purus vitae magna.,http://lorempixel.com/300/300/people,Banyan Bay|The Acres at Leafy Ridge|Macaw Island,Candice Vidrio,Francesco Marcinkowski,2013-03-12 +1,http://lorempixel.com/300/300/people,2013-01-07,Vitae velit mus egestas ultrices. Fusce netus phasellus erat consequat mollis. Purus lacus nisi aliquam tristique quis ipsum vehicula. Dolor nulla proin consequat non. Justo velit ultrices velit ultricies vestibulum. Etiam nulla eros cursus purus tristique parturient mus donec. Proin massa. Etiam massa ultricies lorem consequat.,http://lorempixel.com/300/300/people,Sea Spray Breakers|Macaw Waves,Randal Needleman,Raquel Yoshioka,2012-10-11 +3,http://lorempixel.com/300/300/people,2012-10-05,Donec porta. Netus magna. Donec etiam class eget. Augue lacus ipsum volutpat vestibulum ligula hac parturient. Fusce felis hendrerit hac. Donec proin conubia nam ad sollicitudin nisi euismod pretium orci ad hac. Neque lorem sagittis. Velit curae nam pede vestibulum mi semper dapibus elit.,http://lorempixel.com/300/300/people,Birch Estates|Oriole Valley,Mozelle Saez,Leonia Clow,2012-07-22 +5,http://lorempixel.com/300/300/people,2013-04-17,Risus velit tempus non vivamus eleifend enim nam duis eros parturient cum justo. Augue etiam a sodales ac. Massa risus neque nulla ligula pede sapien ac urna. Class vitae primis orci elit aliquet. Lorem velit tempus condimentum nulla venenatis metus id aenean pulvinar parturient rhoncus eni tellus potenti in. Donec dolor eget orci cubilia porttitor quis eni blandit. Netus morbi. Massa nulla tortor vivamus hendrerit at tempus duis mauris dignissim habitant.,http://lorempixel.com/300/300/people,Puente Rojo|Moose Hearth|Seagull Landing,Tasha Dennard,Andree Kingman,2013-04-13 +3,http://lorempixel.com/300/300/people,2012-12-31,Ipsum massa libero. Velit etiam metus donec ante facilisis consequat odio eget augue dictum. Magna lacus montes velit. Lacus justo maecenas fames ve sociis lacus primis. Massa etiam elit libero. Neque fusce. Lorem class nascetur tristique a neque sodales mi cum malesuada dui. Neque fames laoreet felis cras quisque et accumsan facilisi euismod odio et arcu.,http://lorempixel.com/300/300/people,Birch Vista,Tyree Aumick,Tara Johnsrud,2012-10-26 +4,http://lorempixel.com/300/300/people,2012-03-04,Etiam vitae. Netus fames ligula class ut metus consequat odio. Massa morbi porta scelerisque ac nostra phasellus parturient urna tristique sem euismod. Ipsum metus. Lorem velit. Risus netus. Nulla donec. Felis fames lobortis parturient aptent felis pretium vulputate praesent nullam.,http://lorempixel.com/300/300/people,Liberty Glade|The Vale at Evergreen Junction|The Villas at Sheffield City,Vikki Rufus,Jerilyn Crowder,2012-01-25 +2,http://lorempixel.com/300/300/people,2012-04-17,Curae lorem vitae risus mollis eu quis. Justo felis varius felis. Netus morbi. Magna metus a montes nibh eros vulputate libero vestibulum. Magna morbi risus est lobortis a sollicitudin amet sodales euismod. Neque dolor a rhoncus at mattis ad vel ad porta. Porta proin. Nulla neque.,http://lorempixel.com/300/300/people,The Heath at Old Valley|Ash Dale,Era Mustafa,Kristeen Kindel,2012-04-09 +5,http://lorempixel.com/300/300/people,2012-01-08,Lorem justo nullam lectus proin parturient ac odio faucibus senectus taciti. Curae ipsum risus nostra taciti interdum arcu cum eros maecenas parturient varius in interdum. Fames morbi sit leo per dignissim mollis semper class elementum malesuada adipiscing nisi lorem. Velit curae rhoncus urna mi. Velit netus lacus pulvinar massa. Etiam velit orci diam. Vitae risus enim aliquam et in augue. Fames netus hendrerit.,http://lorempixel.com/300/300/people,Wandering Lakes|Aloha Beach,Kera Cybart,Lisha Belser,2012-01-07 +2,http://lorempixel.com/300/300/people,2012-05-04,Purus lacus aptent ad lorem aptent libero sagittis proin. Porta proin mollis euismod cubilia enim eleifend leo blandit interdum lacus vitae. Lacus nulla faucibus. Netus justo est fusce ipsum cum. Vitae lacus luctus tempor dui rutrum iaculis commodo curabitur aptent. Vitae fames auctor libero neque donec scelerisque molestie nibh non dolor. Proin vitae orci hymenaeos dis. Proin ipsum urna quisque.,http://lorempixel.com/300/300/people,The Heath at Old Valley|Ash Dale,Sharan Fucci,Kristeen Kindel,2012-04-14 +4,http://lorempixel.com/300/300/people,2012-08-28,Donec curae. Purus metus arcu ridiculus eros dui at sapien a torquent vel egestas nunc ipsum id tempus magna. Dolor purus nam. Lorem velit. Justo magna purus amet tellus dignissim facilisi luctus volutpat. Netus massa nisl nec dictumst curabitur accumsan duis arcu id diam cras risus. Velit morbi fringilla. Purus porta.,http://lorempixel.com/300/300/people,Maple Ranch|The Point at Welcome Village|Passion Fruit Breakers,Cythia Doten,Muoi Bays,2012-08-27 +4,http://lorempixel.com/300/300/people,2012-02-29,Felis magna eget feugiat ac dis curabitur pharetra augue porta litora id bibendum orci per augue sit odio diam facilisi. Neque porta. Porta neque. Porta massa. Felis proin sociis condimentum neque varius mollis. Curae fusce hac augue hac orci nascetur. Fames metus odio. Metus curae neque dictum sociis inceptos imperdiet.,http://lorempixel.com/300/300/people,Mild Hills,Ellsworth Rehman,Lurline Nickols,2012-02-04 +5,http://lorempixel.com/300/300/people,2012-07-21,Donec lacus. Risus netus felis. Metus morbi diam nonummy in. Felis dolor egestas penatibus cum velit elementum nostra interdum velit tristique parturient orci morbi porta. Velit donec. Metus risus tellus montes nam amet leo ornare. Donec ipsum aliquam tempus amet et metus tellus. Felis purus iaculis mattis pede eu senectus aptent tempor dui cum potenti.,http://lorempixel.com/300/300/people,Breadfruit Bay,Chang Morquecho,Dyan Shay,2012-04-22 +4,http://lorempixel.com/300/300/people,2013-02-19,Etiam donec proin felis sociis porttitor ac fringilla augue. Massa etiam proin felis sociis nisi et pellentesque commodo elit ultrices. Nulla ipsum risus aenean tortor quisque aliquam varius nibh consectetuer. Magna lacus fringilla malesuada. Lacus magna a diam lacus laoreet tellus. Justo vitae. Metus lorem. Lacus netus eleifend nam litora sociis sit leo.,http://lorempixel.com/300/300/people,The Homestead at Summer Promontory|Shady Anchorage,Sindy Koller,Herma Yocum,2012-12-29 +2,http://lorempixel.com/300/300/people,2012-04-14,Nulla ipsum posuere tellus vel vestibulum. Proin metus dictumst duis at duis tellus feugiat nunc quis amet. Curae massa. Felis dolor suspendisse sem mauris ut inceptos pede. Lacus proin pretium metus vel. Velit augue non nisi ac sem. Vitae metus est magna imperdiet eu. Class dolor sociis pharetra morbi class aptent scelerisque fames tempus mi faucibus nisi litora.,http://lorempixel.com/300/300/people,Maple Ranch|The Point at Welcome Village|Passion Fruit Breakers,Lonnie Rye,Muoi Bays,2012-02-24 +4,http://lorempixel.com/300/300/people,2012-12-17,Lorem augue elit nec sodales sociis class suspendisse. Netus augue facilisi justo sapien quis consectetuer. Massa vitae mus nibh nunc class sagittis netus consectetuer. Lacus dolor class. Neque ipsum dolor sociis consequat sodales nulla integer est. Lorem purus pede mauris magnis. Justo curae semper ve. Nulla proin vel erat sit tempor dictum per elit dis nunc.,http://lorempixel.com/300/300/people,Liberty Corner|Poplar Highlands,Adriene Rizo,Lillian Ristau,2012-11-23 +5,http://lorempixel.com/300/300/people,2013-01-03,Fames vitae. Nulla proin auctor fermentum. Neque netus montes aenean sagittis adipiscing litora nunc quam ligula ac hac erat elit aliquam. Magna nulla litora orci ante quisque convallis. Curae purus tempus. Augue proin nulla nam velit magna tempus facilisi vestibulum luctus. Class donec a odio dolor fermentum per. Etiam donec curae hac risus.,http://lorempixel.com/300/300/people,Spring Sanctuary|Sandpiper Pier|Lazy Vineyard,Tomika Shimer,Marybeth Sinquefield,2012-10-31 +3,http://lorempixel.com/300/300/people,2012-04-01,Justo risus per netus fames a mattis eros urna ante phasellus sagittis quis. Vitae velit lacus faucibus venenatis sed nascetur ultricies. Felis morbi eget eni a lectus odio nibh ipsum fermentum penatibus nisi quam. Purus augue a eros porta sed. Curae vitae. Porta risus. Fusce donec eni. Magna neque aptent platea netus.,http://lorempixel.com/300/300/people,Palm Bay,Tyree Aumick,Marcia Chabot,2012-03-10 +5,http://lorempixel.com/300/300/people,2013-05-24,Magna neque aptent aenean nascetur adipiscing aptent. Dolor risus a natoque eu class suspendisse. Purus fames ultricies. Massa risus ornare ligula fames. Fusce porta pharetra parturient semper. Magna dolor. Porta neque nonummy tortor at pulvinar nec nulla justo. Proin ipsum.,http://lorempixel.com/300/300/people,Valle Mariposa|Laughing Vale,Rodrick Turberville,Venice Feldman,2013-03-18 +1,http://lorempixel.com/300/300/people,2012-11-14,Morbi netus sociosqu consequat eu auctor eu enim purus ridiculus. Ipsum fames. Metus fusce. Morbi felis nostra et lorem mi risus ad. Curae donec. Risus ipsum eget auctor potenti feugiat auctor orci. Fames nulla. Nulla vitae sagittis et elit.,http://lorempixel.com/300/300/people,The Park at Sweet Vista,Gary Trostle,Elease Mullen,2012-10-01 +5,http://lorempixel.com/300/300/people,2012-09-06,Felis lacus feugiat eu purus ac urna ullamcorper dapibus pellentesque laoreet. Massa magna. Fames vitae convallis sem consectetuer auctor ipsum. Justo massa potenti feugiat eleifend. Lacus class mauris mi vel auctor egestas potenti class et nunc pulvinar. Ipsum magna dictumst phasellus. Dolor purus gravida non libero dapibus nunc non tristique. Etiam risus.,http://lorempixel.com/300/300/people,Wandering Lakes|Aloha Beach,Seymour Bollig,Lisha Belser,2012-07-11 +4,http://lorempixel.com/300/300/people,2012-08-10,Massa magna. Lorem metus. Vitae lacus quam lobortis a pellentesque enim. Netus proin. Proin magna. Porta nulla tempus proin eu lacus eu dis hymenaeos semper placerat amet. Ipsum etiam arcu feugiat vitae eget vitae accumsan porttitor. Ipsum proin.,http://lorempixel.com/300/300/people,Paso Rojo|Axminster Crag,Winfred Begaye,Jackeline Silvernail,2012-06-29 +1,http://lorempixel.com/300/300/people,2012-05-31,Nulla massa a eros donec facilisi. Metus porta ridiculus. Lorem neque per faucibus a lobortis odio. Justo lorem congue sociosqu ante. Nulla magna. Metus felis. Proin nulla a gravida eu magnis ut taciti arcu ut magna metus magnis luctus nisi enim. Metus vitae per duis pharetra hymenaeos a ipsum nonummy at habitasse.,http://lorempixel.com/300/300/people,Mild Hills,Aja Hesler,Lurline Nickols,2012-04-10 +4,http://lorempixel.com/300/300/people,2012-12-03,Etiam dolor metus suspendisse ac ligula ridiculus velit eu mollis cum integer enim consectetuer. Class donec purus tortor at. Class fusce mus felis nulla ipsum nam. Netus morbi tempor dictum neque consequat dis non. Netus ipsum montes aptent neque vestibulum et lobortis posuere. Vitae ipsum nam enim gravida sed. Morbi donec ultrices ac suspendisse in tempus. Nulla morbi nullam quis.,http://lorempixel.com/300/300/people,Seaford Inlet|The Forest at Essex Knoll|Kissing Cave,Catherina Entrekin,Meta Thomure,2012-10-11 +5,http://lorempixel.com/300/300/people,2012-06-10,Massa class velit odio. Curae magna mauris aptent at donec sollicitudin. Risus nulla lacinia per placerat laoreet sodales lectus quam egestas. Nulla dolor aptent id faucibus lectus enim. Metus porta per vestibulum. Velit augue per cras nunc justo nostra vestibulum consectetuer quisque. Risus massa semper donec leo blandit ut urna nunc. Morbi fusce consequat rutrum elit eros felis fusce eros.,http://lorempixel.com/300/300/people,The Village at Queensborough Gardens|Songbird Parish|The Valley at Navajo Chapel,Carolann Stimage,Angelic Koonce,2012-03-22 +3,http://lorempixel.com/300/300/people,2012-07-18,Felis proin duis morbi metus a aliquet eu faucibus eros viverra fusce amet. Augue class duis mi class tellus. Porta velit montes dictum elit suspendisse vel et a enim felis. Massa felis quam commodo. Lorem vitae posuere ante vestibulum nam parturient etiam arcu volutpat suspendisse. Vitae lorem. Fames metus lacus sed. Nulla risus potenti elit eu donec.,http://lorempixel.com/300/300/people,Axbridge Homestead,Winfred Begaye,Kia Vandam,2012-05-24 +3,http://lorempixel.com/300/300/people,2012-02-21,Proin purus. Nulla dolor ultricies vivamus hac ultrices natoque. Lorem donec ligula mattis mus. Risus porta scelerisque. Porta massa a aenean erat at sollicitudin natoque eni eleifend porttitor libero curae massa. Purus nulla senectus tristique luctus molestie cras varius praesent tempus luctus. Lorem nulla metus nunc orci nec gravida. Metus nulla dis mattis mi mauris a parturient sed fusce.,http://lorempixel.com/300/300/people,The Prairie of Thanksgiving Gulf|Stork Haven|The Oaks at Bridgwater Vineyard,Elicia Melecio,Daniel Wyrick,2012-01-29 +1,http://lorempixel.com/300/300/people,2012-05-08,Purus porta dolor. Donec nulla. Neque etiam. Justo porta amet lacus magna sociosqu proin ad justo tellus nullam augue. Lacus curae. Curae purus ultrices nulla in ad tellus ve maecenas. Magna netus porta nam cras ligula augue pulvinar at condimentum ad. Lacus dolor orci eni.,http://lorempixel.com/300/300/people,Mar Verde|Aloha Cove,Randal Needleman,Tristan Teaster,2012-02-27 +1,http://lorempixel.com/300/300/people,2013-04-15,Vitae class sed elit donec lectus platea hac ut facilisi. Etiam lacus lectus mattis elementum id malesuada ve ornare a torquent nec velit vulputate aliquet litora lacus non. Donec class faucibus nulla pellentesque tristique. Lorem justo nostra lacinia ligula eros varius vestibulum nascetur nibh sem. Ipsum nulla maecenas tincidunt sollicitudin vestibulum eros imperdiet id. Velit justo auctor urna etiam eleifend. Justo morbi nostra. Vitae justo ornare suspendisse risus.,http://lorempixel.com/300/300/people,The Hills at Poplar Summit|Welcome Lakes,Ida Galang,Rolando Bjornson,2013-03-22 +3,http://lorempixel.com/300/300/people,2013-08-02,Velit proin. Magna vitae cursus id habitant nibh consequat eu odio gravida lorem per. Class neque ullamcorper vel nibh erat ornare tristique fusce lobortis et. Magna dolor ornare litora etiam nostra sed in gravida duis ad. Curae netus nullam donec adipiscing euismod eni sagittis integer. Class nulla quisque sapien. Morbi fusce. Neque vitae.,http://lorempixel.com/300/300/people,Rancho Grande,Corliss Jolin,Altha Ahumada,2013-05-05 +4,http://lorempixel.com/300/300/people,2012-04-23,Proin morbi faucibus eu nulla consectetuer elementum ornare proin cum. Felis justo pede posuere phasellus odio mus. Proin magna sodales litora nisi at nunc. Lacus ipsum accumsan metus justo nisi ac etiam leo. Augue ipsum suscipit mus netus parturient ac. Augue porta mauris auctor fusce adipiscing. Fusce magna bibendum. Augue nulla senectus in.,http://lorempixel.com/300/300/people,Dusky Vineyard|Madera Grande|Shady Pasture,Gilda Puffer,Henry Dew,2012-02-24 +3,http://lorempixel.com/300/300/people,2012-02-15,Neque fames. Netus dolor lectus cras. Velit risus. Risus proin aptent et accumsan rhoncus mi mattis nascetur sem. Porta ipsum. Fusce felis netus. Neque massa suspendisse molestie pede malesuada aenean molestie adipiscing semper dolor conubia. Curae massa conubia dui parturient tempor at sapien venenatis rhoncus.,http://lorempixel.com/300/300/people,Sea Spray Breakers|Macaw Waves,Jo May,Raquel Yoshioka,2012-01-08 +3,http://lorempixel.com/300/300/people,2012-04-28,Dolor etiam. Porta metus proin lacus neque sodales aliquam. Netus dolor tortor et ante felis. Proin ipsum odio ultricies. Augue magna ipsum morbi velit nostra ornare pede tempor eu. Dolor augue a rhoncus. Curae augue. Morbi metus lobortis fames ad fermentum scelerisque habitasse duis vitae.,http://lorempixel.com/300/300/people,Dusky Vineyard|Madera Grande|Shady Pasture,Birgit Shires,Henry Dew,2012-04-17 +2,http://lorempixel.com/300/300/people,2012-04-04,Justo fames. Etiam nulla felis eni morbi fames eni amet. Vitae velit a dapibus lectus pede ridiculus. Porta neque. Augue velit scelerisque orci pede nonummy cubilia nostra nisl elit diam. Magna netus nibh tempus volutpat. Lorem class nam proin semper pellentesque. Lacus vitae a nisi nulla lorem libero senectus magnis tellus.,http://lorempixel.com/300/300/people,Sailor's Firth,Fred Victory,Bennett Rieder,2012-03-25 +3,http://lorempixel.com/300/300/people,2012-12-19,Magna class mollis. Donec fusce. Felis massa phasellus posuere magna nisi ullamcorper posuere scelerisque. Neque porta est. Lacus nulla tempus id ac imperdiet. Class proin suscipit nec porta. Ipsum class dis curae magna placerat augue ipsum. Morbi nulla pharetra sem ad primis eu lacus faucibus metus nec.,http://lorempixel.com/300/300/people,Starling Outlook|Admiral's Island,Tonya Mcentee,Yolanda Stlouis,2012-11-12 +3,http://lorempixel.com/300/300/people,2012-03-27,Magna vitae odio amet commodo euismod elit eu mollis praesent ullamcorper sed dictum et dolor. Proin purus donec. Augue curae. Neque lorem eros cubilia ad. Magna neque. Dolor proin. Dolor lorem. Vitae class fusce odio tristique molestie magnis rutrum vitae.,http://lorempixel.com/300/300/people,Banyan Pier,Berniece Sulton,Reggie Sturgill,2012-01-02 +1,http://lorempixel.com/300/300/people,2012-07-18,Felis donec. Class vitae metus nunc congue ut diam curae fusce. Curae donec blandit semper ad. Nulla metus suspendisse eget quis cubilia vitae elit litora hac. Velit porta ornare rutrum laoreet eu ve amet faucibus. Fames etiam augue cum nisl adipiscing curabitur eget. Metus risus donec. Augue ipsum maecenas non feugiat id morbi ut cras mi dictumst.,http://lorempixel.com/300/300/people,Admiral's Island|The Meadow at Private Abbey|Fairford Terrace,Lucinda Stracener,Juliane Houle,2012-05-03 +2,http://lorempixel.com/300/300/people,2013-01-15,Ipsum morbi fames varius libero velit ultricies sem velit lorem torquent dis cubilia. Neque curae non ipsum tristique aptent. Lacus etiam integer orci vestibulum hac lorem fusce ligula. Magna dolor magnis. Velit justo litora vitae parturient scelerisque. Netus morbi sem magna lacinia sit fringilla quisque sollicitudin conubia. Risus etiam primis ve praesent egestas elit pharetra condimentum. Morbi netus sodales taciti ante magna tempor dolor magna diam elit cras nec risus phasellus volutpat.,http://lorempixel.com/300/300/people,Maple Ranch|The Point at Welcome Village|Passion Fruit Breakers,Bert Kohan,Muoi Bays,2013-01-06 +3,http://lorempixel.com/300/300/people,2012-03-09,Donec fames nostra tellus neque aenean libero ultrices. Justo metus libero. Risus donec a gravida litora proin ac massa ve sapien. Massa neque. Donec justo per nisl. Magna velit fames congue rutrum posuere diam sagittis. Augue netus. Vitae nulla netus condimentum ut.,http://lorempixel.com/300/300/people,Angler's Meadows|The Villas of Dover Prairie,Marleen Venters,Monte Player,2012-01-31 +5,http://lorempixel.com/300/300/people,2012-05-31,Justo lorem netus amet nibh mollis quisque cubilia cursus dui. Porta metus risus nullam tellus sagittis. Proin velit placerat felis magna pulvinar diam facilisi vel viverra. Purus magna tortor fames ac risus mi. Donec fusce arcu amet facilisi felis. Lacus vitae. Fames felis dictum mi ligula dapibus erat nisi etiam curae nullam dignissim ut vulputate euismod. Proin justo mus quam urna porta mauris vestibulum massa.,http://lorempixel.com/300/300/people,Arapahoe Acres|Ash Gulf|The Farms at Antelope Heath,Kemberly Lecuyer,Aleisha Leiser,2012-03-16 +5,http://lorempixel.com/300/300/people,2013-05-13,Fusce felis risus lacus sociosqu duis pulvinar porttitor. Purus augue tellus nonummy. Velit dolor platea quisque pretium mattis in massa amet. Metus vitae turpis odio pellentesque vestibulum odio felis nonummy mollis odio sodales curae. Felis etiam condimentum urna. Velit nulla nunc accumsan dictumst rhoncus. Proin metus pulvinar nulla donec a eros. Morbi purus condimentum sociosqu nunc.,http://lorempixel.com/300/300/people,Sierra Baja|Guava Reef|Fisherman's Promontory,Leena Newbury,Marylee Ziebarth,2013-04-21 +4,http://lorempixel.com/300/300/people,2013-03-13,Vitae nulla magna ornare consectetuer hymenaeos curae quis. Dolor proin orci leo habitant a sollicitudin arcu metus ad. Class dolor. Donec porta condimentum dis elit eleifend sit gravida at magna odio vel proin phasellus interdum ad per erat. Risus nulla lobortis class et luctus. Curae lacus. Proin purus enim nisi nonummy eros a elit proin tincidunt. Justo risus.,http://lorempixel.com/300/300/people,Paso Rojo|Axminster Crag,Lucinda Stracener,Jackeline Silvernail,2012-12-28 +1,http://lorempixel.com/300/300/people,2012-06-30,Felis lorem sit adipiscing curabitur suspendisse dis aptent dui nascetur tristique consectetuer vestibulum. Fusce magna scelerisque urna dignissim sagittis inceptos ipsum est. Ipsum velit a nonummy mi et eros volutpat. Felis porta. Ipsum lacus purus auctor lectus erat eu. Morbi velit nec parturient semper. Metus velit suspendisse sociosqu phasellus a convallis morbi. Purus morbi scelerisque ve.,http://lorempixel.com/300/300/people,Ash Woodlands|Avocado Waves|Parrot Firth,Seymour Bollig,Debbi Whitehill,2012-05-08 +4,http://lorempixel.com/300/300/people,2012-08-01,Fames vitae litora fusce commodo non. Magna proin. Purus ipsum. Class dolor dignissim eni sollicitudin. Fames neque lectus libero cum enim ante nibh cubilia nisi at nam erat sociis nonummy ac tempor. Class vitae ultricies posuere. Class donec suscipit et leo nibh curae aliquam magnis. Nulla porta congue.,http://lorempixel.com/300/300/people,Magnolia Springs|Madera Buena,Aura Gershman,Gisele Michaels,2012-07-13 +3,http://lorempixel.com/300/300/people,2012-05-27,Porta netus pretium sed ultrices. Risus netus. Neque metus. Nulla lacus. Porta justo netus. Dolor massa. Donec morbi arcu pharetra. Nulla justo tortor donec euismod justo ad sed malesuada dui.,http://lorempixel.com/300/300/people,Holly Forest|Evergreen Grove,Annamaria Gilliland,Penelope Woolf,2012-03-06 +2,http://lorempixel.com/300/300/people,2012-10-28,Augue justo eleifend at nec aenean magnis fermentum ad. Massa magna aliquam eros hac litora enim ipsum cursus ve sapien. Porta netus vel congue eu eget et nam condimentum cubilia nec. Curae etiam a duis adipiscing cum curae. Dolor magna sapien felis in aenean facilisi quam in nulla mollis diam. Metus ipsum lacus. Metus felis dis nisl facilisi tincidunt eu hendrerit ullamcorper venenatis. Class curae ipsum pulvinar lacus elit cum.,http://lorempixel.com/300/300/people,Beverley View,Mozelle Saez,Agripina Hoskin,2012-10-04 +2,http://lorempixel.com/300/300/people,2012-04-14,Massa lorem. Class nulla primis nisi ut porta magna lorem mollis in. Neque donec magna lorem ornare massa conubia nec interdum pretium morbi duis class. Proin porta interdum quam auctor et litora ipsum. Metus fusce tempus eu hymenaeos scelerisque cum. Etiam fusce bibendum nec erat nec torquent fermentum sollicitudin parturient eget class. Curae augue. Neque etiam est metus lectus condimentum.,http://lorempixel.com/300/300/people,Mesa Verde,Elicia Melecio,Linn Rideout,2012-04-02 +3,http://lorempixel.com/300/300/people,2012-04-03,Morbi magna interdum lacus ad lacus tempor velit nam. Etiam lorem luctus mollis justo condimentum nec odio cras maecenas mauris urna gravida. Magna proin eget nibh justo nibh ipsum ac per mi. Donec fames hac porta nibh magna ac nibh urna. Magna risus purus dui viverra magnis class scelerisque. Fames porta condimentum est magnis a gravida at nisl bibendum fames a dictum fringilla. Purus magna platea pellentesque ultricies nullam libero eros tincidunt ac justo sollicitudin metus urna. Lacus porta rutrum.,http://lorempixel.com/300/300/people,The Park at Sweet Vista,Luise Klippel,Elease Mullen,2012-02-09 +4,http://lorempixel.com/300/300/people,2012-12-06,Velit neque nunc lorem vulputate rutrum elit sociis adipiscing. Lorem purus cursus. Porta proin. Netus velit. Dolor risus accumsan augue. Metus fusce. Morbi curae. Fusce justo luctus lobortis rhoncus etiam diam sem cum imperdiet arcu nec.,http://lorempixel.com/300/300/people,Hunter Downs|Lonely Homestead|Passion Fruit Quay,Tasha Dennard,Yang Brosnan,2012-10-06 +4,http://lorempixel.com/300/300/people,2013-05-31,Porta massa dolor risus. Morbi fames turpis est quisque cras ante. Porta donec urna mollis at tellus ve mus scelerisque euismod augue massa sed odio duis. Fusce justo nisl scelerisque iaculis sollicitudin gravida metus nec. Proin class elementum vestibulum conubia urna. Fusce fames turpis ut elementum a convallis curae id purus pellentesque maecenas etiam. Magna nulla ultrices velit magnis eu cras accumsan magnis aliquet. Justo lorem.,http://lorempixel.com/300/300/people,Dove Vale|Placid Junction,Ellsworth Rehman,Terresa Cabe,2013-03-21 +3,http://lorempixel.com/300/300/people,2012-10-30,Dolor metus sem quam quis magna condimentum pulvinar gravida class odio suspendisse nec quis praesent. Porta felis dapibus. Class justo. Class felis congue justo viverra egestas. Netus velit sem pede phasellus ac venenatis id dictum posuere cubilia facilisis. Lorem neque taciti parturient pellentesque posuere nulla ve taciti. Nulla augue sapien vulputate dolor ad nunc. Magna metus.,http://lorempixel.com/300/300/people,Angler's Meadows|The Villas of Dover Prairie,Randal Needleman,Monte Player,2012-09-02 +4,http://lorempixel.com/300/300/people,2013-04-25,Donec fusce sit erat donec aliquam nullam. Donec massa leo enim pede. Proin lorem sed eros ipsum metus. Nulla neque a laoreet mauris fusce pretium. Vitae etiam tellus mollis morbi consequat eros eni. Massa lorem auctor semper class viverra etiam porta eni orci metus ac vel quis a ante fusce. Massa dolor habitant nisi dui id. Morbi purus quisque sit fermentum ligula augue adipiscing accumsan.,http://lorempixel.com/300/300/people,Starling Outlook|Admiral's Island,Elicia Geist,Yolanda Stlouis,2013-03-27 +2,http://lorempixel.com/300/300/people,2013-01-03,Magna donec a gravida eu nulla. Netus magna auctor netus justo vivamus. Curae neque mus litora quisque ac eget sodales magna fames mattis urna orci lacinia taciti magna amet nunc ridiculus. Morbi ipsum tortor fames cras ullamcorper feugiat class lacinia. Netus etiam massa erat bibendum. Dolor felis sed nibh elit. Massa neque vitae ante litora tincidunt. Justo nulla.,http://lorempixel.com/300/300/people,Shady Pasture,Maryann Brunk,Roxann Leong,2012-10-12 +2,http://lorempixel.com/300/300/people,2013-06-22,Felis ipsum lobortis fringilla nec imperdiet viverra odio vestibulum ornare. Proin nulla blandit semper ornare purus aliquam conubia taciti sed parturient vulputate. Lorem felis proin porttitor nisl nunc gravida lacus hac cras nec dolor porta maecenas porttitor risus. Nulla etiam. Curae risus tempor quis pede viverra ad mi cras. Netus massa natoque facilisi natoque sollicitudin phasellus fusce nulla euismod litora nulla sodales quam. Metus magna ante mi dolor ut turpis et amet metus condimentum per aenean. Magna morbi nulla justo condimentum eu primis.,http://lorempixel.com/300/300/people,Macaw Island|Opportunity Butte|Paso Nuevo,Michal Blish,Serina Gamon,2013-03-29 +2,http://lorempixel.com/300/300/people,2012-12-20,Fames velit sociis. Ipsum class sociosqu non viverra at. Fusce magna semper ut donec nisi velit ut semper nec ornare. Justo fames mattis natoque elit. Velit risus penatibus rhoncus auctor ac sem suspendisse pretium sollicitudin aptent congue ac est at nascetur natoque fusce. Ipsum augue a dapibus in vulputate porta consequat. Curae class dictum etiam hendrerit. Lorem morbi enim augue fusce quam nec nunc adipiscing per donec.,http://lorempixel.com/300/300/people,Whistling View|The Ridge at Sweet Mesa,Kemberly Lecuyer,Gwen Mok,2012-10-29 +3,http://lorempixel.com/300/300/people,2013-03-22,Neque massa praesent mi ullamcorper quam urna nonummy. Fusce proin lacus purus nisi vitae euismod vel adipiscing dolor. Porta felis. Fames neque augue cursus consectetuer euismod tincidunt tempor praesent habitasse volutpat ligula. Class netus arcu quam. Proin fames litora. Magna netus aptent rhoncus. Lacus velit odio ad dolor urna.,http://lorempixel.com/300/300/people,Thanksgiving Cove|Windsor Overlook,Lili Scally,Chuck Navas,2013-02-17 +3,http://lorempixel.com/300/300/people,2013-01-24,Massa donec congue magna justo varius metus conubia eu litora sagittis fermentum pellentesque. Felis vitae neque posuere facilisi magna blandit semper sed parturient et tristique a eni. Magna lacus accumsan vel proin aliquam lectus sit sapien gravida eros. Morbi proin dictumst metus id ornare lacinia quam molestie. Morbi nulla. Ipsum class scelerisque ac cursus sociosqu platea auctor. Metus class a tellus nisl sollicitudin sociosqu massa. Curae dolor libero donec class dis nisl commodo rutrum sed id.,http://lorempixel.com/300/300/people,Charming Acres|Leeward Cove|The Lakes at Royal Dunes,Elouise Connon,Alex Groom,2012-12-31 +4,http://lorempixel.com/300/300/people,2013-03-23,Massa donec aliquam semper ve neque molestie lorem ligula iaculis in dictum pellentesque fringilla. Lorem velit tellus sollicitudin conubia sociosqu mauris. Donec metus varius velit vivamus egestas enim sit suscipit posuere potenti eget. Justo velit hac cum. Curae massa aptent nibh scelerisque ut libero. Lacus purus sed erat sit quis a eros at. Donec porta fusce sodales. Augue vitae cum curae parturient in praesent conubia augue.,http://lorempixel.com/300/300/people,The Dale at Antelope Quarter|Avocado Delta|Tern Coast,Clark Groce,Mavis Schramm,2013-02-25 +5,http://lorempixel.com/300/300/people,2012-09-14,Etiam class eni quam. Risus purus vehicula enim hac ante nisl. Fames ipsum quam sit quis conubia ac. Velit curae conubia tempus lorem imperdiet primis. Felis proin a taciti. Curae felis congue tortor. Metus class inceptos at etiam id curabitur integer proin. Neque etiam a posuere in.,http://lorempixel.com/300/300/people,Graceful Lagoon|Admiral's Island|Madera Azul,Chang Morquecho,Marget Lehn,2012-07-14 +3,http://lorempixel.com/300/300/people,2012-07-05,Donec curae malesuada potenti magnis nulla dapibus quis at elit lacinia. Curae felis hymenaeos vestibulum quis fusce. Neque morbi nullam metus sit. Netus massa nunc fusce nonummy fringilla sed urna sed netus sodales consequat. Metus magna cursus eu at tempus a volutpat amet. Velit fames quam nostra cubilia tortor. Justo fames lectus ridiculus vehicula augue sollicitudin justo pede eros. Dolor massa ante rhoncus etiam felis magna neque lorem odio cum.,http://lorempixel.com/300/300/people,Lovely Farms|The Vista at Lovely Lagoon,Brenda Orzechowski,Carin Voegele,2012-04-29 +5,http://lorempixel.com/300/300/people,2012-12-28,Massa metus. Morbi proin morbi pretium at dui velit elementum placerat in scelerisque. Curae fusce euismod cras lacus orci egestas litora mi praesent sapien. Felis class blandit. Etiam nulla. Massa augue. Netus morbi posuere ridiculus inceptos nulla est. Fusce proin erat dui habitasse donec ipsum cubilia per aliquam.,http://lorempixel.com/300/300/people,Shady Pasture,Lucinda Stracener,Roxann Leong,2012-12-01 +1,http://lorempixel.com/300/300/people,2012-07-28,Risus massa nisi ridiculus consequat lacus in. Donec netus cursus ut ad aenean phasellus in fusce mus quam eni semper nec enim. Risus massa. Etiam fames nulla nostra nisi condimentum feugiat. Dolor porta. Nulla metus non morbi. Velit donec erat conubia laoreet eget ac fusce aptent. Felis risus nunc tellus.,http://lorempixel.com/300/300/people,Peaceful Crossing|Quail Abbey|Treasure Firth,Maxie Hollifield,Twyla Hartness,2012-05-14 +4,http://lorempixel.com/300/300/people,2012-05-19,Felis massa. Donec justo eros nonummy malesuada. Dolor neque. Etiam metus tempor dis id. Fames proin nisi est montes. Curae lacus mauris suspendisse. Fusce proin cum nisl parturient auctor sed. Etiam justo augue netus magnis mi habitant integer quam est quis.,http://lorempixel.com/300/300/people,Cherokee Rock,Laurinda Franson,Tamie Kist,2012-04-20 +3,http://lorempixel.com/300/300/people,2012-04-20,Vitae velit metus lectus. Netus velit. Nulla netus turpis vestibulum ipsum orci dis. Curae class sem cras per aptent. Magna curae a dictum hendrerit volutpat. Velit augue ligula scelerisque class. Risus ipsum donec congue. Magna metus.,http://lorempixel.com/300/300/people,Grizzly Harbor|The Streams at Moose View,Rodrick Turberville,Sharri Dietrich,2012-03-21 +1,http://lorempixel.com/300/300/people,2013-04-12,Netus morbi nec nibh pellentesque eu posuere. Fames proin. Augue etiam. Risus porta. Neque curae lacinia nibh cum blandit. Massa augue fusce phasellus lectus adipiscing neque natoque nostra erat montes primis. Neque risus lobortis felis ipsum odio pede est per. Justo risus sapien ante amet lacus rutrum habitasse ipsum sapien.,http://lorempixel.com/300/300/people,Banana Anchorage|Rancho Blanco,Hana Turnipseed,Rebbecca Friedlander,2013-03-08 +1,http://lorempixel.com/300/300/people,2013-01-28,Risus justo lacinia tortor vel cras nisl risus massa nec nulla tempor proin adipiscing. Neque augue natoque aptent quis. Netus ipsum magnis id sapien. Neque massa gravida magnis nibh ante. Lorem donec ipsum gravida hac habitant quisque fringilla praesent libero tortor est mattis. Felis fusce class interdum morbi justo metus proin primis inceptos condimentum senectus natoque. Ipsum donec orci hac a tempus hymenaeos potenti tempor ante in duis porttitor lacus. Class etiam.,http://lorempixel.com/300/300/people,Salisbury Mesa|Owl Brook|Macaw Shore,Danyel Branstetter,Henriette Diedrich,2012-11-27 +4,http://lorempixel.com/300/300/people,2012-12-24,Massa fusce sociosqu class leo purus aenean ornare non orci parturient semper in porta semper. Ipsum risus lorem mauris class lorem aenean ornare. Vitae magna tortor duis in cras porta fusce blandit. Donec magna duis velit class sem arcu natoque dapibus. Vitae curae. Velit fames pede libero at in. Felis velit turpis interdum lacus nisl donec vulputate at. Ipsum donec quis feugiat integer amet.,http://lorempixel.com/300/300/people,Fireside Anchorage|The Sanctuary at Lonely Timbers|The Forest at Essex Knoll,Brenda Orzechowski,Cortney Cobble,2012-10-02 +1,http://lorempixel.com/300/300/people,2012-11-23,Lacus dolor nam litora natoque nisl id quis nunc magnis. Neque augue nam elit libero. Risus porta leo velit. Nulla porta ornare ipsum nullam dolor vestibulum eget justo ipsum. Risus dolor senectus fames dignissim adipiscing sodales. Augue velit nonummy laoreet dignissim eu scelerisque enim diam commodo ante laoreet erat at lacus vitae gravida nisi. Etiam lorem. Netus etiam habitant hymenaeos sem risus fringilla eu.,http://lorempixel.com/300/300/people,Regal Estates,Kamilah Croke,Shizue Sadberry,2012-09-02 +1,http://lorempixel.com/300/300/people,2012-10-04,Magna fames odio diam curae lacus sem velit nonummy diam. Velit morbi augue. Massa fames sit praesent. Fames lacus sodales vel rutrum etiam ad curabitur potenti pede. Nulla velit vehicula magna neque primis libero lorem. Vitae fusce. Dolor porta. Fames morbi platea litora neque nibh pede.,http://lorempixel.com/300/300/people,Magnolia Mount|Shady Pasture,Marnie Kemble,Beatrice Kinne,2012-07-18 +4,http://lorempixel.com/300/300/people,2012-09-06,Risus morbi. Magna class non quam netus eu. Metus morbi. Massa lorem luctus augue class vel praesent a sollicitudin nunc dolor elementum natoque. Netus fusce. Augue neque penatibus purus morbi augue praesent tincidunt vel class. Porta velit ipsum litora quisque porttitor nullam varius ad feugiat. Dolor velit facilisi venenatis magnis parturient.,http://lorempixel.com/300/300/people,Acacia Streams|The Valley at Navajo Chapel|The Farms at Plymouth Vineyard,Tomika Shimer,Dawna Vales,2012-07-07 +2,http://lorempixel.com/300/300/people,2012-08-03,Morbi proin a ornare duis eget posuere eu turpis hymenaeos eni interdum a consectetuer. Augue purus elit. Velit purus augue nunc orci. Augue class nostra consectetuer consequat tempus pharetra. Porta netus auctor augue ve congue. Lacus risus ultricies vehicula nostra libero class curabitur dui porta integer quisque sociis vitae facilisi. Ipsum vitae quisque sociis ve ante. Curae proin mollis in nisl dapibus.,http://lorempixel.com/300/300/people,Whaler's Cove,Gia Kennamer,Silvia Miranda,2012-05-22 +2,http://lorempixel.com/300/300/people,2013-02-13,Fames neque. Donec purus nibh donec leo cras vitae urna. Curae justo magna. Curae morbi eget hymenaeos suscipit aenean arcu ridiculus sagittis libero rutrum fames. Fames curae. Etiam nulla. Nulla massa mollis curae nonummy lacus. Metus velit.,http://lorempixel.com/300/300/people,Puente Rojo|Moose Hearth|Seagull Landing,Sharan Fucci,Andree Kingman,2013-01-01 +5,http://lorempixel.com/300/300/people,2012-11-01,Magna velit nam purus adipiscing laoreet elit consectetuer parturient ante neque phasellus. Fames felis. Lacus nulla ullamcorper sit arcu dolor fermentum sociosqu nunc ve neque suscipit. Lorem risus dolor tempor eu dictumst. Lacus massa tellus porta lorem. Proin morbi tempor penatibus turpis fusce placerat. Fusce justo egestas sed id sollicitudin sodales lacus. Ipsum lacus.,http://lorempixel.com/300/300/people,Magnolia Mount|Shady Pasture,Tarra Hubbert,Beatrice Kinne,2012-09-20 +2,http://lorempixel.com/300/300/people,2012-03-28,Curae donec. Nulla lacus sapien dictum dui nisi a magna conubia pretium. Etiam velit erat conubia. Massa porta proin massa. Vitae curae. Justo vitae augue cubilia. Netus neque. Magna morbi dui nisi hendrerit nec consectetuer velit eu.,http://lorempixel.com/300/300/people,Pueblo Norte,Aja Hesler,Saturnina Somma,2012-02-09 +3,http://lorempixel.com/300/300/people,2012-06-29,Dolor risus non auctor interdum fermentum at duis hendrerit faucibus curae porta suspendisse nec cursus ve in. Morbi risus. Vitae donec. Class purus semper maecenas mi primis aliquam natoque sagittis mollis. Augue velit integer laoreet habitasse erat. Class velit facilisis scelerisque mus tortor viverra lectus nisi ullamcorper. Justo lacus enim metus tincidunt odio metus class scelerisque. Proin metus maecenas adipiscing ornare leo dis dapibus aenean.,http://lorempixel.com/300/300/people,Macaw Island|Opportunity Butte|Paso Nuevo,Candice Vidrio,Serina Gamon,2012-05-30 +5,http://lorempixel.com/300/300/people,2012-07-16,Ipsum risus turpis lectus ipsum litora luctus vitae tincidunt. Velit vitae metus tortor eu praesent natoque eros porta vivamus facilisi tempus. Ipsum neque dolor praesent sit dictum praesent porttitor a dolor ve. Fames lorem quis aliquet pretium ligula nec. Massa lacus duis dui ante consectetuer at felis. Fames risus nonummy cum sociosqu. Curae morbi tempor magnis. Neque fusce.,http://lorempixel.com/300/300/people,Macaw Reef|The Suburb at Evergreen Village,Tasha Dennard,Molly Monteleone,2012-06-03 +2,http://lorempixel.com/300/300/people,2013-06-10,Netus curae cras ullamcorper sit mi orci. Risus augue lacus. Porta fames duis amet euismod aenean ridiculus natoque sollicitudin auctor. Augue class mauris pharetra curae eu odio ipsum lacinia luctus. Morbi magna velit varius tempor arcu tincidunt sem egestas ultrices at hac mi. Dolor magna tempor id enim suscipit parturient imperdiet. Justo augue. Class netus placerat cras nostra.,http://lorempixel.com/300/300/people,Banyan Pier,Willena Acoff,Reggie Sturgill,2013-04-29 +4,http://lorempixel.com/300/300/people,2012-09-18,Nulla magna nisl leo enim. Justo porta sit nunc cras elit ante. Class proin mattis elit. Proin class luctus ve mattis risus suspendisse ut. Ipsum velit est neque viverra aenean cursus aliquet quam vel. Felis metus hac primis potenti sodales habitasse enim sodales. Porta fames condimentum faucibus tincidunt nisl metus at magnis. Metus class.,http://lorempixel.com/300/300/people,Banyan Bay|The Acres at Leafy Ridge|Macaw Island,Janean Nordby,Francesco Marcinkowski,2012-07-18 +2,http://lorempixel.com/300/300/people,2012-12-25,Proin fames a congue justo feugiat. Netus purus blandit dictum nullam molestie scelerisque ultrices phasellus. Dolor vitae platea posuere arcu. Vitae purus. Lorem proin euismod dignissim eros magna justo feugiat. Class metus diam tempus. Risus felis. Netus massa per.,http://lorempixel.com/300/300/people,Sioux Cottages|Wooded Point,Rene Friedrichs,Janine Heitz,2012-11-17 +5,http://lorempixel.com/300/300/people,2012-07-12,Magna curae potenti semper eget condimentum ad magnis egestas eu. Etiam donec platea aenean duis. Fames massa. Metus neque nostra condimentum class consequat nisi dui pretium ut mi nisl torquent rhoncus eget. Porta proin pharetra donec est phasellus augue. Vitae neque mollis malesuada congue etiam quisque mollis consequat posuere sollicitudin imperdiet massa orci fames. Felis velit sociosqu per diam vitae purus suspendisse molestie duis hendrerit placerat senectus. Massa augue mauris magnis.,http://lorempixel.com/300/300/people,Pomegranate Island,Clark Groce,Janine Heitz,2012-06-15 +2,http://lorempixel.com/300/300/people,2012-03-11,Donec netus sodales purus nibh sodales et. Curae risus. Metus neque sapien enim sollicitudin adipiscing urna proin. Ipsum vitae a nullam magna adipiscing mi varius. Purus massa mollis ut sed dignissim nam sollicitudin eu vivamus enim lorem integer. Purus felis sapien accumsan suspendisse habitant arcu. Class felis tellus elit nonummy ve ac. Dolor ipsum nibh curae cubilia elit.,http://lorempixel.com/300/300/people,Willow Meadows|The Cove at Maple Terrace|The Firth of Peaceful City,Josephine Mcauley,Lesli Mcdonnell,2012-02-24 +4,http://lorempixel.com/300/300/people,2012-06-20,Proin fames primis donec sem viverra vitae elit nonummy luctus. Neque risus aliquam potenti hymenaeos inceptos nascetur risus non convallis lectus. Dolor neque habitant morbi eu nostra eni sapien egestas. Neque felis tincidunt vestibulum elit. Nulla etiam conubia tempus tellus. Metus etiam. Curae morbi ullamcorper est nisi mi orci class nonummy eleifend massa. Neque curae neque a vivamus ad mattis hymenaeos ad pede.,http://lorempixel.com/300/300/people,Tanager Vale,Tomika Shimer,Blaine Sevin,2012-04-22 +3,http://lorempixel.com/300/300/people,2013-02-08,Purus lorem rutrum ligula. Netus risus. Neque ipsum interdum ante non semper. Proin magna. Metus proin inceptos id nec pede. Porta felis. Felis ipsum cubilia pretium auctor leo vestibulum proin. Fusce ipsum nullam ac sit at ante posuere.,http://lorempixel.com/300/300/people,Pleasant Parish,Lili Scally,Candice Madonna,2012-11-13 +1,http://lorempixel.com/300/300/people,2013-01-03,Fames dolor. Fusce risus non. Augue lorem. Vitae justo non proin tincidunt odio libero. Curae lacus urna malesuada. Curae velit netus purus curabitur tristique quis non ve metus. Curae etiam porta egestas pulvinar dolor fringilla dis iaculis sagittis turpis. Augue donec pharetra massa consectetuer massa orci cras sodales euismod.,http://lorempixel.com/300/300/people,Banyan Pier,Isidro Hanlin,Reggie Sturgill,2012-11-13 +1,http://lorempixel.com/300/300/people,2012-08-22,Vitae lacus viverra varius quam. Lorem curae ornare in primis in suscipit quisque ultrices. Curae neque netus justo facilisi nibh dui ipsum dolor purus sagittis mi velit. Curae nulla neque aenean condimentum nulla varius. Ipsum purus. Metus class ullamcorper eget nullam adipiscing pellentesque quisque nec id. Neque class nostra amet cras justo. Donec proin cras hendrerit tellus.,http://lorempixel.com/300/300/people,Lychee Gulf,Reiko Oppenheimer,Samatha Buskey,2012-07-22 +4,http://lorempixel.com/300/300/people,2013-06-16,Fusce felis tellus vestibulum purus. Donec ipsum. Etiam massa diam natoque elementum. Purus netus arcu et nibh ad elit nascetur mi felis id a semper nibh. Lacus etiam scelerisque non taciti vivamus at imperdiet ridiculus nulla ridiculus. Nulla vitae sociosqu porta orci aenean mattis phasellus. Massa curae torquent. Vitae velit placerat enim cum lacus vestibulum quisque.,http://lorempixel.com/300/300/people,Salisbury Mesa|Owl Brook|Macaw Shore,Zoila Meadow,Henriette Diedrich,2013-04-23 +2,http://lorempixel.com/300/300/people,2012-04-11,Metus dolor tellus sed adipiscing parturient id cras. Purus dolor nostra sagittis dignissim montes class egestas nisl interdum pulvinar risus nonummy at. Lorem purus nostra euismod. Magna morbi risus. Risus ipsum aenean ve fringilla iaculis fames eget. Morbi risus. Dolor morbi metus massa tempor laoreet dapibus eget ac augue ornare. Magna netus per adipiscing imperdiet ullamcorper venenatis eget.,http://lorempixel.com/300/300/people,Sierra Grande,Randal Needleman,Germaine Exum,2012-01-23 +1,http://lorempixel.com/300/300/people,2012-08-16,Felis porta. Justo magna sapien vitae adipiscing ut lectus maecenas lorem. Metus vitae gravida inceptos eu neque. Donec augue orci et sollicitudin. Massa justo. Purus metus varius ut amet suscipit vestibulum habitasse erat dignissim sollicitudin vestibulum amet. Proin porta purus lectus platea metus fames est erat conubia turpis metus dapibus diam. Netus curae risus aptent proin posuere eni facilisis tempor morbi euismod.,http://lorempixel.com/300/300/people,Sussex Grove|Chippewa Promontory|Sea Lion Cliffs,Elicia Geist,Arnette Patricia,2012-08-02 +3,http://lorempixel.com/300/300/people,2012-11-19,Neque lorem nibh posuere. Curae lorem leo ornare a nascetur dui mi velit. Netus lacus. Dolor proin nec. Morbi justo neque scelerisque senectus imperdiet orci scelerisque commodo pellentesque nonummy lobortis varius. Velit class egestas eu. Ipsum felis elit. Magna porta cum amet sit proin aenean in natoque nisl eget curae.,http://lorempixel.com/300/300/people,Vista Fresca,Tyree Aumick,Venessa Mahmood,2012-09-28 +5,http://lorempixel.com/300/300/people,2012-11-18,Massa fusce. Fusce metus netus iaculis nisl at pellentesque blandit. Donec curae dolor a quis parturient. Class etiam luctus semper dolor in ve erat inceptos adipiscing elementum elit. Neque metus fames rutrum euismod varius lorem vel cras varius in duis. Nulla magna malesuada nonummy taciti nunc scelerisque nonummy sollicitudin luctus lorem ac curabitur. Vitae etiam tempor mollis neque dapibus pulvinar donec ut a ante. Dolor magna sem iaculis non ad.,http://lorempixel.com/300/300/people,Seagull Firth|Madera Roja,Adina Jezierski,Contessa Venable,2012-08-26 +4,http://lorempixel.com/300/300/people,2013-06-20,Vitae morbi suspendisse nisi porttitor venenatis class ve taciti inceptos. Augue justo commodo leo eu fames sociosqu ad scelerisque. Morbi velit. Magna proin diam cum pellentesque lacus erat facilisis et erat felis sapien velit. Netus magna primis eu commodo arcu. Curae morbi nisl dis fames dis nulla eros quisque porta. Curae purus fames. Lacus porta luctus duis at suscipit eros quis nunc platea.,http://lorempixel.com/300/300/people,Rancho Grande,Brenda Orzechowski,Altha Ahumada,2013-05-01 +4,http://lorempixel.com/300/300/people,2012-07-24,Velit ipsum metus nulla odio lectus ut libero dolor quisque. Purus lacus senectus non etiam adipiscing potenti nisi per mus pellentesque eu fusce vel convallis varius. Massa velit auctor cubilia nam facilisi vitae. Magna curae nonummy. Etiam fames fusce vivamus nibh. Dolor porta curae augue tortor velit rhoncus augue. Neque morbi. Nulla neque rutrum suspendisse justo primis.,http://lorempixel.com/300/300/people,Paso Rojo,Elouise Connon,Trina Studdard,2012-06-11 +5,http://lorempixel.com/300/300/people,2013-06-30,Vitae augue cras id odio libero ve tempus magna. Class dolor curabitur libero ve nascetur. Class morbi quam mollis fringilla at morbi. Netus ipsum sociis ipsum adipiscing ultrices purus cursus cum varius dis adipiscing vestibulum ac eleifend iaculis. Massa nulla lorem quam pede egestas. Metus lacus a odio adipiscing nec adipiscing ve molestie libero congue class tincidunt inceptos. Proin lorem. Augue porta.,http://lorempixel.com/300/300/people,Palm Bay,Tasha Dennard,Marcia Chabot,2013-04-23 +1,http://lorempixel.com/300/300/people,2012-09-20,Justo augue facilisi orci vivamus dictum eni ve orci eget urna potenti a suspendisse nam. Ipsum fusce sit pede urna tincidunt sollicitudin. Lacus felis dis rutrum imperdiet. Netus felis tortor parturient sollicitudin. Augue fusce taciti. Dolor neque. Netus morbi. Fames donec tempor.,http://lorempixel.com/300/300/people,The Inlet of Thanksgiving Downs|Guava Harbor,Tonya Mcentee,Lionel Hellen,2012-07-29 +1,http://lorempixel.com/300/300/people,2012-05-29,Lorem lacus nostra dolor nonummy. Felis proin cum potenti varius primis facilisi hymenaeos curae senectus id. Donec curae arcu. Augue donec. Metus nulla cursus adipiscing porta egestas leo ac a turpis urna. Neque risus sapien lobortis ullamcorper volutpat massa nullam. Justo felis. Curae class cursus proin tempor mollis class platea.,http://lorempixel.com/300/300/people,The Sanctuary at Hastings Point|The Outlook at Andover Orchards|Buffalo Orchards,Annamaria Gilliland,Waylon Lubin,2012-05-16 +5,http://lorempixel.com/300/300/people,2013-03-04,Etiam purus nascetur leo dapibus mi eni odio at nulla in mauris vulputate porta mus augue nec quis. Netus neque odio a diam. Porta vitae neque gravida orci pede. Etiam augue. Proin purus commodo conubia eget a. Velit morbi magnis tempus dis elit. Netus vitae. Justo donec eni.,http://lorempixel.com/300/300/people,Seagull Waves|Tern Coast|Macaw Firth,Marnie Kemble,Genie Gentry,2013-02-28 +3,http://lorempixel.com/300/300/people,2013-02-11,Magna nulla cum fusce imperdiet. Massa etiam pulvinar ipsum et ipsum lectus at dictumst rhoncus eu est suspendisse lacinia. Donec lacus a mattis ultricies. Dolor lacus condimentum eget primis commodo quisque facilisis. Netus augue arcu sit placerat a volutpat. Nulla curae magna blandit fames eni ligula laoreet feugiat commodo. Etiam lorem molestie dui etiam aliquam. Lorem ipsum nisl nunc eleifend.,http://lorempixel.com/300/300/people,Sunset Bay|Puerto Conejo,Danette Giltner,Kimberli Minelli,2012-12-09 +5,http://lorempixel.com/300/300/people,2013-04-26,Neque ipsum sociis turpis class ornare donec. Morbi lacus platea mattis vitae nullam. Felis porta mauris tortor nascetur augue tristique fames. Proin etiam leo dolor pede sed lorem justo. Fusce ipsum per adipiscing parturient eu. Nulla ipsum cursus nostra duis erat blandit posuere aenean amet aliquet. Morbi fusce. Fames felis a potenti eu vel.,http://lorempixel.com/300/300/people,The Brook of Axbridge Bluff,Hana Turnipseed,Gus Ensign,2013-02-21 +2,http://lorempixel.com/300/300/people,2012-04-21,Risus nulla bibendum cras cubilia eros leo. Justo risus porta scelerisque pharetra elit mattis. Purus velit cursus primis metus iaculis est ut. Donec ipsum vitae quis mi eni nisi pretium at enim. Fusce netus sociosqu class duis class morbi mattis et. Fames lorem diam purus iaculis leo sagittis sodales sociis diam erat. Fusce dolor enim erat lorem placerat at. Lorem purus arcu neque natoque eget nunc pede mi risus pellentesque habitasse felis hendrerit.,http://lorempixel.com/300/300/people,Lynx Mount,Berniece Sulton,Teresita Cory,2012-01-27 +2,http://lorempixel.com/300/300/people,2012-10-28,Morbi curae euismod nibh aliquet. Velit porta eget. Purus proin. Velit lacus hac ante dui. Neque porta. Metus justo. Morbi fusce proin tempor lorem pharetra. Neque dolor torquent augue consequat vel integer placerat duis at placerat tempus molestie.,http://lorempixel.com/300/300/people,Pine Boulder|Plymouth Cave,Christel Henrickson,Elia Kelsch,2012-08-31 +1,http://lorempixel.com/300/300/people,2012-06-18,Curae dolor. Purus class suspendisse at mollis. Curae augue luctus ad mus ad sollicitudin congue ve lacinia eget. Vitae neque rutrum facilisis maecenas ad metus rutrum eleifend. Massa augue sem massa taciti risus tristique. Purus curae lacinia eros parturient congue dolor ante ac. Magna purus. Metus risus libero litora neque.,http://lorempixel.com/300/300/people,Walnut Streams|Oak Haven|Iroquois Vineyard,Michal Blish,Tonie Pille,2012-04-08 +1,http://lorempixel.com/300/300/people,2013-06-22,Lacus etiam nam orci at nisi. Fames etiam justo litora porta etiam nostra ullamcorper. Lorem metus turpis urna class feugiat leo parturient vestibulum ve dictum euismod. Class morbi a cras adipiscing ve lobortis eni porta sit. Justo neque suscipit parturient iaculis quis ante luctus sodales. Fames morbi. Class lacus iaculis quam cum leo hac. Massa purus aptent semper augue feugiat posuere eros adipiscing leo purus.,http://lorempixel.com/300/300/people,Cherokee Rock,Leena Newbury,Tamie Kist,2013-04-24 +2,http://lorempixel.com/300/300/people,2013-03-22,Velit donec eros sodales magnis eni parturient ad. Class augue netus nulla viverra lacinia sociis. Etiam netus auctor. Justo purus egestas sociosqu morbi lorem. Neque donec dis cras molestie. Fusce magna ornare mollis ridiculus senectus varius nullam. Fusce morbi. Massa etiam.,http://lorempixel.com/300/300/people,Puerto Rojo|Angler's Corner|The Knoll at Blue Spruce Inlet,Adriene Rizo,Hilda Hisey,2013-02-18 +4,http://lorempixel.com/300/300/people,2012-10-21,Netus risus dui proin elit amet facilisi. Risus magna hymenaeos cum consectetuer vitae id tincidunt amet lacinia. Justo proin consequat non sed convallis donec purus nam quis. Purus felis cras eni non ad ipsum sagittis sed commodo magnis. Metus lorem a diam et risus consectetuer. Fusce metus scelerisque lobortis vivamus sagittis mauris posuere cubilia mauris neque. Ipsum morbi. Fames felis litora magna hendrerit ve neque ac est eros dis duis interdum lorem enim.,http://lorempixel.com/300/300/people,Admiral's Island|Lovely Corner,Sharan Fucci,Norman Rugh,2012-10-14 +2,http://lorempixel.com/300/300/people,2012-05-06,Lacus proin enim accumsan magna mi magna. Morbi velit natoque lacinia. Fames etiam pretium eget risus lorem. Purus augue orci eros aliquet mi per ut primis placerat adipiscing imperdiet scelerisque. Dolor lorem lectus ut aptent. Metus netus inceptos porta arcu augue leo quis at erat vivamus. Neque purus duis euismod at inceptos sem. Morbi magna odio quam urna.,http://lorempixel.com/300/300/people,Moose Crest|Parrot Dunes|The Crossing at Lonesome Village,Era Mustafa,Matilda Redmond,2012-04-25 +5,http://lorempixel.com/300/300/people,2013-04-04,Augue velit odio quam eget volutpat penatibus a. Ipsum porta. Vitae morbi risus etiam dictum tempor. Lacus magna. Morbi etiam nibh eu. Class lorem class nec nunc eu leo nibh cum ut. Vitae felis magna. Velit netus.,http://lorempixel.com/300/300/people,Macaw Island|Gull Coast|Stafford Suburb,Willena Acoff,Clorinda Croxton,2013-01-19 +5,http://lorempixel.com/300/300/people,2012-03-10,Massa lorem senectus. Vitae donec netus sapien lectus tincidunt vitae sed. Fames proin tempus cursus. Porta class suspendisse enim. Dolor risus pulvinar nisi mus. Purus class suscipit eu metus. Felis lorem netus donec amet. Augue lacus curabitur nec consectetuer.,http://lorempixel.com/300/300/people,Holly Forest|Evergreen Grove,Leena Newbury,Penelope Woolf,2012-02-24 +5,http://lorempixel.com/300/300/people,2012-10-11,Nulla magna dui morbi primis fames quam posuere viverra. Donec etiam litora habitant proin nullam ante. Class magna orci. Porta fusce. Porta vitae porta a pede eu netus ad a auctor velit nam velit sit feugiat fames. Class justo senectus eni odio vel nibh. Magna fusce velit magnis dictumst risus torquent velit et hymenaeos laoreet libero. Fames magna volutpat magna ac elementum a porttitor porta convallis sociosqu auctor dictumst ve.,http://lorempixel.com/300/300/people,Walrus Cliffs|The Springs at Summer Villas|Crystal Abbey,Eleonor Mclachlan,Garry Thrall,2012-08-25 +5,http://lorempixel.com/300/300/people,2013-07-08,Purus netus odio maecenas cum. Curae fusce urna. Netus nulla. Porta lacus per justo. Proin purus dolor platea vitae integer. Neque justo taciti id ut amet. Vitae morbi vehicula parturient. Velit magna primis at leo tristique pharetra platea mollis lorem potenti litora.,http://lorempixel.com/300/300/people,Toucan Island|Oak Orchards|Choctaw Canyon,Brenda Orzechowski,Syble Flynn,2013-05-04 +2,http://lorempixel.com/300/300/people,2012-09-07,Augue proin. Etiam lorem netus. Netus fusce mauris fames eu elementum porta fames lectus ante consectetuer et morbi purus blandit orci. Felis augue eleifend dui dolor risus magna augue imperdiet tortor. Lorem donec risus erat dui nam non at lacus dignissim facilisi purus venenatis mollis mattis. Donec porta magna phasellus. Class fames pharetra ac. Ipsum etiam magnis donec commodo curae magna.,http://lorempixel.com/300/300/people,Lynx Mount,Eleonor Mclachlan,Teresita Cory,2012-06-25 +4,http://lorempixel.com/300/300/people,2013-01-23,Curae neque volutpat phasellus ad consequat lorem pharetra proin in urna. Augue velit mattis varius fames cum quis hac vivamus mollis nam taciti in venenatis lacinia fusce. Felis risus justo porttitor sapien eget mattis sed. Massa lorem nisi vel proin laoreet nonummy semper felis habitasse pharetra congue. Porta lorem mollis rutrum. Nulla morbi cum elit. Magna etiam maecenas amet varius adipiscing pulvinar odio commodo mi. Purus neque vel.,http://lorempixel.com/300/300/people,The City at Chippewa Creek|Angler's Meadows|Captain's Beach,Carly Toro,Bud Carrow,2013-01-11 +3,http://lorempixel.com/300/300/people,2013-05-29,Proin netus. Fames risus tempus proin. Augue felis risus egestas venenatis torquent. Risus fames nisi senectus nec euismod a mauris. Fames magna cras commodo ac arcu donec. Massa justo cum etiam massa orci. Lacus neque erat ut donec mauris. Etiam purus metus.,http://lorempixel.com/300/300/people,Whaler's Timbers|Azalea Overlook|Muskrat Prospect,Laurinda Franson,Melanie Bricker,2013-03-19 +2,http://lorempixel.com/300/300/people,2012-10-22,Purus proin litora enim at pellentesque sodales. Dolor purus nullam. Nulla lorem hac porta tincidunt molestie in fames aptent adipiscing porta nibh sed. Lorem fames donec arcu est neque ultricies quisque congue et pede aptent orci pellentesque id. Donec morbi litora tempor posuere in nostra id pharetra. Donec netus fusce varius nisi magnis vestibulum felis enim in odio. Vitae donec penatibus rutrum erat tristique sociis ac malesuada porta. Fusce velit litora pellentesque ultricies fames dolor gravida.,http://lorempixel.com/300/300/people,Palm Bay,Ellsworth Rehman,Marcia Chabot,2012-09-18 +4,http://lorempixel.com/300/300/people,2012-11-28,Augue porta ultrices habitasse a. Magna purus sit etiam varius. Etiam justo massa condimentum vehicula duis. Risus ipsum donec rutrum neque. Nulla proin curae rhoncus. Fusce netus praesent eni et molestie massa in congue. Metus curae vel mus cum sollicitudin ligula ipsum nulla mollis. Lacus augue varius parturient neque feugiat congue imperdiet facilisi.,http://lorempixel.com/300/300/people,Salisbury Mesa|Owl Brook|Macaw Shore,Jeannette Leick,Henriette Diedrich,2012-11-08 +1,http://lorempixel.com/300/300/people,2012-02-15,Donec augue luctus penatibus curae ut donec diam. Justo metus hac fames velit sapien ullamcorper. Augue magna accumsan velit et. Dolor ipsum. Proin lorem vitae magna gravida duis et nullam conubia eget nibh egestas. Proin porta. Massa purus faucibus augue ad tortor ad tempor maecenas nibh non. Justo risus litora nisi ullamcorper aliquet vel mollis.,http://lorempixel.com/300/300/people,Banyan Lagoon,Del Smithey,Alysha Lococo,2012-01-06 +4,http://lorempixel.com/300/300/people,2012-11-16,Fames netus maecenas sem curae hendrerit interdum. Velit curae. Class ipsum interdum cum etiam venenatis pretium velit nisi nulla. Fusce massa habitant mi semper. Proin morbi. Justo augue. Magna nulla lorem tortor habitant vivamus enim duis. Proin metus mollis at suscipit enim eu.,http://lorempixel.com/300/300/people,Puerto Rojo|Angler's Corner|The Knoll at Blue Spruce Inlet,Lonnie Rye,Hilda Hisey,2012-10-12 +5,http://lorempixel.com/300/300/people,2012-05-11,Neque vitae. Massa etiam. Magna justo felis non ante consectetuer accumsan neque ve. Fusce dolor fusce mollis auctor gravida elit sem risus vitae nulla a congue. Neque felis dolor sit ultrices. Curae vitae. Massa augue vehicula proin est facilisi a placerat per pede ridiculus eleifend lacus. Etiam justo tempus consectetuer hendrerit morbi.,http://lorempixel.com/300/300/people,Shady Pasture|Cougar Woods|Banyan Inlet,Reiko Oppenheimer,Augustine Failla,2012-05-08 +3,http://lorempixel.com/300/300/people,2012-10-26,Augue proin metus justo fusce leo fusce lacus non quis. Lorem risus pharetra ut velit primis lobortis sem quam dui. Fusce vitae. Curae fames egestas. Felis metus mauris nascetur tincidunt ac. Purus fames leo morbi hendrerit. Nulla magna massa aptent pellentesque natoque dolor. Curae netus litora montes sagittis nunc malesuada in.,http://lorempixel.com/300/300/people,Grizzly Harbor|The Streams at Moose View,Lecia Harling,Sharri Dietrich,2012-09-05 +3,http://lorempixel.com/300/300/people,2012-08-24,Class morbi metus suscipit. Purus metus. Ipsum metus volutpat velit nulla lobortis eu dolor at. Proin etiam. Porta curae luctus ve dolor vel odio. Morbi purus tempor adipiscing dolor iaculis vitae eget egestas. Purus justo magnis. Vitae justo.,http://lorempixel.com/300/300/people,Wessex Vale,Hana Turnipseed,Luther Cybart,2012-06-23 +2,http://lorempixel.com/300/300/people,2012-12-15,Morbi purus congue in litora per. Augue massa dictum erat lacinia ad nonummy orci. Fusce magna a arcu eu neque felis. Proin lorem neque aliquet quisque fringilla odio pede massa integer. Magna ipsum proin non risus porttitor parturient dui proin. Etiam velit aenean. Magna porta euismod est mi varius hymenaeos neque nisl mus amet vestibulum mus. Class dolor enim arcu vestibulum nisl.,http://lorempixel.com/300/300/people,Wessex Vale,Tomika Shimer,Luther Cybart,2012-11-23 +2,http://lorempixel.com/300/300/people,2012-02-17,Risus porta leo. Lacus augue. Lorem neque odio condimentum ut litora egestas enim elit sapien laoreet. Vitae nulla senectus parturient nonummy sed curabitur risus bibendum risus pellentesque placerat. Augue netus vitae litora porta. Augue curae eros hymenaeos ad congue senectus mattis. Massa justo. Porta donec nullam consectetuer viverra elit ac duis porta varius.,http://lorempixel.com/300/300/people,Tanager Vale,Lecia Harling,Blaine Sevin,2012-01-23 +3,http://lorempixel.com/300/300/people,2013-01-26,Neque lorem platea dictumst imperdiet sed nibh. Lorem porta vitae massa orci risus taciti turpis sem rutrum sit. Lorem velit orci sit netus aliquam nonummy quam maecenas molestie mollis dictum nulla vivamus eleifend lorem quis amet. Magna felis. Dolor nulla ante pede nisl conubia lorem metus nec enim penatibus. Proin nulla elementum phasellus eros urna quis egestas at. Massa nulla elit fames ridiculus sociosqu. Class netus fusce risus non ipsum dui.,http://lorempixel.com/300/300/people,Valle Viejo,Lelia Coppinger,Clarice Ly,2013-01-11 +1,http://lorempixel.com/300/300/people,2012-05-17,Netus class nulla magnis nulla nunc id nisl at. Velit ipsum nullam est tellus ac aenean bibendum suspendisse. Fusce nulla. Massa magna etiam. Risus proin platea eget nisl tempus. Morbi metus erat curabitur at imperdiet posuere etiam massa dis duis dui. Risus velit. Nulla metus.,http://lorempixel.com/300/300/people,The Village at Bear Firth|Bridgwater Leap|Sweet Knoll,Gilda Puffer,Ronda Mandujano,2012-03-09 +4,http://lorempixel.com/300/300/people,2012-08-13,Velit porta etiam sapien. Proin massa mollis magna orci blandit. Fusce purus. Fusce porta. Class felis. Etiam neque lacinia facilisis id venenatis ipsum a pede at. Risus felis. Justo massa.,http://lorempixel.com/300/300/people,Spruce Ridge|Gentle Quarter,Carly Toro,Letha Lehto,2012-05-27 +4,http://lorempixel.com/300/300/people,2013-02-18,Justo donec. Massa class. Risus curae aenean mauris amet suspendisse cubilia. Massa morbi donec gravida venenatis ante cum proin etiam eleifend vestibulum lacinia eget. Lacus metus erat hymenaeos. Lacus vitae nullam etiam. Donec nulla iaculis pede. Etiam donec litora aenean in litora placerat.,http://lorempixel.com/300/300/people,Maple Farms,Berniece Sulton,Bridgette Efird,2013-01-01 +4,http://lorempixel.com/300/300/people,2013-05-26,Purus metus turpis semper fusce phasellus ut tincidunt a. Purus ipsum platea accumsan eros nunc. Etiam neque sapien mattis in ante dolor magna aliquam gravida rutrum elit. Neque magna mattis risus posuere habitant magnis. Curae ipsum cursus lorem pharetra est natoque mi. Risus netus leo erat parturient enim congue parturient sollicitudin feugiat. Vitae donec. Justo purus vel purus curabitur fringilla curae eu.,http://lorempixel.com/300/300/people,Wooded Pasture,Kenda Scarboro,Coral Crossett,2013-05-04 +2,http://lorempixel.com/300/300/people,2013-05-23,Velit lacus quam ac ipsum et pede torquent lacus eget ut justo curabitur imperdiet. Lacus dolor nec netus erat aenean. Vitae justo suspendisse amet urna sem metus felis laoreet maecenas. Proin morbi mauris accumsan per potenti habitant ante dapibus ad quam felis. Risus curae leo nisi a duis. Dolor vitae bibendum class eni. Etiam vitae quisque gravida vulputate facilisi platea libero. Felis morbi a cubilia eu.,http://lorempixel.com/300/300/people,Heron Waves|Flamingo Waves|The Forest at Essex Knoll,Candice Vidrio,Florine Lintner,2013-04-01 +4,http://lorempixel.com/300/300/people,2013-04-19,Etiam dolor cum. Massa morbi sapien quam sed a mollis. Etiam class pretium nunc suscipit lorem urna. Metus donec proin turpis eget ante sodales convallis. Ipsum fames sem posuere aptent ve. Proin neque felis molestie adipiscing laoreet odio ut sollicitudin. Dolor augue. Ipsum lacus suspendisse suscipit facilisis sollicitudin feugiat eleifend eros nibh vivamus in.,http://lorempixel.com/300/300/people,Liberty Corner|Poplar Highlands,Lucinda Stracener,Lillian Ristau,2013-03-20 +1,http://lorempixel.com/300/300/people,2013-05-31,Curae metus curae netus sodales arcu inceptos ve justo pellentesque risus. Fusce curae. Fusce class ornare diam dapibus. Porta proin viverra mi litora. Etiam felis. Metus lacus conubia nibh at consectetuer mollis morbi. Nulla lorem non duis justo. Massa proin sagittis donec hac tempor molestie.,http://lorempixel.com/300/300/people,Pleasant Parish,Kemberly Lecuyer,Candice Madonna,2013-04-01 +4,http://lorempixel.com/300/300/people,2012-06-07,Justo porta per class vitae nostra cras. Purus netus sodales dapibus quis pellentesque adipiscing orci. Felis donec nibh a massa. Porta vitae conubia ad fermentum massa morbi. Risus velit taciti. Fames lorem facilisi cum dolor non dolor dui. Class donec hac. Risus netus elit suscipit interdum ve suspendisse.,http://lorempixel.com/300/300/people,Graceful Lagoon|Admiral's Island|Madera Azul,Kera Cybart,Marget Lehn,2012-06-03 +5,http://lorempixel.com/300/300/people,2013-03-07,Vitae velit varius nunc leo duis nec ante feugiat ut. Class ipsum. Velit magna. Etiam curae augue risus turpis lacus sem arcu eros senectus sollicitudin. Etiam netus suspendisse amet hendrerit id nostra id mi arcu magnis integer aliquam habitasse. Massa class risus nibh cras quam. Nulla justo montes pulvinar turpis sociis cubilia. Class nulla.,http://lorempixel.com/300/300/people,Walnut Streams|Oak Haven|Iroquois Vineyard,Birgit Shires,Tonie Pille,2012-12-12 +2,http://lorempixel.com/300/300/people,2012-04-25,Lorem justo. Morbi proin orci lorem platea lectus vulputate nulla in. Fusce magna duis hendrerit mauris turpis purus vestibulum praesent. Vitae class massa velit. Dolor neque. Metus lacus nunc molestie. Metus neque tortor sit parturient netus pede vehicula adipiscing ridiculus. Dolor metus.,http://lorempixel.com/300/300/people,Magnolia Springs|Madera Buena,Lelia Coppinger,Gisele Michaels,2012-04-10 +2,http://lorempixel.com/300/300/people,2013-05-30,Justo netus donec accumsan purus. Felis porta condimentum. Etiam porta etiam arcu nibh mus. Augue proin a quam class pretium. Donec ipsum ante senectus dui blandit id eu. Curae proin etiam vitae. Morbi proin. Class ipsum interdum at orci sagittis placerat lacus a.,http://lorempixel.com/300/300/people,Sandpiper Quay,Eleonor Mclachlan,Sherly Lembo,2013-05-14 +3,http://lorempixel.com/300/300/people,2012-07-06,Fusce vitae. Neque proin. Purus lorem nunc nostra vestibulum consectetuer feugiat massa eget sodales commodo. Ipsum felis semper lectus sagittis condimentum. Velit vitae duis morbi senectus orci ante. Ipsum morbi molestie velit ve amet fames ultricies montes. Morbi dolor ante iaculis enim ad augue consectetuer facilisi morbi pellentesque. Donec etiam dis arcu non ipsum massa netus augue sociosqu.,http://lorempixel.com/300/300/people,The Park at Liberty Acres,Houston Walborn,Shantay Shivers,2012-06-22 +3,http://lorempixel.com/300/300/people,2012-08-26,Fames justo enim tellus tristique tincidunt ipsum neque. Neque curae nisi. Proin lorem. Lacus etiam luctus morbi natoque et cras. Purus porta nulla ipsum nisi eu. Netus nulla eget dolor lorem lacus fusce semper hymenaeos ad libero viverra orci leo nulla auctor justo dolor. Vitae velit scelerisque interdum cubilia potenti. Dolor proin diam a nisi vestibulum aenean eu.,http://lorempixel.com/300/300/people,Wakefield Vale,Sharlene Chappell,Monika Han,2012-08-17 +4,http://lorempixel.com/300/300/people,2012-01-30,Porta felis semper fusce mus ridiculus montes suscipit sed euismod. Morbi augue odio mollis nonummy ac leo ridiculus mauris ut phasellus duis suspendisse. Curae neque justo conubia libero ante et augue tempus. Risus etiam sociis nisi erat. Massa lorem ornare et sociosqu sapien nulla. Neque risus odio eu tincidunt conubia eget cras curae eleifend. Morbi curae. Morbi donec ante ut vitae amet.,http://lorempixel.com/300/300/people,Wandering Lakes|Aloha Beach,Cythia Doten,Lisha Belser,2012-01-04 +3,http://lorempixel.com/300/300/people,2013-06-13,Velit etiam lectus duis curabitur fermentum curae habitant eni commodo. Felis neque. Donec purus. Lacus purus inceptos eu ullamcorper et tempor risus vel magna proin vel ante. Felis donec. Donec metus pede a nisl felis nullam quis leo ut aptent aliquet. Velit ipsum dui montes dapibus. Morbi dolor dis eros suscipit potenti sollicitudin euismod massa nisl eleifend commodo.,http://lorempixel.com/300/300/people,Valle Mariposa|Laughing Vale,Tomika Shimer,Venice Feldman,2013-05-10 +5,http://lorempixel.com/300/300/people,2013-03-18,Lorem felis nec posuere eleifend nibh dui neque cubilia nunc vestibulum. Vitae magna conubia euismod mattis. Purus justo dignissim. Fames felis mauris fames rhoncus. Metus fames dictum elementum non senectus a pellentesque eget magna dolor hac class. Class curae platea aliquam gravida cubilia semper ve nulla dictumst malesuada at facilisis. Ipsum lacus est vestibulum adipiscing id praesent per blandit diam ante facilisi pharetra. Neque lacus morbi nostra nibh ut sollicitudin.,http://lorempixel.com/300/300/people,Newcastle Parish|Whistling View|Lancashire Heath,Jeannette Leick,Sherrie Delmont,2012-12-19 +1,http://lorempixel.com/300/300/people,2012-10-05,Purus magna tempor mauris etiam. Nulla fusce sit quis cum quam. Porta purus dictumst diam tempus ut. Lacus proin massa varius placerat vulputate risus nascetur ve purus. Donec fusce purus potenti et nec urna vel. Vitae felis aenean cursus sociosqu. Risus fusce lorem montes sapien fermentum posuere vitae posuere potenti urna mollis et penatibus. Fusce lacus mattis at enim purus dignissim scelerisque.,http://lorempixel.com/300/300/people,Arapahoe Acres|Ash Gulf|The Farms at Antelope Heath,Cassaundra Ribera,Aleisha Leiser,2012-09-10 +2,http://lorempixel.com/300/300/people,2012-10-02,Donec netus erat gravida in penatibus etiam nec massa turpis tortor. Morbi lorem nunc phasellus vehicula fames vel donec. Class lacus sociosqu mi quam felis etiam amet viverra eget ante facilisis. Dolor ipsum. Augue purus suspendisse vehicula porttitor mi magna. Lorem magna proin donec cras dis. Lorem proin a ornare ante per metus sit lorem egestas eu eleifend montes primis est. Vitae nulla nisl per cum pellentesque et ipsum.,http://lorempixel.com/300/300/people,The Knoll at Inviting Downs|Aloha Dunes|Tamarind Harbor,Leona Welter,Jarvis Nazario,2012-08-11 +3,http://lorempixel.com/300/300/people,2013-03-19,Neque dolor gravida arcu luctus morbi conubia elit sociosqu hac quisque pulvinar. Netus neque orci amet massa suscipit enim hac sem curabitur montes metus. Justo fusce. Massa donec maecenas non euismod. Porta lacus senectus phasellus felis quis dictumst. Felis purus eni nisl placerat. Fames nulla. Curae justo.,http://lorempixel.com/300/300/people,Thanksgiving Oaks,Maryann Brunk,Frankie Desantiago,2013-03-09 +3,http://lorempixel.com/300/300/people,2012-05-25,Class felis auctor commodo. Massa netus. Felis justo purus etiam sociosqu class maecenas. Morbi porta scelerisque ultrices habitasse nisi risus tincidunt placerat. Ipsum etiam varius nisi. Class etiam torquent nisl ultricies ridiculus metus at. Metus curae. Augue magna dignissim vehicula at.,http://lorempixel.com/300/300/people,Banyan Bay|The Acres at Leafy Ridge|Macaw Island,Gary Trostle,Francesco Marcinkowski,2012-05-14 +4,http://lorempixel.com/300/300/people,2012-10-05,Felis ipsum nunc nonummy ad. Lorem neque. Lacus felis lectus. Lacus dolor a aliquam id nonummy. Metus lorem cubilia commodo primis etiam facilisi. Velit vitae. Velit fames. Etiam justo.,http://lorempixel.com/300/300/people,Sea Lion Cliffs|Wandering Hills,Chang Morquecho,Amos Hollis,2012-09-27 +4,http://lorempixel.com/300/300/people,2012-07-02,Felis metus sem pulvinar aliquam interdum. Fames morbi consequat sem feugiat ac. Etiam felis. Neque lorem quis condimentum natoque sem ve a cursus nulla mus tortor leo parturient aenean. Fusce class sem quis orci luctus lectus arcu eni nisi sollicitudin. Porta vitae. Proin neque erat enim. Justo metus.,http://lorempixel.com/300/300/people,The Prairie of Thanksgiving Gulf|Stork Haven|The Oaks at Bridgwater Vineyard,Luanna Duggan,Daniel Wyrick,2012-04-20 +1,http://lorempixel.com/300/300/people,2013-02-24,Porta donec. Fusce porta. Felis donec. Lorem velit odio suscipit dolor ut curabitur. Magna curae. Purus vitae metus inceptos at nisl. Netus augue vivamus est dictumst. Neque lorem sagittis eu condimentum orci aptent justo etiam mattis.,http://lorempixel.com/300/300/people,Sandy Haven,Arianne Ebarb,Vena Gizzi,2012-12-01 +3,http://lorempixel.com/300/300/people,2012-12-12,Lorem lacus eros faucibus habitant. Risus augue class placerat morbi nisi egestas ve litora orci duis gravida neque. Felis fusce egestas vivamus sapien consequat ve ultricies adipiscing duis. Neque etiam blandit vel natoque lacus arcu suspendisse ut auctor. Metus class cursus netus parturient habitant nisl laoreet felis elit habitasse. Velit etiam. Morbi purus. Magna curae.,http://lorempixel.com/300/300/people,Fireside Anchorage|The Woods of Crystal Cove|Puerto Bajo,Ashlie Rester,Iesha Bosque,2012-11-23 +3,http://lorempixel.com/300/300/people,2012-08-02,Neque morbi cum tempor a placerat est integer mi sociis tristique tincidunt. Morbi risus eros ridiculus placerat quam phasellus. Metus proin elit feugiat erat ipsum. Morbi massa tristique eni risus dis proin rutrum massa. Justo massa. Porta felis. Magna velit. Metus netus turpis taciti aliquam ad ut.,http://lorempixel.com/300/300/people,Breadfruit Bay,Jeannette Leick,Dyan Shay,2012-05-15 +2,http://lorempixel.com/300/300/people,2012-09-25,Neque vitae congue purus hac. Velit class suspendisse orci tortor viverra nisl at sollicitudin nunc posuere nisl. Purus neque. Netus neque quam et consequat pretium mus lobortis convallis diam sit semper at. Etiam velit auctor tellus cras condimentum nec. Neque felis vel aliquam torquent. Nulla justo congue at varius ac at urna. Nulla class metus rhoncus vehicula erat rutrum quisque laoreet quam at maecenas.,http://lorempixel.com/300/300/people,Pilot Dunes|Windsor Overlook|Rambutan Bay,Adriene Rizo,Rusty Canary,2012-07-08 +1,http://lorempixel.com/300/300/people,2013-02-22,Etiam augue condimentum eget mattis vitae rutrum. Nulla magna felis mollis condimentum lacus. Fames lorem sit risus dui cras. Porta curae magnis orci ac pellentesque. Nulla risus. Augue porta scelerisque dictumst. Netus felis. Massa felis rutrum vulputate nulla a turpis fermentum senectus.,http://lorempixel.com/300/300/people,Salisbury Mesa|Owl Brook|Macaw Shore,Carly Toro,Henriette Diedrich,2013-02-09 +3,http://lorempixel.com/300/300/people,2013-07-10,Ipsum dolor morbi a aliquam at auctor consequat. Curae risus mattis condimentum velit congue habitasse et. Vitae dolor tempus varius aliquam quam neque iaculis mus. Etiam vitae purus iaculis cursus eros enim conubia urna. Metus donec orci. Neque velit. Augue fusce. Risus etiam scelerisque nisl consequat facilisi orci eros nibh porttitor mollis a.,http://lorempixel.com/300/300/people,Lighthouse Coast,Venessa Scull,Alfredo Clary,2013-05-14 +2,http://lorempixel.com/300/300/people,2013-06-10,Lacus dolor libero tellus sed nullam egestas amet sociis sapien ut pede luctus at. Lorem porta vehicula tincidunt dui leo et. Nulla netus eget habitant est integer id dictum sit semper. Massa fames mus urna vehicula parturient. Porta augue. Nulla ipsum tempor odio integer. Purus donec. Massa fames a nisl fusce.,http://lorempixel.com/300/300/people,Magnolia Mount|Shady Pasture,Gary Trostle,Beatrice Kinne,2013-03-30 +4,http://lorempixel.com/300/300/people,2012-11-01,Curae magna a laoreet. Felis curae est augue per quam sollicitudin ultrices augue congue eu orci tellus inceptos. Lacus dolor. Curae ipsum erat auctor curabitur nascetur magnis. Vitae class quis diam ipsum cubilia tincidunt in tincidunt arcu egestas massa non nisl malesuada aenean mi dictumst. Donec metus augue arcu commodo. Ipsum porta purus laoreet metus ac massa ve convallis potenti. Netus fames metus sem lorem laoreet.,http://lorempixel.com/300/300/people,Kissing Canyon|The Park at Dusky Park,Charlott Rondeau,Jenelle Sturgill,2012-09-19 +2,http://lorempixel.com/300/300/people,2012-08-19,Velit porta tempus varius. Fusce vitae. Felis justo fusce diam mollis ultricies vestibulum iaculis. Neque lacus vitae vel nunc etiam turpis tristique neque porttitor lorem. Etiam massa nibh magna vivamus nullam netus vestibulum torquent amet feugiat pede ut ridiculus a. Velit proin purus sit augue massa tempor eu mi morbi ullamcorper placerat. Fames ipsum feugiat convallis nascetur facilisi donec. Curae lorem.,http://lorempixel.com/300/300/people,Azalea Glen,Jeannette Leick,Marget Charlebois,2012-07-21 +2,http://lorempixel.com/300/300/people,2013-03-01,Metus purus diam a erat id justo enim viverra id nulla. Class porta dapibus metus. Neque felis maecenas pede hac eu erat. Massa velit imperdiet accumsan at non duis facilisi imperdiet a. Class ipsum platea massa. Purus risus. Lacus morbi justo netus volutpat vitae id. Ipsum felis.,http://lorempixel.com/300/300/people,Arapahoe Acres|Ash Gulf|The Farms at Antelope Heath,Allie Hance,Aleisha Leiser,2013-01-25 +5,http://lorempixel.com/300/300/people,2013-06-27,Neque magna a cras. Donec nulla lorem cum duis volutpat. Netus fusce habitant parturient integer nec in tempor ad platea. Risus massa class a odio nulla egestas. Velit morbi primis velit viverra. Nulla neque. Fusce vitae lacinia sed nonummy at leo ornare molestie. Neque curae tempus rutrum malesuada.,http://lorempixel.com/300/300/people,The Sanctuary at Hastings Point|The Outlook at Andover Orchards|Buffalo Orchards,Iona Lisenby,Waylon Lubin,2013-05-06 +1,http://lorempixel.com/300/300/people,2012-08-04,Augue etiam porta rutrum vestibulum habitant iaculis facilisi sapien dictum ipsum non odio in enim. Donec magna cum ipsum felis libero. Lacus fusce sed eget. Magna proin nibh litora turpis gravida id molestie quisque. Augue fames scelerisque cum. Massa class arcu orci varius commodo amet nisl varius aliquam diam fames fermentum. Vitae purus neque ante. Vitae felis.,http://lorempixel.com/300/300/people,Sierra Grande,Gia Kennamer,Germaine Exum,2012-06-18 +4,http://lorempixel.com/300/300/people,2012-10-05,Felis vitae sapien ornare facilisis porta ut velit consectetuer curabitur rutrum venenatis varius lobortis. Fusce fames quam iaculis arcu mi. Lorem donec cubilia porta adipiscing at enim lacus. Neque donec morbi nam duis egestas potenti urna interdum sem. Etiam donec aliquet. Class proin. Porta class fusce leo purus sed quam. Felis donec.,http://lorempixel.com/300/300/people,Pine Boulder|Plymouth Cave,Nila Styons,Elia Kelsch,2012-09-07 +2,http://lorempixel.com/300/300/people,2012-02-13,Fusce porta nullam ligula sagittis posuere. Fames magna tortor est elit maecenas. Ipsum augue fames odio interdum nibh ante sagittis a. Risus nulla dictum pede euismod mi dictum purus. Donec neque condimentum praesent neque mi lorem pellentesque maecenas morbi. Ipsum massa nulla suspendisse id. Purus lorem primis mauris gravida eu. Lorem vitae tincidunt tristique orci porta ac felis porta.,http://lorempixel.com/300/300/people,Vista Fresca,Josephine Mcauley,Venessa Mahmood,2012-01-21 +4,http://lorempixel.com/300/300/people,2013-01-29,Magna vitae nulla ipsum cras montes. Nulla curae ultrices mi purus ac nisl. Fusce felis non nulla purus varius. Netus augue. Purus justo sem nisi in sollicitudin tellus ut dui curabitur ultrices. Augue lorem habitant malesuada senectus nibh urna consequat turpis auctor penatibus per purus hac lorem. Magna metus iaculis porta pede luctus hac aliquet mauris eu lacus sit donec sociis aliquam iaculis. Felis dolor arcu.,http://lorempixel.com/300/300/people,The Promontory at Maple Hearth|Mesa Coneja,Kamilah Croke,Clarinda Coghlan,2013-01-27 +5,http://lorempixel.com/300/300/people,2013-02-13,Etiam magna. Metus massa vitae a aenean. Curae neque feugiat sociis elit netus et. Risus morbi pede vel eget. Vitae lorem. Fames class porttitor diam sem a platea nulla condimentum dis mauris aptent mus congue tempor cum. Proin velit netus tempor molestie justo dapibus donec quis curabitur amet. Velit augue aptent auctor faucibus.,http://lorempixel.com/300/300/people,Dusky Vineyard|Madera Grande|Shady Pasture,Kera Cybart,Henry Dew,2013-02-06 +3,http://lorempixel.com/300/300/people,2012-02-24,Magna felis ullamcorper. Justo felis sem adipiscing parturient. Fusce magna cras luctus id non odio vel vitae. Velit proin nam vel ad venenatis adipiscing aliquet enim mi eget ut dictumst. Augue class litora elementum interdum eros. Neque purus eros potenti at nisl conubia. Risus porta a diam vestibulum nisl mollis. Purus lorem per penatibus fusce.,http://lorempixel.com/300/300/people,Pueblo Nuevo,Elicia Geist,Marilynn Shier,2012-02-18 +4,http://lorempixel.com/300/300/people,2012-09-02,Curae magna cursus platea etiam habitasse nulla erat mus class. Etiam fames sodales torquent varius. Massa vitae a rutrum erat amet proin. Lacus morbi. Lorem metus non dolor fringilla imperdiet adipiscing orci augue. Velit fusce pulvinar fringilla nam pretium sem gravida eu nisl etiam justo sit. Fames morbi posuere tortor eget etiam purus. Vitae purus nisi aliquam at sem imperdiet aenean sociosqu dapibus felis.,http://lorempixel.com/300/300/people,Deer Downs,Seymour Bollig,Kayleigh Mullins,2012-08-06 +5,http://lorempixel.com/300/300/people,2012-11-01,Justo magna. Neque etiam lectus rutrum augue accumsan. Dolor fames. Fusce dolor purus aenean. Dolor purus. Netus magna a. Massa metus ornare parturient vitae eget leo quis facilisi. Augue dolor sagittis in lacus hac dignissim est blandit dictumst.,http://lorempixel.com/300/300/people,Pleasant Parish,Leona Welter,Candice Madonna,2012-09-19 +2,http://lorempixel.com/300/300/people,2012-10-27,Metus etiam. Donec augue magnis dolor nulla vel ipsum. Class curae risus a mauris. Felis class lorem cras a pede. Felis dolor libero. Vitae lacus taciti morbi. Risus lacus montes id sociosqu morbi leo duis habitant fringilla ipsum urna iaculis in. Proin fusce congue at senectus torquent eu ullamcorper nunc turpis ad.,http://lorempixel.com/300/300/people,Spring Sanctuary|Sandpiper Pier|Lazy Vineyard,Catherina Entrekin,Marybeth Sinquefield,2012-08-22 +3,http://lorempixel.com/300/300/people,2012-10-28,Morbi ipsum tempus mollis fames proin magnis nibh non potenti faucibus lectus. Massa felis facilisi nunc urna quisque eros massa ornare. Curae velit lacinia cras molestie rhoncus eu accumsan. Etiam donec purus hac. Neque lorem nullam montes torquent morbi ut sapien bibendum magna ut est. Velit lacus conubia quis auctor elementum in taciti. Neque massa fames condimentum nisl ridiculus pulvinar luctus turpis commodo. Massa class.,http://lorempixel.com/300/300/people,Baschurch Sanctuary|Poplar Abbey,Birgit Shires,Odette Albritton,2012-10-13 +2,http://lorempixel.com/300/300/people,2012-04-06,Felis risus etiam. Velit fames. Netus risus quam aliquam ad et proin sociosqu. Justo donec amet duis parturient ac dignissim a sem curabitur mattis. Ipsum magna odio. Magna ipsum. Fusce dolor a. Purus proin venenatis ridiculus porta velit felis augue euismod rutrum luctus porta.,http://lorempixel.com/300/300/people,Bedwyn Anchorage|Toucan Gulf,Iona Lisenby,Dagny Darlington,2012-01-30 +1,http://lorempixel.com/300/300/people,2013-06-07,Dolor justo vel odio nunc lacus nec. Massa fusce. Netus porta. Augue class sagittis convallis nisl neque augue ornare. Purus donec suspendisse leo id taciti integer amet cum. Massa felis torquent sem ut fames ve. Donec class. Augue lorem quisque aenean.,http://lorempixel.com/300/300/people,Deer Downs,Adina Jezierski,Kayleigh Mullins,2013-04-21 +2,http://lorempixel.com/300/300/people,2012-08-29,Fusce lorem pharetra lorem dui conubia senectus. Justo neque. Nulla netus. Purus vitae molestie penatibus quam dis sollicitudin turpis augue morbi a. Morbi justo lacus ipsum nascetur. Proin purus. Purus porta tellus. Donec neque inceptos nam ac sapien diam arcu.,http://lorempixel.com/300/300/people,Porpoise Breakwater,Gilda Puffer,Bea Midgley,2012-07-11 +1,http://lorempixel.com/300/300/people,2013-06-17,Metus ipsum tellus ante fusce neque. Morbi purus enim a velit. Class proin. Velit risus pretium. Dolor purus magnis proin mi rutrum malesuada parturient elit consequat urna condimentum vivamus suspendisse ante. Fames magna libero laoreet euismod quam nulla dictumst phasellus. Porta curae felis orci nam hymenaeos erat fusce rhoncus mi amet. Netus massa purus.,http://lorempixel.com/300/300/people,Kelp Landing|Spring Boulder|The Vista of Private Dunes,Ellsworth Rehman,Maritza Fenster,2013-03-24 +5,http://lorempixel.com/300/300/people,2013-04-25,Class porta scelerisque mus tortor nonummy at venenatis a metus mi. Morbi etiam. Class purus nullam erat venenatis cum aliquet facilisi dictum rutrum vivamus. Fames lorem magnis massa. Donec massa pulvinar venenatis a facilisis porta ut eros fermentum mauris. Proin felis auctor vestibulum. Donec lorem. Class donec mauris donec felis.,http://lorempixel.com/300/300/people,Seagull Waves|Tern Coast|Macaw Firth,Fred Victory,Genie Gentry,2013-03-29 +3,http://lorempixel.com/300/300/people,2012-02-17,Class fusce posuere potenti nunc amet. Justo lacus. Augue nulla volutpat hendrerit ac scelerisque arcu auctor vitae class a tellus phasellus. Netus curae a egestas id ac nunc quisque at mi libero volutpat nibh lacinia ve. Lacus purus lacus per odio sollicitudin ut curae nostra. Fames augue pretium massa dis erat id ridiculus class lorem sed hac consectetuer varius. Dolor neque mauris donec nonummy pretium phasellus primis pulvinar tincidunt. Ipsum justo.,http://lorempixel.com/300/300/people,Sierra Baja|Guava Reef|Fisherman's Promontory,Christel Henrickson,Marylee Ziebarth,2012-01-03 +1,http://lorempixel.com/300/300/people,2013-04-29,Nulla felis. Neque fusce nunc proin lorem pede laoreet sociis dui. Massa lacus. Nulla massa dui vestibulum adipiscing at nunc. Nulla purus mollis ve urna felis sodales amet. Ipsum class duis lorem montes odio feugiat nec malesuada. Augue lacus praesent est ve volutpat morbi fringilla parturient cras. Class vitae tempor primis risus.,http://lorempixel.com/300/300/people,Palm Parish|Iroquois Bluff|The Promontory at South Park,Del Smithey,Ellsworth Thrailkill,2013-02-18 +2,http://lorempixel.com/300/300/people,2013-06-14,Donec metus. Neque purus nam parturient. Donec curae libero odio. Proin curae amet tempor vivamus pede fringilla ad pede mattis platea dictumst quam sociosqu. Netus felis. Porta class ullamcorper pharetra. Vitae ipsum. Etiam neque suspendisse orci enim.,http://lorempixel.com/300/300/people,Charming Acres|Leeward Cove|The Lakes at Royal Dunes,Zoila Meadow,Alex Groom,2013-03-30 +2,http://lorempixel.com/300/300/people,2013-06-25,Porta class sodales morbi vestibulum nonummy ante eros. Velit augue mollis lacus hac magna tincidunt bibendum ut. Metus morbi viverra congue massa. Purus morbi mauris laoreet in taciti orci ve. Nulla fusce semper rutrum mi lobortis nunc mus. Fusce ipsum. Metus lorem curae tempus molestie laoreet odio. Proin lorem lobortis curae luctus augue habitasse duis vel lorem sed accumsan convallis nibh.,http://lorempixel.com/300/300/people,Whistling View|The Ridge at Sweet Mesa,Winfred Begaye,Gwen Mok,2013-05-01 +3,http://lorempixel.com/300/300/people,2012-03-27,Nulla proin dis velit adipiscing et phasellus facilisis proin at donec id. Morbi augue vivamus ornare id metus eu habitasse nulla senectus netus. Nulla porta purus dictum auctor laoreet nunc integer. Class magna dapibus semper imperdiet laoreet nulla nunc potenti netus magna sed. Augue etiam a nunc ut dui ultricies hac cras facilisi curabitur. Class proin luctus. Netus vitae. Fusce curae tortor quis.,http://lorempixel.com/300/300/people,Sandy Haven,Shauna Merkel,Vena Gizzi,2012-01-10 +2,http://lorempixel.com/300/300/people,2012-07-01,Morbi donec lorem enim sed quam sapien mollis lacus mus nisl blandit quam. Magna velit nam massa mus enim arcu. Augue ipsum eros sed sapien laoreet eu ipsum at dis lectus malesuada augue. Morbi fames eros quis rhoncus metus. Porta magna. Curae risus nam ante parturient nisl ipsum convallis lorem pede primis elementum. Fusce proin mauris ullamcorper ipsum mollis mauris augue tincidunt aliquam donec etiam pretium auctor id. Lorem felis urna nec ridiculus.,http://lorempixel.com/300/300/people,Wandering Lakes|Aloha Beach,Annamaria Gilliland,Lisha Belser,2012-05-23 +2,http://lorempixel.com/300/300/people,2012-07-05,Risus lacus sodales ipsum. Morbi fames maecenas sit orci mus nonummy a. Massa vitae. Vitae netus platea sapien venenatis laoreet tortor eu neque sapien eu. Magna massa magna torquent habitasse eros. Ipsum curae aliquet at velit luctus mattis pretium amet et. Velit nulla ullamcorper torquent natoque cubilia. Lacus felis nec.,http://lorempixel.com/300/300/people,Charming Dale|Sandpiper Quay,Lili Scally,Enid Lawerence,2012-06-05 +1,http://lorempixel.com/300/300/people,2012-03-31,Proin velit nam adipiscing parturient. Lacus fames. Porta risus dictum cubilia rhoncus sapien amet. Velit fusce vitae accumsan quis magnis metus consequat sit penatibus dui fermentum aenean at. Massa etiam dui quis leo consectetuer ut ipsum eu a. Class donec dictum mi ac tortor consectetuer tincidunt litora pharetra vel. Massa class torquent ac. Lorem felis sociis nostra phasellus adipiscing urna metus.,http://lorempixel.com/300/300/people,Sussex Grove|Chippewa Promontory|Sea Lion Cliffs,Adriene Rizo,Arnette Patricia,2012-03-23 +4,http://lorempixel.com/300/300/people,2012-03-07,Nulla augue. Ipsum fusce senectus dolor iaculis. Metus velit congue hymenaeos mattis proin fusce. Lacus magna. Porta fusce neque urna ultrices massa eros rutrum egestas. Metus lorem nisi amet quis felis cubilia magnis sed. Dolor fames a orci proin accumsan sem integer. Felis class ullamcorper ut lectus a pharetra cum.,http://lorempixel.com/300/300/people,Pueblo Nuevo,Nila Styons,Marilynn Shier,2012-02-12 +2,http://lorempixel.com/300/300/people,2013-06-04,Class neque leo dignissim. Lacus velit elit eros natoque auctor in ridiculus a. Magna dolor mauris. Velit neque tortor elit posuere ve elit pede vestibulum sem morbi euismod lectus. Porta curae libero id. Etiam morbi ullamcorper nec auctor metus tempor duis porta tellus elit hac vitae litora. Velit netus odio platea id nibh urna curae primis cursus leo et inceptos hac justo vel aenean. Proin velit placerat mi mus malesuada primis accumsan ridiculus nibh.,http://lorempixel.com/300/300/people,Macaw Reef|The Suburb at Evergreen Village,Zoila Meadow,Molly Monteleone,2013-05-11 +4,http://lorempixel.com/300/300/people,2013-05-15,Purus nulla nunc tincidunt dictumst elit diam justo at lacus. Vitae massa lobortis nulla sollicitudin tincidunt nulla curabitur sit viverra ut. Porta justo sapien elit consequat nec erat etiam convallis suscipit mattis aliquet vivamus auctor id. Netus lorem scelerisque quam. Class proin montes quam natoque orci. Class lacus mus amet nisl dui dictum ridiculus porttitor ipsum in nisi. Justo magna varius at dictumst aliquet velit. Vitae proin tellus nisi ullamcorper aliquet sollicitudin ultricies mollis a vestibulum dis ipsum vitae.,http://lorempixel.com/300/300/people,Paso Rojo,Mozelle Saez,Trina Studdard,2013-04-18 +2,http://lorempixel.com/300/300/people,2013-03-01,Morbi porta nisl felis nunc class venenatis condimentum proin aenean semper fringilla. Nulla etiam condimentum bibendum commodo cras interdum sapien magnis dolor varius. Justo dolor. Augue felis ante rhoncus. Morbi lacus. Magna curae sapien ipsum. Massa dolor nonummy pretium curae. Class donec tempor conubia integer luctus porta tellus bibendum.,http://lorempixel.com/300/300/people,Mar Verde|Aloha Cove,Luise Klippel,Tristan Teaster,2013-02-07 +5,http://lorempixel.com/300/300/people,2013-05-03,Class donec nisi arcu fringilla pellentesque vivamus. Proin nulla inceptos hac. Class ipsum morbi vivamus nam. Netus porta eni nisi ad. Metus morbi. Fusce fames cum arcu et pellentesque commodo netus. Purus justo nullam orci neque sociis scelerisque lacus platea. Massa fusce posuere tempor elit ut dolor urna torquent penatibus congue fusce et.,http://lorempixel.com/300/300/people,Papaya Strand,Jeannette Leick,Tory Schuster,2013-03-15 +2,http://lorempixel.com/300/300/people,2012-04-22,Fusce donec sem nibh senectus sit in a. Lorem lacus. Fusce class euismod rutrum nisi viverra eu pretium. Porta ipsum sociis penatibus taciti facilisis. Ipsum nulla iaculis turpis metus senectus ve. Donec dolor porttitor scelerisque habitasse ante neque conubia eget parturient urna. Magna fusce litora quisque quis nisi potenti tristique orci. Porta proin aptent ac metus eni.,http://lorempixel.com/300/300/people,Rancho Grande,Adina Jezierski,Altha Ahumada,2012-04-21 +1,http://lorempixel.com/300/300/people,2012-03-23,Morbi lorem. Donec lacus. Magna curae eni orci urna sociis elementum vehicula at diam amet non proin. Lacus etiam. Risus netus sit senectus tristique bibendum id. Dolor neque sociis dapibus et nisi aliquet enim ut curabitur ac malesuada eu. Porta massa. Velit justo nisl egestas.,http://lorempixel.com/300/300/people,Songbird Parish,Winfred Begaye,Natasha Goers,2012-02-18 +3,http://lorempixel.com/300/300/people,2013-03-22,Justo felis non vitae sapien donec scelerisque sociosqu. Augue proin vivamus facilisis et malesuada. Donec lorem. Neque magna quisque pretium sociis nisl elit curae vivamus. Fusce risus condimentum odio tortor ornare. Donec proin porta blandit elit duis malesuada lobortis volutpat dapibus. Curae augue lorem cursus fusce cubilia libero tristique nulla et rutrum est vivamus volutpat mauris. Curae proin luctus at orci velit ut hendrerit suspendisse netus libero dictumst.,http://lorempixel.com/300/300/people,Maple Farms,Kenda Scarboro,Bridgette Efird,2013-03-17 +4,http://lorempixel.com/300/300/people,2013-04-05,Purus risus. Felis donec cras porttitor ad hendrerit a class in. Fusce risus a. Fusce purus nulla fusce sed cubilia faucibus ad scelerisque. Vitae justo. Netus vitae primis augue eleifend nisl eni duis urna viverra. Risus augue libero fringilla nullam bibendum condimentum lobortis nulla. Risus metus.,http://lorempixel.com/300/300/people,Cherokee Rock,Adriene Rizo,Tamie Kist,2013-03-31 +1,http://lorempixel.com/300/300/people,2012-10-06,Fames purus. Velit neque rutrum aenean. Neque felis. Massa netus quam magnis ante tempor nulla ullamcorper praesent proin hac. Magna metus. Etiam lacus placerat per purus. Etiam velit nunc aliquet aptent diam orci senectus dapibus consequat at. Curae class eni metus nulla senectus nulla nibh magnis.,http://lorempixel.com/300/300/people,Paso Rojo,Del Smithey,Trina Studdard,2012-07-15 +2,http://lorempixel.com/300/300/people,2013-02-19,Nulla fames erat lacus. Neque massa cras sodales posuere conubia nullam at lobortis egestas tellus arcu vulputate habitant ipsum purus. Magna felis. Neque proin odio potenti habitasse arcu hac arcu praesent. Metus dolor ligula nascetur lorem. Donec fusce eleifend donec ve rutrum dignissim ac. Lorem felis sem curae vel adipiscing malesuada amet egestas sem nisl maecenas. Porta morbi nibh consequat primis consequat.,http://lorempixel.com/300/300/people,Sandpiper Strand|Tern Inlet|Mariner Firth,Venessa Scull,Florene Sakai,2012-12-22 +3,http://lorempixel.com/300/300/people,2012-07-23,Justo augue enim velit senectus class nisl dignissim hac metus platea quis urna felis. Metus porta dui odio non ut tempus. Donec etiam scelerisque amet hendrerit habitant curae phasellus metus eu consectetuer ornare primis. Nulla morbi. Justo nulla convallis blandit magna ac curae et facilisis a. Netus porta libero tortor. Nulla purus euismod ligula leo nisl quis euismod mi. Lorem netus.,http://lorempixel.com/300/300/people,Breadfruit Bay,Hana Turnipseed,Dyan Shay,2012-06-25 +3,http://lorempixel.com/300/300/people,2012-04-14,Massa justo. Risus neque. Justo felis quam potenti in mi cras sodales et. Etiam netus varius praesent enim. Neque donec massa pretium mattis. Proin netus. Porta purus nisi. Magna lorem.,http://lorempixel.com/300/300/people,Cambridge Ridge|Lazy Butte,Everett Stever,Glennie Borrero,2012-01-31 +2,http://lorempixel.com/300/300/people,2013-04-19,Lacus metus. Magna vitae. Massa dolor fusce semper tempor amet platea egestas. Fames felis taciti eu mauris. Porta proin. Curae lorem odio a eget at interdum posuere. Purus vitae. Justo class vehicula penatibus eni gravida diam magna praesent duis dis ut volutpat.,http://lorempixel.com/300/300/people,The Dale at Antelope Quarter|Avocado Delta|Tern Coast,Birgit Shires,Mavis Schramm,2013-03-21 +5,http://lorempixel.com/300/300/people,2012-07-17,Lorem dolor varius ac cras potenti eu orci placerat suspendisse suscipit. Fames fusce condimentum interdum elit. Felis lacus congue. Proin curae per. Donec porta. Fusce velit ullamcorper accumsan conubia feugiat cras. Dolor fusce condimentum vel arcu urna dis laoreet. Massa nulla feugiat diam nibh ornare facilisi sed tortor.,http://lorempixel.com/300/300/people,Banyan Bay|The Acres at Leafy Ridge|Macaw Island,Lecia Harling,Francesco Marcinkowski,2012-06-23 +5,http://lorempixel.com/300/300/people,2012-07-29,Lorem neque aenean eu id sapien nec aliquam litora nisi. Class curae nullam ve mattis ad aenean sem euismod dictumst. Massa fames. Curae neque a amet in diam. Dolor felis taciti magna adipiscing nascetur quam feugiat a lectus nibh consectetuer parturient odio. Curae morbi posuere rutrum etiam ornare eget eu amet nibh vulputate. Vitae proin lectus in faucibus commodo etiam. Velit class.,http://lorempixel.com/300/300/people,Banyan Bay|The Acres at Leafy Ridge|Macaw Island,Luanna Duggan,Francesco Marcinkowski,2012-06-17 +2,http://lorempixel.com/300/300/people,2012-09-02,Fusce netus sem lorem. Massa fusce. Class curae nonummy. Lorem class mus amet quis potenti ultricies. Etiam metus mollis donec vestibulum ullamcorper. Massa purus. Donec dolor. Dolor porta velit cum mollis tortor lacus.,http://lorempixel.com/300/300/people,Macaw Reef|The Suburb at Evergreen Village,Virgen Brummitt,Molly Monteleone,2012-06-11 +1,http://lorempixel.com/300/300/people,2013-01-19,Ipsum lorem turpis tellus nec tellus auctor. Justo class a primis dolor integer nullam ve lacinia mi integer cras. Morbi fusce. Vitae dolor platea duis cursus cubilia euismod. Purus porta magnis id maecenas leo semper senectus gravida consectetuer. Lorem massa molestie purus cubilia senectus porta id. Purus curae conubia ve ut id nisl aptent. Neque ipsum dolor facilisi velit cras.,http://lorempixel.com/300/300/people,Mild Hills,Caprice Doris,Lurline Nickols,2012-10-22 +5,http://lorempixel.com/300/300/people,2013-06-17,Dolor magna vitae urna augue integer. Curae massa cum ante vel commodo et eu. Porta neque libero lorem dictum eu hac quam. Metus lacus. Velit morbi molestie cum. Proin etiam proin. Class augue justo. Netus purus.,http://lorempixel.com/300/300/people,The Prairie of Thanksgiving Gulf|Stork Haven|The Oaks at Bridgwater Vineyard,Cythia Doten,Daniel Wyrick,2013-04-30 +2,http://lorempixel.com/300/300/people,2012-03-29,Risus porta tempus dis mi faucibus tortor primis urna fusce. Ipsum curae nec proin. Velit justo diam ipsum donec elit. Curae morbi massa sociis inceptos id condimentum. Donec porta dictumst. Class metus cum duis luctus phasellus ligula a vestibulum sed netus. Magna vitae dui fusce ipsum duis quis. Morbi magna condimentum nec luctus fusce faucibus.,http://lorempixel.com/300/300/people,The Vineyard at Bobcat Woods,Buddy Herrod,Timika Majors,2012-01-05 +5,http://lorempixel.com/300/300/people,2013-05-09,Fusce magna. Purus metus habitasse turpis curabitur. Porta justo platea bibendum congue iaculis orci cras eros ipsum gravida. Felis porta amet pretium odio in sollicitudin turpis augue ridiculus cubilia consectetuer. Lorem augue nulla mattis sociosqu parturient lectus volutpat per. Proin curae luctus. Lacus metus taciti primis proin potenti per. Magna purus felis.,http://lorempixel.com/300/300/people,Dorset Gardens,Christel Henrickson,Justine Lett,2013-03-16 +1,http://lorempixel.com/300/300/people,2012-10-21,Vitae curae. Class dolor penatibus accumsan taciti nisl pellentesque inceptos augue quis massa. Massa nulla a cursus enim elit porta ipsum nunc ad magna class placerat vitae. Augue ipsum nostra taciti tristique aliquet mus sagittis. Nulla donec netus potenti quis hac sagittis a accumsan per. Fusce ipsum. Justo fusce scelerisque enim nibh dictumst senectus et. Vitae felis a vivamus id fermentum.,http://lorempixel.com/300/300/people,Mar Blanco,Allie Hance,Leora Feinberg,2012-08-02 +2,http://lorempixel.com/300/300/people,2012-02-06,Massa neque nulla ligula praesent adipiscing imperdiet condimentum facilisis quam quisque arcu nunc faucibus laoreet. Dolor metus. Dolor neque laoreet. Curae donec. Velit morbi congue orci. Velit augue hac elit nisi eni nulla adipiscing eu maecenas mus laoreet proin. Donec class. Fames felis tempor tristique quisque lorem duis hendrerit elit.,http://lorempixel.com/300/300/people,The Heath at Old Valley|Ash Dale,Maxie Hollifield,Kristeen Kindel,2012-01-18 +3,http://lorempixel.com/300/300/people,2012-06-16,Magna justo est diam quis odio leo. Dolor justo ullamcorper pulvinar neque id curabitur metus tempor mattis. Magna morbi. Augue curae. Netus porta. Magna fusce. Ipsum purus dictumst. Felis donec eni vivamus id turpis.,http://lorempixel.com/300/300/people,Partridge Estates|Otter Rise|Playa Blanca,Iona Lisenby,Janet Stfleur,2012-04-27 +4,http://lorempixel.com/300/300/people,2013-05-09,Morbi proin. Felis fames metus sem ante eleifend vel ipsum est vestibulum porttitor risus nisi euismod et in. Magna risus lacus curae nisl mattis rutrum. Metus justo scelerisque in libero consequat felis et mattis curae duis. Etiam proin. Morbi proin tempus pharetra nibh penatibus et ante. Fames donec netus tempor montes odio cubilia justo metus mus urna nulla auctor id. Magna morbi ridiculus molestie id taciti mi.,http://lorempixel.com/300/300/people,The Brook of Axbridge Bluff,Sindy Koller,Gus Ensign,2013-04-30 +1,http://lorempixel.com/300/300/people,2012-08-12,Morbi dolor nam. Fames donec. Augue metus. Ipsum porta diam inceptos a. Velit curae leo neque ridiculus. Lorem massa condimentum at ornare porttitor lobortis libero eros cras lacinia at odio nec. Risus massa. Lorem justo eget per felis aliquet odio sagittis.,http://lorempixel.com/300/300/people,The Oaks at Firefly Quarter|Rambutan Dunes|Sweet Summit,Jennine Saephan,Elijah Fairbanks,2012-06-19 +3,http://lorempixel.com/300/300/people,2012-03-18,Curae class lacinia conubia nisi non praesent. Dolor donec eros et pharetra tempus varius. Morbi metus. Class morbi conubia orci accumsan vestibulum. Justo lorem ultrices ac purus. Etiam nulla semper maecenas. Metus lacus. Etiam velit sociis sagittis nulla mi vitae.,http://lorempixel.com/300/300/people,The Park at Liberty Acres,Lucinda Stracener,Shantay Shivers,2012-01-22 +2,http://lorempixel.com/300/300/people,2012-08-25,Lacus curae netus lobortis ridiculus id. Metus nulla. Velit etiam mus platea quam justo viverra integer magnis in nisl. Vitae fames hendrerit adipiscing ante ornare est quisque facilisi lacinia ornare elit. Nulla risus luctus nisi magnis in ligula eu. Class risus. Class proin diam ornare feugiat. Nulla lorem condimentum habitant urna nam quisque cras.,http://lorempixel.com/300/300/people,Admiral's Reef|Salisbury Mesa|Toucan Gulf,Charlott Rondeau,Hellen Gatton,2012-07-21 +4,http://lorempixel.com/300/300/people,2012-05-08,Donec massa ullamcorper interdum. Morbi neque velit dui lorem euismod. Porta justo felis donec cubilia orci rhoncus. Augue risus nec laoreet diam id consectetuer. Vitae velit vitae cursus et bibendum nascetur tellus eros per conubia eu hymenaeos id. Morbi magna facilisi. Vitae dolor orci dui. Curae fusce auctor netus vestibulum ultrices fames aliquet phasellus.,http://lorempixel.com/300/300/people,The Knoll at Inviting Downs|Aloha Dunes|Tamarind Harbor,Lili Scally,Jarvis Nazario,2012-04-05 +2,http://lorempixel.com/300/300/people,2012-06-14,Morbi proin felis dui lacus. Lorem lacus quis. Lorem curae nunc est nisl cras magna ultricies euismod pellentesque. Ipsum augue. Velit metus aliquam quam urna elementum eu. Ipsum lorem suspendisse eu ornare eu amet class sodales hac at cursus volutpat. Metus neque. Magna purus.,http://lorempixel.com/300/300/people,Valle Mariposa|Laughing Vale,Mozelle Saez,Venice Feldman,2012-05-20 +4,http://lorempixel.com/300/300/people,2012-03-26,Lorem neque inceptos adipiscing. Neque morbi. Lorem massa. Etiam justo a sapien donec convallis vel. Class felis. Risus class ultrices massa nullam at netus. Class donec varius magnis magna cras vulputate tristique quam sed in a pede. Augue velit accumsan diam volutpat fringilla in ullamcorper.,http://lorempixel.com/300/300/people,Leeward Reef,Jacque Behm,Leslee Heard,2012-03-15 +5,http://lorempixel.com/300/300/people,2012-07-05,Velit purus habitant etiam eros blandit mi phasellus a. Velit nulla. Fusce porta. Ipsum neque turpis et nisi nascetur magna odio. Vitae neque dui augue elementum hendrerit porta. Nulla magna. Dolor etiam eget ornare at. Donec purus ipsum dolor dui lorem.,http://lorempixel.com/300/300/people,Palm Bay,Janean Nordby,Marcia Chabot,2012-06-13 +2,http://lorempixel.com/300/300/people,2013-05-13,Morbi lorem luctus pulvinar malesuada aenean vehicula mus nisi. Netus massa eget proin hymenaeos cras conubia. Proin justo nec sociis placerat facilisis sollicitudin vestibulum. Purus nulla pulvinar. Netus etiam semper eu sed. Class risus. Donec massa cursus suscipit parturient tempor suscipit neque. Proin neque lacinia urna ve class at quam.,http://lorempixel.com/300/300/people,Cherokee Rock,Larue Gay,Tamie Kist,2013-03-12 +2,http://lorempixel.com/300/300/people,2013-04-30,Velit nulla amet tristique cursus faucibus quis lectus. Fames metus molestie ultricies fames a. Morbi curae ornare montes est orci bibendum pellentesque tempor lorem ac congue at ornare torquent quis. Fusce morbi aliquam lacinia congue leo et primis eni conubia. Dolor fames. Proin porta. Neque augue a turpis augue morbi tellus lectus quis tellus fringilla mi malesuada. Nulla proin conubia eni in.,http://lorempixel.com/300/300/people,The Villas at Iroquois Timbers,Carly Toro,Dewayne Sisco,2013-04-09 +3,http://lorempixel.com/300/300/people,2013-01-20,Curae risus elementum. Porta velit maecenas ad ante. Vitae neque amet. Augue donec nec eget at metus quis netus tristique aenean diam ad nisi class pharetra in dui neque. Porta donec a turpis nibh. Ipsum fames natoque potenti erat torquent lorem et semper vitae. Magna velit tempus ipsum sed donec facilisis lobortis porta. Netus curae.,http://lorempixel.com/300/300/people,Pineapple Breakers,Charlott Rondeau,Gail Gatts,2012-11-07 +5,http://lorempixel.com/300/300/people,2012-08-05,Purus fames quam mollis ad amet consequat leo ante proin potenti quisque. Proin justo a pede ac nibh fermentum dictum. Ipsum lorem vitae donec urna a arcu vestibulum cursus ad. Nulla morbi tortor fusce ipsum a aptent. Risus fusce leo. Ipsum magna ligula justo vel tortor volutpat porttitor sed pede. Dolor netus neque per eros libero laoreet feugiat imperdiet mollis. Risus ipsum tempus mollis phasellus sociosqu mauris ornare.,http://lorempixel.com/300/300/people,Maple Ranch|The Point at Welcome Village|Passion Fruit Breakers,Janean Nordby,Muoi Bays,2012-07-18 +1,http://lorempixel.com/300/300/people,2012-08-09,Ipsum curae nisi ac eleifend pretium aptent pede ut cras ullamcorper ac. Metus donec iaculis hac lectus aliquam vivamus luctus. Dolor donec aenean mus nibh primis. Vitae metus vel adipiscing. Proin ipsum aliquet. Fusce massa. Felis fames ante purus dapibus. Magna purus nisl tortor diam mi.,http://lorempixel.com/300/300/people,Moose Crest|Parrot Dunes|The Crossing at Lonesome Village,Shauna Merkel,Matilda Redmond,2012-06-18 +4,http://lorempixel.com/300/300/people,2013-05-02,Felis donec sociosqu ac ullamcorper nisl. Dolor ipsum nonummy aenean hac et. Risus neque platea senectus congue lectus fusce ut bibendum. Porta purus sociis id sociis habitasse fringilla. Lacus ipsum feugiat congue sem id. Felis purus. Morbi magna augue duis sed porttitor erat. Massa felis volutpat facilisis vitae dui diam eros integer arcu netus hymenaeos.,http://lorempixel.com/300/300/people,Hunter Downs|Lonely Homestead|Passion Fruit Quay,Zoila Meadow,Yang Brosnan,2013-02-28 +3,http://lorempixel.com/300/300/people,2012-09-16,Velit metus cras conubia lacinia montes fusce lobortis proin. Nulla justo per vitae ante fringilla et. Fusce lacus aenean suspendisse donec tellus etiam. Felis risus habitant eu sem erat amet ac dictum sodales feugiat. Metus risus. Massa etiam eros ultrices facilisi. Morbi magna. Fames massa tortor condimentum fusce ornare amet.,http://lorempixel.com/300/300/people,Wandering Vineyard,Randal Needleman,Tonette Moos,2012-06-19 +3,http://lorempixel.com/300/300/people,2012-05-12,Fusce neque nibh. Felis proin eni vitae class velit congue. Porta netus mauris phasellus fusce purus vel parturient adipiscing ut senectus erat vel. Massa curae per duis nisi velit maecenas per. Class nulla eget est in sollicitudin. Porta neque per odio accumsan metus at mi. Purus lorem leo eros. Morbi lacus sed eget fusce nisl inceptos.,http://lorempixel.com/300/300/people,The Glen at Blue Spruce Park,Saundra Crigger,Nikole Frum,2012-05-11 +2,http://lorempixel.com/300/300/people,2012-11-26,Lorem massa nec leo consectetuer justo eu ante eu. Curae vitae dapibus turpis ipsum. Lorem class massa. Netus metus posuere. Lacus risus. Dolor metus conubia dictum vel arcu imperdiet sapien massa hymenaeos magna eu. Lorem netus. Curae fusce.,http://lorempixel.com/300/300/people,Salisbury Mesa|Owl Brook|Macaw Shore,Danette Giltner,Henriette Diedrich,2012-10-31 +4,http://lorempixel.com/300/300/people,2013-03-22,Curae massa sit dui nec habitasse justo velit cum nibh pede lacinia habitasse maecenas. Fames dolor. Felis justo nunc nec praesent a pellentesque nibh ipsum aliquam iaculis. Lorem augue dapibus feugiat arcu facilisi parturient aenean eros sollicitudin mi commodo diam nisl nascetur justo pellentesque. Metus morbi eleifend nam blandit. Class proin massa taciti primis. Morbi justo vehicula ante eu quis magna imperdiet. Justo vitae sem enim.,http://lorempixel.com/300/300/people,Sunset Bay|Puerto Conejo,Dione Sharma,Kimberli Minelli,2013-01-14 +3,http://lorempixel.com/300/300/people,2012-12-29,Fames dolor porttitor dolor arcu vehicula fames et nulla. Risus fusce quis bibendum vestibulum semper. Massa nulla vehicula in dolor ultricies sed blandit fusce. Vitae augue etiam arcu aenean. Neque class eros sed tempus ut ve penatibus erat eni cum ad fringilla ve. Fames porta pede. Curae lacus primis blandit id et at. Velit morbi.,http://lorempixel.com/300/300/people,Shady Pasture,Tomika Shimer,Roxann Leong,2012-11-01 +5,http://lorempixel.com/300/300/people,2012-04-05,Dolor purus. Magna lacus commodo ante adipiscing. Fames justo torquent proin ad primis sagittis elit. Augue neque erat tempor sed. Lacus felis. Magna lorem. Felis dolor ullamcorper urna arcu. Purus massa egestas nunc proin fusce sem diam potenti cubilia.,http://lorempixel.com/300/300/people,Dorset Gardens,Mozelle Saez,Justine Lett,2012-03-14 +3,http://lorempixel.com/300/300/people,2012-05-30,Neque magna. Augue class magna netus. Lorem etiam neque integer ornare per nunc ante arcu. Purus fames etiam est eni elementum pretium sem potenti. Donec fames tempor scelerisque velit convallis leo consectetuer. Augue class nisi inceptos justo. Felis purus. Lorem ipsum non faucibus tincidunt sollicitudin.,http://lorempixel.com/300/300/people,Weaver's Butte|Kelp Gulf|American Inlet,Luise Klippel,Shara Lamonica,2012-04-14 +2,http://lorempixel.com/300/300/people,2013-03-25,Donec morbi condimentum est ve. Porta lacus sociis adipiscing curae. Morbi felis fames massa nullam adipiscing class nunc. Curae massa. Vitae etiam. Curae justo. Ipsum metus. Ipsum proin eni duis tincidunt.,http://lorempixel.com/300/300/people,Valle Viejo,Saundra Crigger,Clarice Ly,2013-02-05 +4,http://lorempixel.com/300/300/people,2012-05-10,Neque massa nisl lorem molestie ultricies praesent tempor. Velit donec aenean netus condimentum habitant rhoncus laoreet ligula. Morbi risus vehicula id nam curabitur. Fames metus risus amet ornare hac aliquet a auctor cras consectetuer praesent. Ipsum augue platea senectus sed dolor convallis amet enim. Felis risus cum feugiat hac ac congue sapien imperdiet accumsan. Netus massa cum enim praesent hendrerit ve etiam. Curae lacus quis hendrerit senectus turpis.,http://lorempixel.com/300/300/people,Whaler's Cove,Dione Sharma,Silvia Miranda,2012-03-15 +3,http://lorempixel.com/300/300/people,2012-05-09,Augue risus nostra sollicitudin sodales quam erat quisque ve ligula mi taciti magna. Dolor vitae ornare dictumst mi. Etiam neque per habitant sodales sociis neque rhoncus aenean. Ipsum porta. Lacus velit felis scelerisque maecenas tristique ut. Metus class. Velit lorem purus nunc mi quis arcu aliquet. Purus lorem.,http://lorempixel.com/300/300/people,Palm Bay,Laurinda Franson,Marcia Chabot,2012-04-19 +1,http://lorempixel.com/300/300/people,2012-03-20,Dolor risus. Fusce nulla vehicula morbi rutrum tempor sem. Magna porta elementum parturient quis etiam. Fames ipsum mollis et urna justo. Magna lacus a mauris pede. Etiam lacus diam eni gravida a varius nunc tincidunt sociosqu ad. Felis porta potenti. Neque netus feugiat dignissim praesent.,http://lorempixel.com/300/300/people,Pueblo Nuevo,Dione Sharma,Marilynn Shier,2012-02-12 +1,http://lorempixel.com/300/300/people,2012-11-13,Fusce etiam lorem natoque facilisis ut ad. Curae metus blandit et in porta turpis proin luctus parturient volutpat nulla phasellus libero ligula. Magna dolor nostra vitae mus. Lorem augue amet feugiat ut. Vitae netus a orci massa litora elit amet morbi. Neque fames montes elit sollicitudin ad ipsum tortor id luctus facilisis felis malesuada ve. Fusce magna tempor leo quisque ligula et id ornare nonummy. Felis lacus etiam integer vitae nibh viverra felis urna vivamus ut.,http://lorempixel.com/300/300/people,Magnolia Mount|Shady Pasture,Jade Clutts,Beatrice Kinne,2012-09-25 +2,http://lorempixel.com/300/300/people,2012-04-17,Morbi lorem. Porta augue potenti nisi. Neque curae nec etiam mus felis vestibulum volutpat. Massa felis dictum pellentesque laoreet dis parturient adipiscing at nisl. Neque augue taciti tellus mus natoque porta velit sociis. Lacus netus sociis primis sociosqu vestibulum egestas. Massa justo. Class proin dictum tempor.,http://lorempixel.com/300/300/people,Whaler's Timbers|Azalea Overlook|Muskrat Prospect,Vikki Rufus,Melanie Bricker,2012-01-30 +4,http://lorempixel.com/300/300/people,2012-05-26,Magna lacus commodo viverra aenean sem. Morbi lorem interdum orci leo conubia lacus nibh auctor. Fames fusce. Dolor donec dis massa. Lacus proin. Fames ipsum. Proin velit. Curae morbi dictumst vitae sapien neque at.,http://lorempixel.com/300/300/people,Angler's Meadows|The Villas of Dover Prairie,Kera Cybart,Monte Player,2012-03-06 +3,http://lorempixel.com/300/300/people,2012-03-31,Class purus vivamus nunc. Etiam justo. Lorem fusce. Netus curae feugiat nostra metus adipiscing at phasellus risus. Nulla curae mauris maecenas urna platea. Curae justo dolor urna luctus libero nec litora curae nec fusce. Fusce velit erat fermentum lobortis interdum ipsum ve non eget urna phasellus torquent. Lorem etiam.,http://lorempixel.com/300/300/people,The Harbor at Fireside Promontory|The Estates at Spruce Brook|Sunrise Terrace,Carly Toro,Jacque Behm,2012-03-16 +2,http://lorempixel.com/300/300/people,2013-02-01,Justo neque. Curae porta nulla mattis curae. Vitae massa neque augue nec erat in consectetuer natoque velit. Purus etiam interdum ac suspendisse nisi nibh risus habitasse interdum nascetur. Nulla metus rutrum ridiculus eleifend aptent duis. Metus massa lorem posuere montes sed. Lacus netus sed vestibulum class nunc vel. Magna netus.,http://lorempixel.com/300/300/people,Banana Anchorage|Rancho Blanco,Lecia Harling,Rebbecca Friedlander,2012-11-05 +3,http://lorempixel.com/300/300/people,2013-03-29,Purus massa curae montes pede quam dignissim turpis. Proin massa arcu ad pellentesque ante nonummy blandit. Proin neque nascetur orci nostra vivamus blandit odio torquent. Justo proin scelerisque mi aptent est integer ultrices id. Velit vitae. Netus justo duis laoreet odio ipsum porttitor sociosqu curae ad lacus. Metus curae purus dui sit ac etiam interdum. Ipsum donec arcu faucibus leo odio ve eget luctus aliquet aliquam orci in.,http://lorempixel.com/300/300/people,Seagull Firth|Madera Roja,Mozelle Saez,Contessa Venable,2013-02-21 +5,http://lorempixel.com/300/300/people,2013-04-29,Risus magna taciti tellus urna eu malesuada nunc mus. Purus massa nisl porttitor congue mi curae leo rhoncus lobortis varius laoreet. Donec netus. Purus fusce diam volutpat non egestas curae lacus. Risus fusce. Risus justo cum lacus sed vestibulum curabitur etiam odio urna dis. Velit lacus quam rhoncus laoreet mollis nulla sem. Justo augue sapien mauris dis vestibulum class cubilia magnis libero.,http://lorempixel.com/300/300/people,Toucan Island|Oak Orchards|Choctaw Canyon,Seymour Bollig,Syble Flynn,2013-03-12 +3,http://lorempixel.com/300/300/people,2013-03-30,Lacus proin cum quam vel lacus sit cras ve donec eni. Class proin sit mauris mi praesent natoque diam vel etiam. Fusce metus morbi nullam donec felis rutrum eros eget feugiat. Felis lorem litora ad sit porttitor est per sit mi nostra. Neque velit pede bibendum scelerisque volutpat phasellus leo nisi erat. Felis morbi cubilia egestas lectus per eros iaculis dis torquent aliquet. Curae fusce sit lorem. Lacus felis ligula semper interdum ullamcorper.,http://lorempixel.com/300/300/people,Angler's Meadows|The Villas of Dover Prairie,Jade Clutts,Monte Player,2013-02-15 +3,http://lorempixel.com/300/300/people,2012-04-28,Lacus curae aptent magnis mi enim feugiat egestas pede ad. Proin class a varius hendrerit torquent fusce vel cum sollicitudin. Neque nulla a tempus consequat ve primis non blandit turpis nam. Morbi nulla. Morbi etiam purus felis risus elementum litora varius cubilia primis. Massa dolor rutrum malesuada lobortis dolor. Lorem metus varius netus per. Ipsum magna turpis nisi magna bibendum.,http://lorempixel.com/300/300/people,Wessex Vale,Chang Morquecho,Luther Cybart,2012-03-07 +3,http://lorempixel.com/300/300/people,2012-08-26,Donec dolor enim morbi congue felis. Morbi magna purus nostra tellus in. Felis morbi. Augue curae. Lorem magna hendrerit imperdiet vestibulum eros fames proin varius dictumst pretium arcu a enim. Fames morbi. Lorem risus dui convallis curae ipsum eni morbi. Risus vitae purus interdum ante dui nibh.,http://lorempixel.com/300/300/people,Sandy Haven,Ida Galang,Vena Gizzi,2012-07-25 +4,http://lorempixel.com/300/300/people,2012-12-12,Velit nulla eleifend odio vivamus a suspendisse est. Morbi neque odio commodo. Massa lorem litora cursus cubilia pretium cursus eni et eros habitant ullamcorper. Magna dolor. Lacus porta. Lacus proin ornare tortor massa vel pretium massa id turpis. Curae nulla dapibus congue leo sodales pulvinar cubilia eros at pellentesque rhoncus. Proin magna primis diam ut.,http://lorempixel.com/300/300/people,The Chapel at Palm Hearth|Admiral's Island,Fred Victory,Sherika France,2012-11-10 +5,http://lorempixel.com/300/300/people,2012-06-13,Ipsum purus auctor pharetra est nonummy. Donec augue. Magna curae nascetur eros vivamus et mattis elementum. Curae dolor magna. Class fames. Augue felis elit erat enim eros leo. Justo vitae auctor. Curae fames.,http://lorempixel.com/300/300/people,Lovely Knoll|Pueblo Redondo|The Farms at Castle Hills,Kemberly Lecuyer,Kelly Couto,2012-04-06 +5,http://lorempixel.com/300/300/people,2013-02-05,Netus neque nunc ut nisi facilisis hymenaeos elit hac massa parturient nascetur neque in. Nulla purus cursus ultrices nisl orci curae. Netus purus sagittis eget integer odio ipsum. Proin justo nec lectus taciti. Porta donec accumsan. Proin felis lobortis augue morbi nulla per parturient habitasse class. Magna fames lorem eros at orci interdum donec. Class lorem habitant neque fringilla cras.,http://lorempixel.com/300/300/people,Whaler's Cove,Venessa Scull,Silvia Miranda,2012-12-15 +2,http://lorempixel.com/300/300/people,2012-10-27,Class felis curae natoque dui feugiat accumsan eu dui urna. Proin purus. Curae fames maecenas ultricies orci vel magnis pulvinar. Nulla neque vel. Dolor velit. Risus donec volutpat eros non eni ad ipsum dis. Nulla ipsum enim. Netus donec quam elementum consectetuer vestibulum pede.,http://lorempixel.com/300/300/people,The Sanctuary at Hastings Point|The Outlook at Andover Orchards|Buffalo Orchards,Everett Stever,Waylon Lubin,2012-08-07 +3,http://lorempixel.com/300/300/people,2013-02-20,Metus lacus suscipit magna pretium enim. Proin etiam per conubia luctus pede non cum. Justo purus risus aenean. Metus justo bibendum nam posuere ve. Class lacus litora ornare inceptos. Netus class. Class felis metus curae molestie quis nibh netus ad. Etiam felis mauris lorem eros sed a primis eros urna eni consectetuer tempor.,http://lorempixel.com/300/300/people,Azalea Glen,Rodrick Turberville,Marget Charlebois,2012-11-23 +5,http://lorempixel.com/300/300/people,2013-02-02,Class morbi laoreet ve nunc ullamcorper integer sit quisque. Purus augue molestie lacus taciti lobortis nunc ornare hendrerit. Velit lacus. Morbi netus. Augue felis dui nulla imperdiet. Justo dolor. Fusce lorem. Neque velit quam duis aliquam massa parturient maecenas sodales dictumst urna fringilla.,http://lorempixel.com/300/300/people,Pineapple Breakers,Sandie Misiewicz,Gail Gatts,2012-12-31 +1,http://lorempixel.com/300/300/people,2012-09-09,Augue nulla cubilia. Dolor morbi pulvinar sit potenti lobortis nibh orci parturient porttitor ullamcorper purus taciti. Vitae fusce curae felis vel morbi porttitor praesent platea pharetra adipiscing penatibus scelerisque. Justo felis tortor eros consectetuer. Vitae justo porta fusce a tempus risus pede cubilia class. Lacus class. Class fusce. Fusce massa maecenas metus vitae felis sem adipiscing.,http://lorempixel.com/300/300/people,Magnolia Oaks|Kissing Highlands|Guava Sands,Adina Jezierski,Anh Hermanson,2012-09-08 +2,http://lorempixel.com/300/300/people,2012-03-15,Nulla fusce magnis felis netus ligula massa sem ante. Purus lacus semper est dui. Metus lorem. Neque magna enim ad montes praesent ante. Etiam porta. Felis nulla erat quisque fusce conubia. Massa lacus ipsum odio rutrum per luctus risus. Netus class purus.,http://lorempixel.com/300/300/people,The Hills at Poplar Summit|Welcome Lakes,Vikki Rufus,Rolando Bjornson,2012-01-02 +4,http://lorempixel.com/300/300/people,2012-06-14,Justo proin dis quam fames sociis ultricies ut velit pellentesque. Class vitae ullamcorper volutpat potenti vivamus quis nisl dapibus. Etiam dolor dapibus sociis pede hendrerit mollis suscipit pede facilisi molestie fusce. Netus justo luctus suscipit vulputate velit ante cras odio donec eu taciti. Nulla etiam odio laoreet eu. Augue fusce odio nam magna etiam aliquam. Dolor velit arcu felis curae sagittis tristique. Nulla fames erat leo platea feugiat.,http://lorempixel.com/300/300/people,Rancho Grande,Rodrick Turberville,Altha Ahumada,2012-06-09 +3,http://lorempixel.com/300/300/people,2013-03-25,Class porta natoque at curae ac justo ligula dignissim at rutrum vehicula dictumst feugiat id. Fusce proin feugiat ac vel diam ve vitae. Proin velit condimentum erat tristique nibh orci eros habitasse dui. Curae risus. Felis nulla nonummy vel ut auctor rhoncus nunc nibh parturient ante. Neque dolor nisl vel mus sed. Lorem purus. Dolor donec viverra diam nunc nibh dis fusce sit dictum orci eget vel litora leo.,http://lorempixel.com/300/300/people,Sunset Bay|Puerto Conejo,Luise Klippel,Kimberli Minelli,2013-02-25 +3,http://lorempixel.com/300/300/people,2012-04-27,Lacus vitae. Justo augue habitant vel ac a sociis ante tincidunt. Fusce donec habitasse maecenas at felis. Purus nulla. Curae lacus litora. Dolor felis. Justo dolor aliquet nunc. Neque purus per nunc sed nisi nisl lorem.,http://lorempixel.com/300/300/people,Shady Pasture|Cougar Woods|Banyan Inlet,Aja Hesler,Augustine Failla,2012-04-06 +1,http://lorempixel.com/300/300/people,2013-02-28,Curae netus suspendisse. Porta magna dui diam vestibulum et molestie aliquam lacinia odio adipiscing libero massa proin. Augue netus primis dictum etiam donec turpis at pulvinar. Metus porta. Lorem class molestie mi quis netus curabitur imperdiet cras sit. Porta risus vel dictumst. Donec lacus. Neque curae netus aliquet primis cum eget cras id etiam pellentesque sociosqu ipsum ligula sapien hendrerit.,http://lorempixel.com/300/300/people,Lazy Bay|Goose Vineyard|Regal Park,Elouise Connon,Kirsten Buchholtz,2012-12-27 +1,http://lorempixel.com/300/300/people,2012-07-28,Porta ipsum dictum. Proin neque viverra cum. Metus augue ligula penatibus nam inceptos tristique ac dolor et non urna. Magna ipsum habitant venenatis fames ac nascetur congue platea augue ve et. Justo fames. Purus velit metus sed sociis ornare sagittis convallis. Lorem velit fusce torquent nunc duis pretium massa ipsum massa primis lectus nam integer. Curae metus platea eu justo tempor litora netus arcu.,http://lorempixel.com/300/300/people,The Promontory at Maple Hearth|Mesa Coneja,Chang Morquecho,Clarinda Coghlan,2012-07-27 +2,http://lorempixel.com/300/300/people,2013-01-31,Nulla magna class. Curae velit porta quam ut ante dictumst auctor nullam. Lacus felis dignissim gravida pellentesque vulputate. Magna risus. Massa morbi. Lacus felis dui malesuada eros cum vitae sem justo ipsum proin donec nibh nonummy lorem cras congue. Augue lorem dapibus elit nisi eu. Fusce metus lectus eu per scelerisque nonummy ullamcorper duis quam.,http://lorempixel.com/300/300/people,Secluded Meadows|Partridge Park,Adina Jezierski,Venessa Mahmood,2013-01-08 +5,http://lorempixel.com/300/300/people,2013-02-15,Netus risus non facilisi habitasse ligula habitant. Etiam donec nonummy aliquam cras arcu tincidunt ut turpis sapien risus pharetra. Fusce augue diam per lacus duis blandit in. Felis augue a urna vestibulum. Massa metus sociis condimentum class fermentum ut donec cursus. Fames morbi eleifend vitae id odio porta turpis dolor viverra iaculis quam. Curae fames felis sem sociis pulvinar curabitur non quam sit. Nulla fusce cursus morbi.,http://lorempixel.com/300/300/people,Walnut Streams|Oak Haven|Iroquois Vineyard,Danette Giltner,Tonie Pille,2012-12-02 +2,http://lorempixel.com/300/300/people,2012-05-22,Magna ipsum platea dictum sem sodales lacus id tempus eu elit. Magna donec. Etiam proin molestie habitasse urna arcu potenti cubilia mollis. Ipsum metus pharetra. Augue velit eleifend augue cras fames morbi congue netus. Vitae etiam. Risus dolor nibh elit duis nam mus non dui imperdiet. Risus fames odio sociis vestibulum purus odio.,http://lorempixel.com/300/300/people,Thanksgiving Oaks,Elicia Geist,Frankie Desantiago,2012-05-18 +1,http://lorempixel.com/300/300/people,2012-12-25,Vitae felis mauris platea arcu in augue. Nulla augue pede a fames nonummy ipsum cum. Ipsum morbi. Augue donec hac nec dui iaculis curae cras. Proin purus pretium mi ad urna. Nulla donec aliquam cubilia quam justo dignissim rhoncus. Felis neque cum proin aliquam aenean mus laoreet volutpat donec mus praesent laoreet dapibus convallis urna. Metus ipsum ligula felis interdum fermentum.,http://lorempixel.com/300/300/people,Catamaran Lagoon,Winfred Begaye,Myrta Leftwich,2012-11-06 +4,http://lorempixel.com/300/300/people,2012-12-21,Curae class orci sem dapibus sociis est pretium ac. Ipsum class cum quis in vulputate. Netus dolor. Metus magna mus est vel sem dis mus sit. Felis curae. Ipsum augue inceptos ad aptent sit. Fusce felis est. Augue justo.,http://lorempixel.com/300/300/people,Dorset Gardens,Chang Morquecho,Justine Lett,2012-10-17 +5,http://lorempixel.com/300/300/people,2013-05-16,Proin risus justo. Neque netus. Velit proin etiam sit feugiat id hymenaeos ipsum. Etiam class dui nisi facilisis at congue torquent hendrerit. Metus fusce tempus ut. Purus donec. Fusce porta a nullam diam et vulputate arcu dui per dis. Morbi fames cras feugiat ad nostra est nibh cum felis quis augue proin.,http://lorempixel.com/300/300/people,Sunset Bay|Puerto Conejo,Sharlene Chappell,Kimberli Minelli,2013-04-10 +3,http://lorempixel.com/300/300/people,2012-08-10,Massa netus integer erat vehicula a interdum erat quis orci tempor nostra. Lorem dolor. Class lorem etiam lacus. Nulla metus sed adipiscing ridiculus scelerisque hac ve pellentesque tempus. Porta massa litora neque adipiscing condimentum nullam at quam in duis nibh velit purus facilisi. Fames nulla. Curae porta magnis tellus inceptos mollis urna ut magna. Neque purus.,http://lorempixel.com/300/300/people,Wessex Vale,Gilda Puffer,Luther Cybart,2012-05-26 +5,http://lorempixel.com/300/300/people,2013-07-03,Massa lorem dolor porta turpis pharetra vel aenean pretium quis ve est. Proin velit commodo montes curae lorem ante dui. Porta fusce tellus proin fermentum mus cras faucibus lacinia dignissim nam. Porta vitae est ante parturient orci nulla integer feugiat. Felis velit auctor ad enim mattis tristique ridiculus lorem porta lobortis magna gravida. Magna neque. Nulla morbi dictum turpis est at tellus. Ipsum fames primis fames interdum ante lobortis.,http://lorempixel.com/300/300/people,Willow Meadows|The Cove at Maple Terrace|The Firth of Peaceful City,Lelia Coppinger,Lesli Mcdonnell,2013-04-05 +3,http://lorempixel.com/300/300/people,2012-02-16,Fames morbi sodales erat a quam ad ridiculus donec eros elementum proin eleifend nisl. Justo class urna taciti adipiscing pellentesque vivamus phasellus pulvinar. Proin lacus lacinia tempus leo parturient. Augue purus cursus platea nam viverra varius. Metus dolor a odio massa. Fusce fames commodo eros pellentesque eu class imperdiet cum eni in consectetuer cubilia. Etiam massa per faucibus. Donec purus ante primis aptent convallis massa ut urna rutrum nec non in tellus sodales.,http://lorempixel.com/300/300/people,Walnut Streams|Oak Haven|Iroquois Vineyard,Lecia Harling,Tonie Pille,2012-01-07 +1,http://lorempixel.com/300/300/people,2013-04-29,Massa morbi felis eget suspendisse iaculis condimentum duis hymenaeos dolor. Massa purus cubilia eros eleifend leo nostra ve. Ipsum morbi aptent sem dictum volutpat in donec quam convallis. Massa vitae proin ante nibh aenean aliquet. Velit augue pretium massa ad id orci purus ipsum. Lacus felis rhoncus tortor in quis pede et sem sapien phasellus ve montes. Proin fames. Metus class gravida.,http://lorempixel.com/300/300/people,The Point at Hunter Pasture|Ciudad Verde|Admiral's Island,Kenda Scarboro,Chase Adler,2013-02-26 +3,http://lorempixel.com/300/300/people,2012-06-22,Magna massa proin nisl. Etiam lacus litora magna parturient senectus rhoncus conubia ornare et. Ipsum purus cursus. Donec fusce class lectus eu vel convallis quam aliquet a condimentum. Lorem dolor. Nulla donec natoque. Felis neque mauris ipsum risus. Dolor morbi a ligula amet ve massa.,http://lorempixel.com/300/300/people,Admiral's Island|Lovely Corner,Bert Kohan,Norman Rugh,2012-05-13 +1,http://lorempixel.com/300/300/people,2012-09-03,Massa proin. Etiam magna litora taciti hac ut. Curae vitae tempus fusce commodo. Lacus magna cursus et ad arcu netus ad tortor. Morbi etiam lorem phasellus curae class. Augue velit. Purus justo scelerisque mi platea est. Curae augue ante senectus non vivamus in ve dignissim.,http://lorempixel.com/300/300/people,Playa Real|Windsor Summit|Dusky Lagoon,Sharan Fucci,Anderson Walton,2012-07-19 +2,http://lorempixel.com/300/300/people,2013-01-04,Class fames scelerisque eni cras bibendum sollicitudin mauris eu id. Justo purus sem curae amet viverra etiam vel nulla donec leo. Nulla etiam nibh ut sem facilisis tempor accumsan suspendisse placerat felis. Donec justo. Proin neque dis ante nibh. Ipsum justo. Purus porta velit felis. Justo netus accumsan justo egestas luctus eu elit amet vivamus ad volutpat nunc.,http://lorempixel.com/300/300/people,The Park at Liberty Acres,Aja Hesler,Shantay Shivers,2012-12-27 +5,http://lorempixel.com/300/300/people,2012-08-12,Augue dolor libero sapien magna parturient suspendisse platea ve nibh at. Lacus fames elit nisi pede inceptos ultricies class. Etiam massa tortor aenean netus integer tristique sem. Lacus porta odio natoque fermentum bibendum vitae mus urna non pede libero pretium. Etiam fames platea arcu. Porta dolor. Ipsum metus dui vulputate. Augue vitae dui arcu felis nonummy morbi nisi magna malesuada adipiscing vel.,http://lorempixel.com/300/300/people,Banyan Lagoon,Michal Blish,Alysha Lococo,2012-06-02 +3,http://lorempixel.com/300/300/people,2013-01-23,Magna netus sit nibh lacinia mi proin consectetuer volutpat. Purus lacus purus sed fusce quisque egestas. Class velit nec arcu dui vitae convallis. Magna netus mus eros dictumst metus. Proin donec. Morbi augue lectus dictumst ligula tortor tincidunt laoreet cum eu. Magna velit. Risus velit eleifend vulputate congue vehicula vulputate ad dolor montes.,http://lorempixel.com/300/300/people,Palm Island|Macaw Anchorage|Banana Breakers,Danette Giltner,Annice Elwood,2012-11-10 +5,http://lorempixel.com/300/300/people,2012-03-18,Neque magna habitant vestibulum tellus vehicula cras hac turpis. Massa justo dolor nam nunc pede hendrerit sollicitudin. Neque fusce leo massa fringilla leo vulputate ligula class. Metus proin pharetra. Metus netus. Fames justo porttitor non justo lorem morbi. Fusce lacus sociosqu lacus at mollis consectetuer cubilia morbi. Fames felis ante aliquam vitae cum facilisis.,http://lorempixel.com/300/300/people,Sioux Colony|The Bluff at Bear Meadows|Bear Mount,Luanna Duggan,Augustine Failla,2012-01-30 +3,http://lorempixel.com/300/300/people,2013-07-14,Vitae nulla curabitur feugiat. Porta ipsum dui cras fames dolor. Ipsum proin euismod. Donec proin tincidunt nostra habitant aptent fames neque volutpat. Porta justo tempor laoreet magnis in eni in sapien. Donec justo primis class dictum lectus. Neque proin integer nonummy nunc. Dolor fusce odio a amet parturient facilisis.,http://lorempixel.com/300/300/people,Sierra Grande,Ashlie Rester,Germaine Exum,2013-04-28 +1,http://lorempixel.com/300/300/people,2012-12-02,Lacus felis. Vitae donec dictum primis leo. Ipsum purus rhoncus fames enim viverra. Curae proin fusce vel quis. Nulla dolor felis mattis malesuada eu hymenaeos conubia consectetuer facilisis luctus nam egestas. Etiam magna nisl. Risus felis purus tempor donec ridiculus penatibus netus commodo montes nisi ut massa id. Purus porta neque felis porttitor felis pede.,http://lorempixel.com/300/300/people,The City at Freedom Dale|Wolf Haven,Shauna Merkel,Elza Gapinski,2012-11-12 +5,http://lorempixel.com/300/300/people,2013-06-24,Felis dolor magnis fusce purus habitant nec mi. Donec class vel quam sollicitudin dictumst magna enim. Ipsum purus a quam parturient hac class tristique nostra. Justo augue facilisi vitae mi mauris diam mus ipsum tempor. Massa velit aliquam orci mi amet mauris est senectus ridiculus sit posuere a suspendisse mus. Neque porta. Justo proin. Ipsum justo ultrices nunc eu proin orci.,http://lorempixel.com/300/300/people,Cambridge Ridge|Lazy Butte,Adriene Rizo,Glennie Borrero,2013-05-08 +2,http://lorempixel.com/300/300/people,2012-09-11,Ipsum fusce lacinia conubia sociis mi. Fusce nulla. Magna augue curabitur cubilia felis. Morbi porta tempus eni pretium torquent morbi metus a cursus morbi. Metus ipsum erat cum conubia a ullamcorper est eros senectus. Class massa tellus enim. Lacus dolor duis blandit. Fusce vitae quis mauris cubilia.,http://lorempixel.com/300/300/people,Baschurch Sanctuary|Poplar Abbey,Elouise Connon,Odette Albritton,2012-07-10 +2,http://lorempixel.com/300/300/people,2013-02-08,Dolor lorem nam etiam porta a nibh parturient ac maecenas vel ad mauris a. Dolor massa mauris in orci tempus. Curae class enim sodales ut platea conubia taciti nulla. Nulla porta sapien habitant mi purus eros ad. Lorem dolor congue ac dui mi enim ullamcorper conubia sollicitudin cursus. Lorem lacus enim. Nulla lacus non augue nulla. Curae vitae.,http://lorempixel.com/300/300/people,The Heath at Old Valley|Ash Dale,Michal Blish,Kristeen Kindel,2013-01-05 +5,http://lorempixel.com/300/300/people,2012-06-09,Felis fames. Metus velit felis odio sociosqu risus inceptos. Augue metus vel per quisque in ridiculus. Dolor neque sit leo in a cursus duis eget inceptos. Velit netus. Curae morbi auctor justo parturient nonummy cum et commodo. Ipsum etiam nibh viverra convallis diam. Curae metus per vestibulum ve tortor neque vel.,http://lorempixel.com/300/300/people,Lovely Farms|The Vista at Lovely Lagoon,Leona Welter,Carin Voegele,2012-03-19 +3,http://lorempixel.com/300/300/people,2012-11-24,Morbi massa. Porta proin nec cras. Metus proin augue pretium facilisis nisl. Donec dolor semper posuere ve. Donec proin semper elit. Massa lacus. Etiam ipsum maecenas ve vitae litora porttitor. Morbi risus facilisi ridiculus eni.,http://lorempixel.com/300/300/people,Acacia Streams|The Valley at Navajo Chapel|The Farms at Plymouth Vineyard,Tyree Aumick,Dawna Vales,2012-08-31 +5,http://lorempixel.com/300/300/people,2013-07-08,Lorem vitae. Felis justo luctus pede eget ve eleifend rhoncus. Magna augue posuere vel ac a nisi. Velit neque a taciti curabitur sodales aptent diam. Risus augue habitant vestibulum tempus vehicula ante mus. Donec lacus. Vitae curae felis fames litora diam dui fringilla conubia hac. Lorem proin sagittis morbi metus sed duis eget.,http://lorempixel.com/300/300/people,Plymouth Cave|Myna Haven|The Cove at Whaler's Prospect,Iona Lisenby,Gwyneth Laidlaw,2013-04-29 +4,http://lorempixel.com/300/300/people,2012-11-14,Velit dolor iaculis mi eget curabitur bibendum ultrices eu fames. Etiam nulla curae sapien ullamcorper risus tincidunt habitant ligula eleifend inceptos id luctus. Morbi velit vel tempus hac elit lacus bibendum nulla ligula. Netus augue est volutpat integer potenti. Neque curae lectus sollicitudin tristique semper accumsan quam nisl mattis pretium potenti. Magna dolor libero lectus non parturient adipiscing in amet. Neque class ante tortor malesuada ultrices. Augue velit nostra congue hac vestibulum parturient ve.,http://lorempixel.com/300/300/people,Moose Crest|Parrot Dunes|The Crossing at Lonesome Village,Kamilah Croke,Matilda Redmond,2012-10-03 +4,http://lorempixel.com/300/300/people,2013-01-15,Augue morbi habitant tristique. Proin netus euismod nascetur primis turpis praesent cras sapien primis nulla morbi. Velit augue. Curae felis a platea ante ac nec facilisis pharetra magna nam. Nulla metus magnis etiam fringilla erat viverra. Nulla felis massa cras litora libero nulla non. Morbi fames auctor ut ad nibh nunc maecenas montes sodales iaculis. Purus dolor.,http://lorempixel.com/300/300/people,Fisherman's Promontory,Michal Blish,Assunta Dollard,2012-11-22 +4,http://lorempixel.com/300/300/people,2013-05-01,Morbi dolor. Etiam felis eros enim potenti a cursus orci sed at eros pulvinar porta sapien. Porta lacus scelerisque in. Fames lorem maecenas nisi in sollicitudin arcu rhoncus et in nunc urna porta egestas. Dolor purus cras curabitur sociosqu taciti. Lacus justo sem adipiscing nullam ad tempor quisque blandit montes leo mus et netus cursus. Lacus etiam eget eros cum ipsum elementum massa a tempor quam ad. Netus fames placerat convallis odio risus euismod ac velit nisi commodo.,http://lorempixel.com/300/300/people,Perigrine Haven|The Glen at Holly Junction,Leona Welter,Tyra Feola,2013-04-18 +1,http://lorempixel.com/300/300/people,2013-01-05,Velit dolor nulla erat felis. Neque fames velit torquent hac iaculis id. Porta fames hac duis pede. Felis neque diam iaculis ac quam eros dapibus phasellus mauris donec parturient. Morbi felis semper quisque dapibus aliquet. Magna velit. Curae dolor quam curae. Proin neque pretium urna ve pellentesque.,http://lorempixel.com/300/300/people,Graceful Lagoon|Admiral's Island|Madera Azul,Heide Falco,Marget Lehn,2012-12-31 +2,http://lorempixel.com/300/300/people,2013-07-17,Felis ipsum aenean ante erat interdum. Vitae netus nulla dictum ut cubilia. Purus porta. Etiam netus mattis. Justo velit a turpis. Felis purus ante bibendum aliquet phasellus libero. Justo purus litora nullam. Nulla metus facilisi ultricies ante sed nonummy id mi eget.,http://lorempixel.com/300/300/people,Vista Fresca,Gilda Puffer,Venessa Mahmood,2013-04-21 +1,http://lorempixel.com/300/300/people,2012-06-26,Proin augue quisque mattis arcu tempus ac consequat eu velit ve. Morbi porta. Netus nulla orci augue ve nam magnis ac eni et pellentesque. Velit porta. Felis vitae eros metus mi diam ultrices ullamcorper volutpat. Purus velit leo pede eleifend facilisi. Velit massa rutrum ac pulvinar vel nunc massa penatibus volutpat. Vitae lacus.,http://lorempixel.com/300/300/people,Liberty Corner|Poplar Highlands,Dione Sharma,Lillian Ristau,2012-05-15 +5,http://lorempixel.com/300/300/people,2012-11-26,Metus fusce bibendum. Netus proin odio risus sagittis elementum dolor. Magna lorem eros egestas et. Purus netus morbi mauris lectus egestas conubia. Morbi porta. Netus class. Magna massa. Lacus etiam felis integer dignissim habitant morbi posuere tempus vitae adipiscing.,http://lorempixel.com/300/300/people,Palm Bay,Sandie Misiewicz,Marcia Chabot,2012-11-15 +4,http://lorempixel.com/300/300/people,2012-01-27,Nulla justo magnis sapien molestie integer rhoncus nunc ultrices parturient laoreet quam. Augue lorem tristique et erat metus. Morbi felis montes primis dis odio etiam viverra iaculis penatibus odio. Fames felis ultricies condimentum est ut purus. Lorem morbi a vivamus et conubia eros ac nisi. Velit lacus risus dis sem leo vivamus ve magnis litora. Massa nulla accumsan at condimentum ut. Etiam lacus massa porttitor est nisl ad mus.,http://lorempixel.com/300/300/people,Paso Rojo,Leona Welter,Trina Studdard,2012-01-23 +3,http://lorempixel.com/300/300/people,2013-07-04,Class lorem commodo venenatis. Velit magna aenean enim ve nisl lobortis feugiat vitae pede tempus. Donec fusce donec montes bibendum torquent conubia. Justo lacus. Felis curae. Felis vitae torquent eni semper dignissim consequat cras. Lorem fusce montes ve nibh pulvinar inceptos. Lacus justo faucibus quam odio feugiat ac cursus enim orci metus ac.,http://lorempixel.com/300/300/people,Pueblo Nuevo,Lecia Harling,Marilynn Shier,2013-05-10 +1,http://lorempixel.com/300/300/people,2012-05-08,Porta neque pulvinar ut per auctor curabitur felis nisl aliquet. Etiam porta venenatis sodales vitae adipiscing. Donec velit dui nunc. Dolor etiam morbi diam cum. Curae purus augue lectus. Risus augue rutrum malesuada inceptos amet dis pellentesque platea id. Felis nulla a egestas et. Etiam lorem sit nisi interdum fermentum mattis fermentum in.,http://lorempixel.com/300/300/people,The Homestead at Summer Promontory|Shady Anchorage,Lonnie Rye,Herma Yocum,2012-03-27 +3,http://lorempixel.com/300/300/people,2012-04-28,Curae donec scelerisque maecenas aliquam interdum ve curae. Etiam augue semper varius ridiculus fusce primis etiam euismod lorem lacinia nisi et. Etiam dolor eros. Etiam curae. Neque nulla. Metus nulla habitant nisl aliquam. Metus class. Curae magna lorem sed ipsum lacinia.,http://lorempixel.com/300/300/people,Leeward Reef,Lecia Harling,Leslee Heard,2012-04-12 +4,http://lorempixel.com/300/300/people,2012-07-01,Dolor lacus interdum adipiscing mollis leo taciti euismod iaculis dignissim volutpat tellus. Risus vitae nullam luctus. Netus morbi. Neque felis dis amet consectetuer nascetur neque ac. Lacus ipsum mollis netus. Neque risus nulla curae augue vel. Fusce lacus hac elit ligula. Vitae nulla elit tortor cum euismod a mauris.,http://lorempixel.com/300/300/people,Autumn Timbers,Carly Toro,Eli Henricksen,2012-04-10 +1,http://lorempixel.com/300/300/people,2012-08-16,Ipsum augue. Justo risus placerat augue vivamus elementum eros sed dui cum. Fusce vitae curae montes pulvinar erat mattis sagittis fames ve orci. Risus netus odio libero eu nec ridiculus. Nulla fames nisl lectus in vitae congue egestas nisl leo pellentesque magnis et. Fusce lorem sit aenean aptent metus. Netus massa praesent per euismod. Fames dolor libero natoque tempus duis erat sodales eget enim.,http://lorempixel.com/300/300/people,Axbridge Homestead,Janean Nordby,Kia Vandam,2012-06-10 +5,http://lorempixel.com/300/300/people,2012-06-15,Lacus felis. Justo lacus felis nascetur hendrerit accumsan et magna nulla. Velit porta. Justo ipsum egestas hendrerit dis pellentesque ve metus ornare auctor egestas primis. Curae ipsum pharetra ultricies platea urna sollicitudin vestibulum. Netus proin orci blandit libero massa molestie etiam ultrices nam ut sapien pharetra lacus netus. Class justo elit sit. Purus nulla pulvinar curae elit ad metus.,http://lorempixel.com/300/300/people,Magnolia Mount|Shady Pasture,Luanna Duggan,Beatrice Kinne,2012-04-16 +5,http://lorempixel.com/300/300/people,2012-06-13,Proin augue vivamus praesent primis. Ipsum magna est mattis sit arcu in enim mattis leo quisque. Morbi proin amet porta inceptos. Fusce curae neque eleifend ut scelerisque ve semper consectetuer. Lorem velit sem class lorem magnis in nisl quam gravida mi montes. Porta etiam facilisis vulputate justo elementum. Lacus neque. Donec magna sodales habitasse orci rhoncus vivamus.,http://lorempixel.com/300/300/people,Palm Suburb|Fox Anchorage|Mermaid Firth,Shauna Merkel,Myrtice Hajduk,2012-05-17 +4,http://lorempixel.com/300/300/people,2013-03-13,Neque nulla semper congue dictumst pulvinar massa imperdiet mollis nascetur. Lacus massa. Purus donec lorem amet leo ut auctor. Lorem felis. Morbi curae pulvinar. Proin dolor. Vitae lacus. Nulla risus eget auctor vestibulum pellentesque lacinia faucibus class ad.,http://lorempixel.com/300/300/people,Chelsea Boulder,Zoila Meadow,Racheal Szabo,2012-12-29 +4,http://lorempixel.com/300/300/people,2012-08-06,Dolor lacus integer mattis. Magna morbi. Lorem augue nisl vel duis nunc non est gravida at dis condimentum. Fusce donec. Augue ipsum. Dolor massa tellus sem tempor a rhoncus ut sit diam aptent tempus pede. Proin dolor cum quis sodales mi turpis curae. Velit class pretium tellus in turpis vehicula scelerisque ultrices.,http://lorempixel.com/300/300/people,The Heath at Old Valley|Ash Dale,Christel Henrickson,Kristeen Kindel,2012-06-28 +5,http://lorempixel.com/300/300/people,2012-12-12,Augue class molestie fusce in tempus. Fames fusce a orci vitae sapien nunc in nam penatibus sapien orci duis. Purus felis. Nulla morbi cum nibh enim parturient. Justo porta scelerisque inceptos euismod pellentesque luctus mi. Morbi lorem massa dictum ac. Dolor justo vitae eleifend ve magna rutrum lectus hymenaeos in nostra et platea. Lacus vitae massa porta elit quam primis vestibulum sagittis.,http://lorempixel.com/300/300/people,Axbridge Homestead,Randal Needleman,Kia Vandam,2012-12-03 +3,http://lorempixel.com/300/300/people,2012-02-22,Velit curae sem arcu. Nulla class velit vel dictum. Morbi fames potenti ad rutrum mi sed et etiam tincidunt. Netus magna a commodo at interdum suscipit velit platea dictumst adipiscing viverra non adipiscing. Lacus justo ultrices et suspendisse urna orci. Donec purus class molestie phasellus ad. Neque curae hendrerit in habitasse orci vel a dictum pede. Fusce netus magnis.,http://lorempixel.com/300/300/people,Paso Rojo|The Abbey of Hunter Lakes,Fred Victory,Dwight Oxford,2012-02-13 +2,http://lorempixel.com/300/300/people,2012-04-11,Velit lacus morbi ornare ac eu rutrum ultricies turpis litora. Proin ipsum scelerisque amet quam mattis. Morbi fusce accumsan vestibulum libero vel nisi. Felis augue commodo. Risus fames. Massa class eleifend netus lacinia vel inceptos sodales. Velit nulla lorem sagittis felis iaculis ve tincidunt elit. Dolor morbi sociosqu enim semper nisi condimentum sed ad a quam.,http://lorempixel.com/300/300/people,Wandering Vineyard,Jade Clutts,Tonette Moos,2012-03-02 +1,http://lorempixel.com/300/300/people,2012-04-16,Purus vitae. Lacus metus a tortor orci commodo velit. Massa class egestas libero urna erat dolor id dictum mi eu in amet. Augue velit turpis at. Proin curae sem blandit metus nec cras tincidunt ante. Velit class vel venenatis porta ad diam fusce quam odio curabitur pharetra. Morbi fames aptent ligula torquent felis eni per sem eu sagittis diam rhoncus libero netus parturient. Ipsum metus.,http://lorempixel.com/300/300/people,Whaler's Timbers|Azalea Overlook|Muskrat Prospect,Aura Gershman,Melanie Bricker,2012-01-31 +3,http://lorempixel.com/300/300/people,2012-10-21,Velit magna nisi laoreet. Morbi fames porta vitae semper. Lorem lacus quis metus donec nulla hac blandit a. Risus fames morbi convallis inceptos duis mollis tempus nec. Ipsum risus nascetur netus ac lorem ligula sociis. Lacus fames sapien ut vel dolor hendrerit donec at vitae vehicula amet curabitur habitant metus. Fames vitae nulla. Justo lorem eni class gravida elit vehicula donec ridiculus.,http://lorempixel.com/300/300/people,Dove Vale|Placid Junction,Adriene Rizo,Terresa Cabe,2012-09-25 +1,http://lorempixel.com/300/300/people,2012-12-07,Proin lacus etiam senectus. Justo neque. Ipsum neque aenean lorem sem hendrerit. Risus purus. Magna etiam per est non consectetuer mi laoreet id tortor convallis. Netus donec tellus ve maecenas elit cubilia pretium elementum. Vitae fusce purus nulla mollis. Neque justo maecenas nisi turpis semper purus curabitur fermentum urna.,http://lorempixel.com/300/300/people,Lazy Bay,Era Mustafa,Bethel Rispoli,2012-10-15 +4,http://lorempixel.com/300/300/people,2013-05-28,Etiam donec enim a. Massa velit vitae dictum pellentesque viverra pulvinar id velit elementum. Proin lorem facilisi id ullamcorper arcu quis. Felis purus a integer mollis donec parturient. Massa netus. Netus lacus cubilia vel ad morbi. Dolor risus euismod hac orci curae at. Dolor fames.,http://lorempixel.com/300/300/people,Sunset Bay|Puerto Conejo,Rodrick Turberville,Kimberli Minelli,2013-03-30 +3,http://lorempixel.com/300/300/people,2012-05-22,Fames velit porttitor taciti aptent iaculis urna ac curae nec felis tincidunt dolor ad ac. Fusce velit a arcu magna vivamus torquent congue nibh. Nulla donec elit eros litora ut. Morbi augue amet dis aliquam class ut et. Nulla velit semper ut curae ve ornare nunc purus rhoncus. Donec risus sem cubilia in risus sem diam facilisi. Curae justo lobortis ve elit magna condimentum. Lorem vitae inceptos leo ipsum sem.,http://lorempixel.com/300/300/people,The View at Cherokee Orchards|The Bluff at Bear Meadows|The Point at Queensborough Crag,Everett Stever,Taisha Glandon,2012-03-01 +5,http://lorempixel.com/300/300/people,2013-01-12,Augue proin dictum risus quisque commodo duis. Curae nulla iaculis leo primis. Lorem ipsum. Ipsum magna rhoncus porta. Donec curae dolor. Fusce fames cursus sagittis porta a nibh vestibulum arcu. Metus proin. Fames morbi taciti inceptos hac lacinia et id dictum sit nisi.,http://lorempixel.com/300/300/people,Sandpiper Strand|Tern Inlet|Mariner Firth,Arianne Ebarb,Florene Sakai,2012-12-03 +5,http://lorempixel.com/300/300/people,2012-08-07,Velit fames felis neque feugiat. Proin curae cursus posuere fermentum amet rhoncus malesuada. Porta fames morbi volutpat magna urna condimentum blandit hac nonummy molestie. Donec purus amet id pellentesque blandit lorem. Augue class. Class purus. Curae augue libero ut eget primis torquent fringilla magnis mauris morbi etiam quisque ut habitant tortor. Lorem lacus.,http://lorempixel.com/300/300/people,Weaver's Butte|Kelp Gulf|American Inlet,Marnie Kemble,Shara Lamonica,2012-05-20 +2,http://lorempixel.com/300/300/people,2013-01-18,Neque fames mattis aliquet gravida hendrerit sagittis netus in convallis lacinia. Netus massa tristique curabitur netus massa condimentum eget nisl. Risus metus curabitur tellus ve pharetra. Etiam justo luctus. Felis class senectus mi condimentum mi. Felis magna varius rutrum aliquam nibh ac lobortis. Porta class non litora a conubia ut nostra vel gravida eleifend. Risus lorem iaculis est.,http://lorempixel.com/300/300/people,The Village at Queensborough Gardens|Songbird Parish|The Valley at Navajo Chapel,Rene Friedrichs,Angelic Koonce,2013-01-07 +3,http://lorempixel.com/300/300/people,2012-08-30,Ipsum velit sagittis fames non vivamus in porttitor a phasellus ipsum aliquam torquent sapien lectus in cum fringilla aliquam pellentesque ornare congue. Risus lorem fusce blandit libero. Porta felis. Class etiam mattis et est odio. Dolor lacus orci sem porta facilisis diam blandit. Porta justo nam amet lorem purus. Magna risus nostra augue sagittis purus ve felis ve. Dolor felis elit.,http://lorempixel.com/300/300/people,Sandpiper Strand|Tern Inlet|Mariner Firth,Fred Victory,Florene Sakai,2012-06-01 +2,http://lorempixel.com/300/300/people,2012-08-04,Lacus proin habitasse litora tortor curae dignissim condimentum. Felis justo nunc dignissim elit hac quis mus. Velit etiam molestie diam lacinia in arcu fusce cursus duis condimentum in. Lacus proin commodo lacinia luctus mi. Dolor massa purus ullamcorper sed aptent a natoque platea sit volutpat massa lacus. Netus risus sed odio pellentesque. Neque fusce. Class curae turpis id erat ut nascetur eros varius eu.,http://lorempixel.com/300/300/people,Fireside Anchorage|The Woods of Crystal Cove|Puerto Bajo,Adriene Rizo,Iesha Bosque,2012-06-19 +1,http://lorempixel.com/300/300/people,2012-05-04,Risus proin fames a tempor erat. Netus proin nostra tempus mus. Lacus nulla augue dolor litora congue velit posuere torquent libero lacinia ultricies pede eros parturient eni. Netus vitae justo. Class netus. Nulla augue a. Neque justo auctor elit ac quam. Etiam ipsum dis enim.,http://lorempixel.com/300/300/people,Seagull Firth|Madera Roja,Cythia Doten,Contessa Venable,2012-05-03 +3,http://lorempixel.com/300/300/people,2012-11-06,Porta vitae commodo in nec. Fusce fames nibh eleifend. Velit proin mollis tempus eni nisl et magna sollicitudin interdum justo libero eu justo. Porta neque eni quis in. Felis morbi. Nulla morbi enim massa elit a augue commodo quam. Class fusce amet in nisl fames nisi senectus erat. Velit magna nam proin sem pede.,http://lorempixel.com/300/300/people,Whaler's Cove,Randal Needleman,Silvia Miranda,2012-08-27 +1,http://lorempixel.com/300/300/people,2013-02-07,Metus morbi quam dictumst suspendisse. Proin fames mollis at suscipit lacinia blandit quam nec. Vitae lorem. Vitae netus ipsum. Lorem ipsum platea at id felis ac habitasse a. Proin curae cum arcu porttitor amet nisl ipsum integer ad leo enim amet rhoncus dictum. Metus curae ullamcorper ultrices ultricies et class ligula auctor mus parturient. Felis fames tempor ante penatibus sollicitudin adipiscing duis fusce.,http://lorempixel.com/300/300/people,Shady Pasture|Cougar Woods|Banyan Inlet,Ling Mcmaster,Augustine Failla,2012-12-11 +1,http://lorempixel.com/300/300/people,2012-11-13,Lacus massa amet per dis porttitor vel. Velit metus. Class metus. Metus neque ligula penatibus praesent tortor fames. Felis porta a mauris enim pede ve consectetuer vivamus. Risus donec. Fusce justo a viverra rutrum mus ornare id amet ad torquent nisi id. Lorem augue molestie eget vehicula dui diam parturient mi tincidunt curae.,http://lorempixel.com/300/300/people,The Homestead at Summer Promontory|Shady Anchorage,Teresita Remy,Herma Yocum,2012-09-11 +1,http://lorempixel.com/300/300/people,2012-07-24,Netus ipsum quisque libero dis litora. Curae justo magnis imperdiet curae nisl auctor phasellus placerat luctus molestie eros. Massa fusce lorem a erat id mus condimentum viverra condimentum cras nunc conubia donec amet maecenas. Proin lacus ligula eu eros accumsan vitae. Magna fames class urna magnis tincidunt. Netus purus. Magna augue litora interdum penatibus sociosqu augue dui per sem eni. Class velit neque aenean etiam pharetra sit amet adipiscing elit aptent libero.,http://lorempixel.com/300/300/people,Grizzly Harbor|The Streams at Moose View,Leena Newbury,Sharri Dietrich,2012-07-18 +5,http://lorempixel.com/300/300/people,2013-05-08,Proin magna litora. Lacus metus neque condimentum habitant curabitur erat. Ipsum curae fusce vel orci duis. Metus vitae. Donec felis morbi convallis senectus et leo elementum. Dolor class. Neque nulla etiam lacinia. Donec fames platea.,http://lorempixel.com/300/300/people,The Village at Queensborough Gardens|Songbird Parish|The Valley at Navajo Chapel,Maryann Brunk,Angelic Koonce,2013-02-07 +4,http://lorempixel.com/300/300/people,2012-10-25,Magna massa lectus orci. Neque class luctus ipsum auctor ac. Velit morbi a ornare diam est pellentesque luctus mi volutpat. Metus velit hac ante tellus donec sit nunc phasellus auctor ante sollicitudin parturient ante. Velit risus amet ultrices fusce ve consequat arcu gravida augue. Neque vitae cursus habitant fusce ac. Lorem curae fringilla natoque tortor curae adipiscing conubia nam. Velit netus dapibus mi donec fusce suspendisse.,http://lorempixel.com/300/300/people,Sailor's Firth,Luanna Duggan,Bennett Rieder,2012-10-11 +3,http://lorempixel.com/300/300/people,2012-08-02,Lacus morbi conubia egestas nostra. Purus morbi turpis libero porta dis. Class netus dis aenean a ultrices quis litora fermentum fames et. Ipsum vitae quisque penatibus ultrices eu proin. Morbi purus massa a quisque ve. Curae neque. Purus justo faucibus dolor magna sem diam urna integer ve ad ac neque et duis sit. Fames netus maecenas risus ve risus tristique.,http://lorempixel.com/300/300/people,Pueblo Redondo,Hana Turnipseed,Leslee Gustavson,2012-06-16 +1,http://lorempixel.com/300/300/people,2012-09-10,Lacus fames nascetur. Velit metus sapien ut dui augue. Neque risus augue vulputate. Felis neque diam. Metus fames augue litora risus pretium nisi mus. Risus class condimentum est eros mus cras odio. Proin purus sociosqu duis lacinia arcu. Velit nulla.,http://lorempixel.com/300/300/people,Grizzly Harbor|The Streams at Moose View,Marleen Venters,Sharri Dietrich,2012-07-20 +4,http://lorempixel.com/300/300/people,2012-03-31,Nulla ipsum auctor sociis neque elit sodales magna. Donec netus. Ipsum metus luctus tristique ultrices eros. Vitae nulla. Nulla etiam. Fames ipsum. Class netus odio non nunc. Purus augue sodales morbi nisi elit pulvinar velit cursus class porta.,http://lorempixel.com/300/300/people,Beverley View,Jonah Newsom,Agripina Hoskin,2012-01-08 +4,http://lorempixel.com/300/300/people,2013-04-21,Metus fusce. Magna massa potenti eget mi mauris dictumst. Justo neque primis risus duis nibh. Netus nulla platea pede varius sodales. Purus ipsum scelerisque lobortis lacus tempor ac. Lacus risus a eros eu felis ut habitasse curabitur quam. Augue fusce amet molestie vitae hendrerit potenti. Nulla ipsum aliquam pede.,http://lorempixel.com/300/300/people,Starfish Shore,Jacque Behm,Paulita Tagle,2013-02-07 +3,http://lorempixel.com/300/300/people,2013-04-25,Velit massa posuere eu cursus leo quisque aenean dolor aliquet. Risus magna posuere et enim neque in morbi. Donec ipsum sociosqu phasellus pellentesque vestibulum quam magnis vestibulum consectetuer conubia est et. Nulla neque vivamus taciti at volutpat dui nisl rhoncus eu arcu id. Velit fames tempus. Class nulla netus suscipit porta sociis nisi. Neque netus egestas. Neque porta hac hendrerit inceptos magnis montes.,http://lorempixel.com/300/300/people,Puente Rojo|Moose Hearth|Seagull Landing,Arianne Ebarb,Andree Kingman,2013-03-19 +4,http://lorempixel.com/300/300/people,2013-02-12,Proin lorem neque amet. Magna massa condimentum. Metus proin nostra per egestas. Vitae purus est magnis est dapibus eu dis. Augue fames. Lacus dolor congue porttitor praesent vehicula mauris fames. Lorem felis dis amet id ultricies porta duis aliquet duis. Fusce risus magnis dolor parturient.,http://lorempixel.com/300/300/people,Autumn Timbers,Maryann Brunk,Eli Henricksen,2013-01-19 +1,http://lorempixel.com/300/300/people,2013-06-06,Lacus vitae maecenas pede elementum curae cum integer interdum velit. Etiam class conubia potenti hendrerit torquent duis aliquam. Massa porta tellus phasellus aliquet eni eleifend. Dolor class felis iaculis eget. Ipsum dolor a blandit. Metus donec cras posuere id ve sapien. Netus neque eleifend hac lacinia vitae. Proin netus leo nibh sociosqu faucibus eu lectus sit gravida ultrices.,http://lorempixel.com/300/300/people,Puente Rojo|Moose Hearth|Seagull Landing,Tasha Dennard,Andree Kingman,2013-04-23 +4,http://lorempixel.com/300/300/people,2013-02-09,Augue neque a turpis lacus cubilia nam. Vitae justo. Netus magna. Dolor magna. Curae velit. Purus ipsum eget pede curae vulputate lectus magna accumsan. Morbi nulla aptent pellentesque vulputate. Morbi justo dui nisi quis senectus dignissim neque.,http://lorempixel.com/300/300/people,The Point at Hunter Pasture|Ciudad Verde|Admiral's Island,Carolann Stimage,Chase Adler,2012-11-29 +5,http://lorempixel.com/300/300/people,2013-05-05,Magna curae. Lorem etiam accumsan et nulla at ipsum platea vehicula condimentum est quis. Porta curae per venenatis. Magna felis. Etiam fames iaculis sit mi. Justo curae. Lorem lacus congue sollicitudin lacinia donec at fringilla. Augue donec.,http://lorempixel.com/300/300/people,Partridge Estates|Otter Rise|Playa Blanca,Marnie Kemble,Janet Stfleur,2013-02-08 +3,http://lorempixel.com/300/300/people,2012-09-02,Porta lorem turpis facilisi pede torquent vestibulum tortor quam justo ut. Fames nulla tortor sit potenti eget eu elementum eget nibh semper orci. Dolor neque vel vivamus inceptos ligula libero penatibus ipsum suscipit. Fames lorem magna ante gravida porta nulla. Morbi risus. Risus netus est nisi leo lacinia nascetur mi suspendisse diam quam risus id. Netus massa urna ante ad litora et eros fusce rutrum. Magna vitae scelerisque facilisi iaculis eget amet non.,http://lorempixel.com/300/300/people,Sea Lion Shore|Hunter Creek,Sharlene Chappell,Kristine Calvo,2012-08-07 +5,http://lorempixel.com/300/300/people,2012-03-31,Augue magna. Curae velit ornare nostra arcu etiam netus platea enim tempus. Fames curae urna ad consectetuer. Fusce felis neque turpis morbi. Netus proin. Magna porta lectus augue vestibulum blandit sit pede a diam. Curae etiam sociosqu parturient elementum scelerisque tristique arcu nec nisi volutpat. Nulla fusce.,http://lorempixel.com/300/300/people,Seagull Firth|Madera Roja,Elicia Geist,Contessa Venable,2012-02-01 +3,http://lorempixel.com/300/300/people,2012-11-07,Risus proin risus commodo blandit luctus vel potenti neque est. Proin lorem mollis lorem laoreet auctor quis massa nostra ve. Curae class. Massa donec laoreet et at orci diam. Neque nulla. Metus augue primis ipsum sociosqu duis. Felis curae taciti morbi in. Morbi neque nibh.,http://lorempixel.com/300/300/people,Oak Rise|Mild Meadows|Palm Parish,Carly Toro,Larry Wold,2012-09-19 +4,http://lorempixel.com/300/300/people,2012-07-21,Metus augue volutpat at aptent. Purus netus cum nisl ad quis in dictum. Donec etiam nisi euismod porta sed. Etiam fusce. Donec augue commodo leo ve consectetuer varius et. Curae morbi pulvinar eni aliquam lacus non orci nibh parturient. Dolor velit feugiat duis vestibulum penatibus netus ut. Porta velit nec massa porttitor vehicula quam auctor penatibus nec porta nostra erat.,http://lorempixel.com/300/300/people,Plymouth Cave|Myna Haven|The Cove at Whaler's Prospect,Zoila Meadow,Gwyneth Laidlaw,2012-05-27 +3,http://lorempixel.com/300/300/people,2012-03-26,Morbi purus nascetur risus ultricies. Proin velit. Felis morbi est netus. Donec class quam dolor malesuada luctus. Curae proin inceptos imperdiet nibh purus aliquet id. Purus lacus lobortis vitae a laoreet et ante habitasse. Morbi netus auctor arcu class viverra dui aptent nostra inceptos sociis interdum scelerisque faucibus. Neque fames suscipit at felis at vitae aenean magna.,http://lorempixel.com/300/300/people,Lazy Bay|The Fields at Freedom Bluff,Cassaundra Ribera,Maire Spilman,2012-02-25 +3,http://lorempixel.com/300/300/people,2012-03-27,Lacus neque dictum nostra. Curae fames aliquet interdum in ante nisl duis venenatis dictumst. Risus class habitasse sem ante pede auctor ve mollis tristique vestibulum quisque nunc sociosqu senectus etiam arcu a. Neque nulla sit quis pharetra mattis montes per. Fusce netus. Morbi metus. Metus morbi justo cras leo etiam nec quis. Curae metus a integer litora congue erat condimentum.,http://lorempixel.com/300/300/people,Partridge Estates|Otter Rise|Playa Blanca,Isidro Hanlin,Janet Stfleur,2012-01-15 +2,http://lorempixel.com/300/300/people,2012-03-30,Justo augue. Metus proin. Class donec. Lacus lorem turpis nullam gravida ridiculus primis pharetra nibh primis sapien lacinia nisl. Fames curae odio. Velit morbi netus cras dapibus eu. Lorem metus nostra mollis metus per dolor purus torquent augue. Nulla fusce blandit justo pede duis aliquam in commodo eu nisi nibh fermentum hendrerit quam.,http://lorempixel.com/300/300/people,Seaford Inlet|The Forest at Essex Knoll|Kissing Cave,Teresita Remy,Meta Thomure,2012-02-13 +1,http://lorempixel.com/300/300/people,2012-09-05,Velit class dis. Curae nulla nostra ac volutpat lectus. Metus augue urna vulputate mauris proin dictum id volutpat odio. Metus etiam vivamus. Purus justo potenti sagittis. Netus dolor odio accumsan dui laoreet molestie metus. Curae nulla mattis auctor posuere viverra sociosqu ve netus. Felis porta.,http://lorempixel.com/300/300/people,The Homestead at Summer Promontory|Shady Anchorage,Elicia Melecio,Herma Yocum,2012-07-01 +3,http://lorempixel.com/300/300/people,2013-04-10,Purus velit eget odio class quisque pharetra mattis lectus fusce neque a diam risus natoque feugiat platea. Netus augue auctor convallis in consequat integer tempus erat. Lorem justo augue ipsum. Nulla ipsum mus. Neque justo risus vivamus sociosqu neque est. Porta metus lacus. Augue netus class ullamcorper. Curae netus fames class metus massa eget a.,http://lorempixel.com/300/300/people,Liberation Outlook|South Hills,Sandie Misiewicz,Armida Oddo,2013-03-09 +1,http://lorempixel.com/300/300/people,2013-06-16,Netus etiam vel quis a erat. Magna etiam non. Vitae dolor nam enim platea leo amet sem nullam torquent elit. Class morbi cubilia in erat diam. Dolor fames. Fames vitae. Morbi magna massa auctor cum dictum a accumsan leo felis litora id. Class donec vel nulla diam.,http://lorempixel.com/300/300/people,Sierra Baja|Guava Reef|Fisherman's Promontory,Sharan Fucci,Marylee Ziebarth,2013-05-02 +2,http://lorempixel.com/300/300/people,2012-11-11,Massa vitae bibendum parturient hymenaeos lorem cras ullamcorper mi. Fames felis. Massa justo arcu ac erat sociis felis sed. Vitae risus malesuada nec duis ad enim sociis nostra. Velit morbi maecenas in leo. Dolor velit. Velit risus fames scelerisque ultrices phasellus ipsum. Ipsum fusce amet at.,http://lorempixel.com/300/300/people,Lazy Bay|Goose Vineyard|Regal Park,Heide Falco,Kirsten Buchholtz,2012-08-13 +4,http://lorempixel.com/300/300/people,2013-03-07,Augue proin ante at facilisis felis convallis platea dolor aliquam sociosqu gravida ligula urna at cum. Lacus lorem augue nibh dapibus sociis non eget rutrum sed in. Neque massa primis eu montes senectus volutpat congue aenean hymenaeos facilisi. Curae lacus tristique. Massa morbi placerat enim tellus dolor proin. Etiam donec dui curae phasellus nam. Nulla class est felis ipsum. Lacus metus.,http://lorempixel.com/300/300/people,Mesa Gorda|Fireside Valley,Cassaundra Ribera,Luetta Baumbach,2013-01-28 +2,http://lorempixel.com/300/300/people,2013-01-17,Proin augue. Proin justo auctor per. Dolor velit. Nulla velit urna commodo a tellus. Lacus metus turpis lacus scelerisque et ornare risus vitae lacinia conubia. Morbi porta. Lacus augue semper at magna suspendisse cras dignissim habitasse adipiscing. Magna netus.,http://lorempixel.com/300/300/people,The Dale at Antelope Quarter|Avocado Delta|Tern Coast,Sandie Misiewicz,Mavis Schramm,2012-10-27 +3,http://lorempixel.com/300/300/people,2012-11-21,Metus curae senectus dis mi felis venenatis. Vitae metus aenean metus lectus aliquam. Massa fusce odio neque posuere lacinia fringilla eros nam. Neque donec magnis suspendisse porta elementum aliquam per. Lacus velit suspendisse faucibus tincidunt. Velit risus tempor aptent. Curae dolor massa lorem fames cursus senectus ridiculus ve imperdiet donec malesuada. Fames proin vitae cum cubilia interdum ipsum hymenaeos blandit dolor quisque.,http://lorempixel.com/300/300/people,Oyster Bay|Shady Pasture,Randal Needleman,Delilah Wagar,2012-09-18 +2,http://lorempixel.com/300/300/people,2013-04-16,Massa dolor nec turpis morbi conubia vel dapibus metus eros. Curae dolor molestie non elit at pellentesque egestas proin leo. Fames augue tempus aptent hac cras eget curabitur consectetuer parturient nisi turpis. Neque metus dolor. Curae lacus faucibus erat nam felis nec. Netus justo erat. Class etiam ante. Augue dolor.,http://lorempixel.com/300/300/people,Kelp Landing|Spring Boulder|The Vista of Private Dunes,Elicia Melecio,Maritza Fenster,2013-02-24 +3,http://lorempixel.com/300/300/people,2012-03-25,Massa curae erat condimentum. Class justo est urna velit. Augue porta mattis neque laoreet bibendum. Porta dolor purus curae aliquam. Neque dolor diam enim diam ac donec aptent odio nisi dolor nonummy ornare. Velit class lorem a. Purus neque elit sociis potenti ante eu ante. Vitae proin suspendisse suscipit nonummy consectetuer porttitor.,http://lorempixel.com/300/300/people,Mango Haven|Rambling Timbers,Laurinda Franson,Katrina Castorena,2012-03-15 +5,http://lorempixel.com/300/300/people,2012-05-28,Magna vitae. Justo massa integer et id hac. Neque magna a integer turpis ad pede nascetur. Vitae velit hac fusce dolor aptent lobortis morbi ad nulla taciti. Fusce neque leo fames congue luctus nam. Dolor porta. Dolor justo. Velit augue porta lorem.,http://lorempixel.com/300/300/people,Paso Rojo,Jacque Behm,Trina Studdard,2012-03-28 +4,http://lorempixel.com/300/300/people,2012-11-08,Ipsum fusce aptent ipsum. Lacus proin ante enim. Morbi nulla. Velit dolor posuere ornare in nisl diam. Morbi lacus facilisis et platea lobortis felis. Ipsum magna sit elit sit purus est imperdiet dictumst et. Risus nulla semper purus tincidunt imperdiet class eros commodo mi tristique. Lorem metus neque class aptent orci urna sit class vel quis.,http://lorempixel.com/300/300/people,Partridge Estates|Otter Rise|Playa Blanca,Ellsworth Rehman,Janet Stfleur,2012-08-11 +5,http://lorempixel.com/300/300/people,2012-09-11,Lorem purus proin quam hac placerat malesuada eros blandit. Justo morbi vel amet duis vel vitae sed vulputate pulvinar. Risus morbi tellus nullam nulla eleifend curae eleifend hac aliquam aenean nisl ac nibh. Ipsum fusce ridiculus parturient sed vestibulum fermentum duis nisi elit. Dolor velit platea cras pretium varius. Netus augue a natoque ad donec elit ve. Morbi lorem magna condimentum. Risus fames proin felis.,http://lorempixel.com/300/300/people,Vista Fresca,Charlott Rondeau,Venessa Mahmood,2012-07-23 +2,http://lorempixel.com/300/300/people,2013-01-21,Donec curae. Neque etiam. Lacus lorem cum nibh hendrerit cursus. Class felis. Class metus condimentum orci nunc aliquet at ve diam sociosqu. Donec proin inceptos class eu metus. Neque donec. Metus proin eget mollis natoque viverra quis risus id habitasse a consequat.,http://lorempixel.com/300/300/people,Liberty Glade|The Vale at Evergreen Junction|The Villas at Sheffield City,Catherina Entrekin,Jerilyn Crowder,2013-01-17 +3,http://lorempixel.com/300/300/people,2012-11-03,Ipsum fames. Dolor porta. Morbi purus. Magna netus. Velit netus. Felis netus magna. Lacus dolor a luctus nisi pellentesque vestibulum enim fames hymenaeos est odio. Vitae lacus metus neque hac nibh.,http://lorempixel.com/300/300/people,Charming Acres|Leeward Cove|The Lakes at Royal Dunes,Randal Needleman,Alex Groom,2012-08-26 +5,http://lorempixel.com/300/300/people,2012-05-23,Etiam magna nisl leo malesuada donec ante natoque eget placerat. Netus neque vivamus vulputate sapien sagittis. Magna metus magnis proin maecenas vitae semper ut duis quis pulvinar. Massa justo. Morbi metus. Felis ipsum justo integer nibh orci. Neque ipsum dictum. Lorem curae sapien fusce ullamcorper facilisi pede.,http://lorempixel.com/300/300/people,Hunter Downs|Lonely Homestead|Passion Fruit Quay,Larue Gay,Yang Brosnan,2012-03-01 +4,http://lorempixel.com/300/300/people,2012-05-07,Augue donec velit dictum urna habitasse semper. Porta vitae cum odio laoreet massa nisi eleifend faucibus risus nostra eros ullamcorper. Risus ipsum a cursus. Lorem curae leo imperdiet rutrum eni. Justo purus porta mollis nullam felis erat tellus facilisi nisl aliquam ipsum urna quam etiam mi massa. Lorem class quisque penatibus eget cras. Ipsum lacus suspendisse ve ornare. Lacus felis sem rutrum.,http://lorempixel.com/300/300/people,Wooded Pasture,Ling Mcmaster,Coral Crossett,2012-04-13 +5,http://lorempixel.com/300/300/people,2012-06-03,Massa justo nulla diam eu ante cras iaculis et at mi nunc orci quam proin diam. Massa purus integer duis habitant dis nullam montes. Nulla neque ornare vehicula etiam gravida id fringilla felis elit lacus. Nulla curae felis semper ultricies phasellus risus conubia. Curae felis auctor est gravida mi sed vulputate auctor. Donec curae tellus in interdum sodales egestas. Donec etiam sit vestibulum magnis molestie. Netus morbi eget a orci felis sodales erat ac sollicitudin laoreet nulla.,http://lorempixel.com/300/300/people,Whaler's Timbers|Azalea Overlook|Muskrat Prospect,Elicia Geist,Melanie Bricker,2012-04-22 +4,http://lorempixel.com/300/300/people,2013-06-16,Purus lacus nonummy arcu vel est consectetuer etiam nibh dolor mi platea at. Porta vitae condimentum id platea ac. Justo massa dictum sem posuere a condimentum non amet. Massa velit. Vitae velit lacus fusce senectus et augue massa sem adipiscing taciti nibh ante laoreet. Fusce netus interdum. Ipsum massa risus senectus porttitor. Augue neque tellus.,http://lorempixel.com/300/300/people,Porpoise Breakwater,Jonah Newsom,Bea Midgley,2013-04-19 +3,http://lorempixel.com/300/300/people,2013-05-19,Massa risus hac magna vitae velit litora vehicula adipiscing vivamus per iaculis ve. Purus curae. Purus felis nec magna per parturient. Massa class. Porta donec suscipit eros faucibus. Dolor morbi eni cras aliquam ve pede quis orci vestibulum eget aenean gravida cubilia imperdiet nisl enim vestibulum. Neque massa pulvinar. Purus lorem eni.,http://lorempixel.com/300/300/people,Banyan Lagoon,Lecia Harling,Alysha Lococo,2013-02-20 +5,http://lorempixel.com/300/300/people,2013-04-11,Porta purus. Neque purus. Neque curae. Justo donec fusce morbi varius urna. Nulla proin felis hac metus dignissim felis amet a cras ve. Fusce massa. Fames morbi conubia nibh class tristique proin id tristique natoque urna. Vitae porta nam aliquam suscipit lorem.,http://lorempixel.com/300/300/people,Cypress Highlands,Luise Klippel,Parker Foltz,2013-03-19 +2,http://lorempixel.com/300/300/people,2012-10-18,Donec felis. Donec dolor accumsan est netus euismod nibh. Massa metus a elit parturient dis massa habitasse integer. Etiam risus libero turpis. Etiam ipsum urna ac eros venenatis varius turpis est. Felis lacus massa fames turpis eget viverra a mollis metus sed mus hymenaeos. Porta fusce. Massa augue erat facilisis mattis amet vel fusce porttitor.,http://lorempixel.com/300/300/people,Vista Fresca,Cythia Doten,Venessa Mahmood,2012-10-10 +4,http://lorempixel.com/300/300/people,2012-10-09,Donec risus elit egestas eni penatibus. Nulla velit erat nec fusce porta ipsum tempus consectetuer hymenaeos lorem. Felis class. Porta justo vitae purus tellus accumsan parturient penatibus velit. Curae dolor. Fames porta lorem velit nam urna per vitae vel quis neque porttitor dui. Purus fusce. Fames nulla suspendisse nisi ultricies suscipit nostra.,http://lorempixel.com/300/300/people,Salisbury Mesa|Owl Brook|Macaw Shore,Isidro Hanlin,Henriette Diedrich,2012-09-27 +3,http://lorempixel.com/300/300/people,2012-05-27,Curae netus curabitur duis eros ultricies nullam velit. Vitae metus non eros conubia ad erat dolor nullam montes porttitor morbi in curabitur. Netus dolor. Magna augue. Purus justo. Dolor lorem. Velit fames taciti pulvinar venenatis ac ad. Purus lorem dolor rutrum dolor at risus mollis nascetur.,http://lorempixel.com/300/300/people,The Inlet at Oak Vale|Sioux Promontory,Jade Clutts,Jackqueline Malagon,2012-03-21 +3,http://lorempixel.com/300/300/people,2012-09-04,Massa fames nisi non posuere ad id. Justo lorem. Massa lacus. Neque etiam libero. Massa morbi a dictum eget enim augue rutrum. Augue porta. Dolor curae dictumst nisi aliquam egestas. Proin fusce sociis ve ipsum mus metus libero vivamus.,http://lorempixel.com/300/300/people,Sea Spray Breakers|Macaw Waves,Leena Newbury,Raquel Yoshioka,2012-07-02 +2,http://lorempixel.com/300/300/people,2013-07-10,Nulla fames aenean dolor. Porta massa nullam duis at eros urna suscipit ve est. Netus lorem arcu sit curae luctus. Magna neque dis vitae risus integer. Augue proin. Metus purus congue dictum donec sit magna proin ante leo. Justo lacus arcu condimentum integer ullamcorper elit tortor dictumst inceptos conubia amet leo. Proin risus elit a orci proin posuere dapibus mattis hac eget dis a.,http://lorempixel.com/300/300/people,Blue Spruce Crossing|The Crag at Weaver's Abbey|Avon Creek,Tomika Shimer,Irvin Hacker,2013-05-10 +4,http://lorempixel.com/300/300/people,2012-06-29,Proin massa magna sit fusce nonummy tellus cum amet ultrices. Vitae morbi. Metus nulla cum nunc ac sociosqu commodo pulvinar fames blandit. Donec curae porta inceptos non vitae eros tempus habitasse adipiscing. Purus augue praesent etiam habitasse at primis maecenas. Justo fusce quam donec platea ut orci curae eu vulputate risus. Class netus. Fames metus purus vitae dictumst hendrerit vehicula platea nisi.,http://lorempixel.com/300/300/people,Graceful Lagoon|Admiral's Island|Madera Azul,Vikki Rufus,Marget Lehn,2012-05-14 +3,http://lorempixel.com/300/300/people,2012-05-08,Proin lorem dis amet. Porta purus. Lacus massa. Massa donec suspendisse in aptent et magnis class condimentum senectus felis mauris taciti. Dolor risus. Nulla vitae luctus fringilla vestibulum. Porta lacus nostra dictumst nibh ultrices vel risus tincidunt fermentum. Lorem fusce donec nec quis per sem.,http://lorempixel.com/300/300/people,Oak Rise|Mild Meadows|Palm Parish,Gary Trostle,Larry Wold,2012-03-26 +4,http://lorempixel.com/300/300/people,2013-01-10,Risus fames. Class curae egestas leo accumsan a sollicitudin ante dapibus. Augue velit sem nisl enim suscipit libero nunc at. Neque donec pede a. Fames etiam. Risus lorem congue sociis volutpat. Ipsum lorem primis fusce lobortis vestibulum nullam at nibh leo augue. Velit vitae sed phasellus suscipit mollis nibh nisi porta convallis cursus platea.,http://lorempixel.com/300/300/people,Macaw Island|Gull Coast|Stafford Suburb,Adina Jezierski,Clorinda Croxton,2012-12-07 +2,http://lorempixel.com/300/300/people,2012-02-28,Magna donec quis netus curabitur cum elit fusce neque montes ligula aliquam eu. Lacus fames sociis egestas varius et leo habitasse velit quis velit elit nisi. Massa velit amet cum diam a eros donec mus neque. Justo donec ultricies pede convallis. Lorem neque sociis morbi scelerisque molestie netus. Porta justo bibendum velit nisi hac quis a odio. Fames lorem tellus neque vestibulum praesent posuere nibh maecenas vitae at. Massa netus dictum vestibulum consectetuer egestas habitasse varius adipiscing sagittis egestas iaculis.,http://lorempixel.com/300/300/people,Tern Coast|Royal Abbey,Elouise Connon,Augusta Bourquin,2012-01-23 +1,http://lorempixel.com/300/300/people,2012-11-08,Purus donec magnis dapibus tortor leo sociis ve semper. Etiam nulla. Augue neque a cras massa aliquam lacinia inceptos. Morbi fames condimentum ultrices ridiculus inceptos nibh mauris ligula. Fames felis. Ipsum donec lectus montes nunc scelerisque. Velit metus mus duis sollicitudin in aliquet in ad nisi scelerisque posuere ullamcorper nisi. Risus vitae mattis ridiculus lacus.,http://lorempixel.com/300/300/people,Toucan Island|Oak Orchards|Choctaw Canyon,Del Smithey,Syble Flynn,2012-10-12 +5,http://lorempixel.com/300/300/people,2013-02-18,Morbi nulla. Porta lacus justo dis adipiscing vestibulum ve sagittis ante vel metus vivamus. Fames etiam. Fames morbi per enim arcu orci. Lacus lorem a erat lacus mollis in praesent quam ac. Metus ipsum aenean. Massa justo mollis. Fames class.,http://lorempixel.com/300/300/people,Mango Haven|Rambling Timbers,Arianne Ebarb,Katrina Castorena,2012-12-14 +3,http://lorempixel.com/300/300/people,2012-07-16,Morbi fusce velit praesent odio sit in lectus morbi risus aliquet lacus orci leo cubilia. Massa felis dapibus et vehicula rutrum parturient. Etiam dolor felis cubilia. Neque ipsum. Felis etiam quam a lorem egestas. Risus netus. Netus justo eros elit vehicula eleifend in. Purus morbi.,http://lorempixel.com/300/300/people,Secluded Meadows|Partridge Park,Christel Henrickson,Venessa Mahmood,2012-04-24 +1,http://lorempixel.com/300/300/people,2012-08-26,Velit proin ligula lorem gravida ac eu at erat libero laoreet urna magna tincidunt. Curae felis. Risus justo nam cursus dui parturient neque eget ad pede sem ridiculus eleifend nostra. Ipsum morbi vulputate eni orci vulputate id luctus senectus. Proin velit purus nostra. Class lorem erat habitant per ac congue inceptos parturient fermentum. Vitae risus aliquet ad litora pharetra nibh nec. Morbi dolor tortor condimentum augue luctus montes.,http://lorempixel.com/300/300/people,The City at Chippewa Creek|Angler's Meadows|Captain's Beach,Ellsworth Rehman,Bud Carrow,2012-08-20 +2,http://lorempixel.com/300/300/people,2013-01-30,Vitae proin erat. Proin massa sit blandit augue nisi eros quisque vivamus neque. Ipsum felis cum risus metus sit nunc. Netus magna. Lorem velit netus mauris ut enim justo curae torquent dui cubilia ad in dictum ut. Porta lacus libero. Felis fames posuere. Dolor magna.,http://lorempixel.com/300/300/people,Dove Vale|Placid Junction,Eleonor Mclachlan,Terresa Cabe,2012-11-17 +1,http://lorempixel.com/300/300/people,2012-11-23,Class morbi. Neque ipsum a eros in orci lacus quam auctor ut turpis blandit cubilia mauris nostra nec. Metus neque mollis fusce gravida mollis at leo tempor a. Purus felis suspendisse dui luctus a. Proin purus magnis. Donec etiam. Vitae curae magna odio at tincidunt arcu ipsum phasellus accumsan felis per lorem commodo. Magna lacus class praesent urna nec dictumst consequat a curabitur.,http://lorempixel.com/300/300/people,Wandering Lakes|Aloha Beach,Jade Clutts,Lisha Belser,2012-09-29 +4,http://lorempixel.com/300/300/people,2012-07-23,Etiam purus ullamcorper eni tempor. Etiam fusce varius suspendisse proin ornare ad enim ridiculus eros. Justo neque condimentum nunc nisi erat justo dapibus eget sagittis class quisque accumsan. Justo netus. Augue lacus tempus pellentesque imperdiet proin at ultricies ad. Risus justo primis praesent suspendisse sagittis. Neque magna euismod mollis. Morbi ipsum cras ullamcorper mi tempor feugiat eu ac urna.,http://lorempixel.com/300/300/people,Darling Valley|The Estates at Old Orchards,Kamilah Croke,Elijah Manos,2012-05-11 +2,http://lorempixel.com/300/300/people,2013-04-10,Class massa augue tempus ipsum tellus quis egestas proin neque aliquam commodo congue eu nisl accumsan ornare mattis. Donec porta condimentum ve libero. Etiam justo vitae porta rutrum elit nunc volutpat. Lacus purus a sapien eget ridiculus tortor facilisis. Morbi metus a dictum eros scelerisque euismod pellentesque. Fusce lorem sit vestibulum ve molestie mus. Fames magna natoque at porta nostra mattis dui blandit at eni nibh consequat. Augue donec lobortis parturient facilisis nisi nibh tempus libero.,http://lorempixel.com/300/300/people,Wooded Pasture,Randal Needleman,Coral Crossett,2013-02-24 +4,http://lorempixel.com/300/300/people,2012-05-16,Class porta pulvinar phasellus mollis eleifend ad non. Fames fusce ligula parturient. Magna proin quis accumsan risus dapibus euismod lacinia tortor ve inceptos nisl nec. Morbi nulla aenean etiam quisque viverra cursus fermentum. Lacus curae non. Porta lacus velit non vulputate sapien penatibus ipsum euismod ve facilisi. Risus purus blandit ve hac. Lacus neque augue dictum at mattis.,http://lorempixel.com/300/300/people,The Glen at Blue Spruce Park,Arianne Ebarb,Nikole Frum,2012-04-22 +5,http://lorempixel.com/300/300/people,2013-06-30,Justo neque velit placerat ve odio fames odio magna. Massa risus. Magna fusce dui urna in proin porttitor aliquam platea. Purus massa ante at purus praesent vel sodales torquent aptent odio eget. Ipsum fusce duis urna ultricies nostra pede sollicitudin et cubilia elit nec est. Dolor risus rutrum tortor ac orci rutrum curabitur penatibus. Donec massa accumsan parturient penatibus scelerisque sed urna. Dolor purus viverra tellus id aliquet.,http://lorempixel.com/300/300/people,Pineapple Breakers,Tyree Aumick,Gail Gatts,2013-05-15 +5,http://lorempixel.com/300/300/people,2012-02-12,Nulla donec aptent cras elit lectus ac senectus potenti sapien ipsum et ligula aliquet. Vitae justo pretium ve ridiculus magna suscipit. Class donec orci ultrices duis rhoncus nibh hac metus cursus. Netus neque fringilla. Nulla curae sociosqu ridiculus. Porta class scelerisque ad montes commodo magnis ante in. Justo class pede tellus facilisi eu quam. Justo augue phasellus parturient vel adipiscing et tellus quisque tempor.,http://lorempixel.com/300/300/people,Seagull Firth|Madera Roja,Ellsworth Rehman,Contessa Venable,2012-02-09 +2,http://lorempixel.com/300/300/people,2012-06-20,Augue felis ante vehicula suspendisse nec diam pellentesque interdum ipsum. Netus massa. Felis proin nisi ipsum fames a quis. Massa risus turpis pellentesque fringilla lectus curabitur in suspendisse ve varius per. Netus velit. Morbi fames aenean ridiculus nascetur dolor. Ipsum felis. Augue neque cursus dictum massa ve.,http://lorempixel.com/300/300/people,The Corner at Gentle Crag,Everett Stever,Valarie Macbeth,2012-04-03 +3,http://lorempixel.com/300/300/people,2012-10-06,Velit risus purus montes pede litora malesuada nascetur tempor. Risus purus molestie urna potenti tristique diam imperdiet est pretium proin. Velit magna per eros class elementum mi. Neque purus non rutrum quisque quam a class eu taciti dolor gravida. Fames metus placerat nam class elit accumsan vehicula nulla class lacus eleifend. Netus porta eni netus ridiculus proin. Fusce neque lobortis hendrerit in eu ad diam velit. Dolor velit conubia justo dui ipsum egestas litora aenean odio arcu fames.,http://lorempixel.com/300/300/people,Autumn Timbers,Bert Kohan,Eli Henricksen,2012-07-20 +3,http://lorempixel.com/300/300/people,2012-12-10,Massa felis nam. Risus etiam tellus ad pharetra pretium. Risus vitae mus cras vestibulum platea. Porta proin dictum ornare metus eros nisi. Massa fames cubilia blandit pede pellentesque ac lorem ac est eu tellus. Fusce justo facilisis tristique nisi. Risus purus lacinia mattis mi pharetra amet id magna ac. Vitae neque felis lorem.,http://lorempixel.com/300/300/people,Whistling Heath,Adina Jezierski,Norberto Dynes,2012-09-27 +5,http://lorempixel.com/300/300/people,2013-01-08,Lorem metus senectus. Fames netus justo platea tristique senectus eu proin pellentesque dignissim porta. Lacus risus fusce nonummy vivamus tellus vel nascetur lacus fusce ullamcorper sed odio fusce. Netus class amet est eget parturient dictum volutpat sociis adipiscing justo vivamus. Fames neque morbi a amet ad donec ut felis imperdiet. Metus curae. Massa proin tempor sociosqu facilisis sagittis dolor placerat tincidunt congue vestibulum. Etiam curae.,http://lorempixel.com/300/300/people,Songbird Parish,Brenda Orzechowski,Natasha Goers,2012-10-19 +5,http://lorempixel.com/300/300/people,2013-01-19,Nulla massa. Justo lorem fames per nunc vel class elementum fames natoque. Fames fusce magna. Felis justo rhoncus quisque tempus hendrerit dui. Class dolor netus cras per metus dis feugiat eu semper lobortis. Etiam donec pulvinar magna justo facilisi lacus augue suspendisse ut. Augue justo mollis eros id elit litora at quam enim ultrices. Velit justo sociosqu metus habitant ut magnis erat nisl.,http://lorempixel.com/300/300/people,Seagull Waves|Tern Coast|Macaw Firth,Cassaundra Ribera,Genie Gentry,2012-10-22 +5,http://lorempixel.com/300/300/people,2012-08-24,Ipsum nulla metus blandit hymenaeos in phasellus ut hendrerit laoreet neque. Massa etiam aenean eros mus cubilia urna. Donec massa morbi ante aptent litora habitant adipiscing venenatis condimentum. Etiam lacus torquent id tempor. Purus netus facilisi elit per sollicitudin ut. Ipsum augue. Justo etiam a nibh ut sollicitudin dictum netus ac montes. Purus massa sagittis purus et ante erat.,http://lorempixel.com/300/300/people,Fireside Anchorage|The Woods of Crystal Cove|Puerto Bajo,Jeannette Leick,Iesha Bosque,2012-07-11 +4,http://lorempixel.com/300/300/people,2013-06-12,Augue etiam sed diam nascetur adipiscing luctus proin suspendisse dictumst conubia erat. Vitae class. Magna donec magnis senectus euismod platea tellus donec pulvinar. Dolor magna auctor varius potenti eget cras tellus quam eros diam. Magna vitae vivamus sit eros maecenas tempus. Massa fames mollis ac faucibus libero cursus gravida dapibus consequat inceptos class rutrum torquent ante. Risus netus litora per. Morbi magna suscipit magna tempus class lectus elementum vivamus dolor quis sed porta cras.,http://lorempixel.com/300/300/people,The Village at Bear Firth|Bridgwater Leap|Sweet Knoll,Caprice Doris,Ronda Mandujano,2013-05-01 +5,http://lorempixel.com/300/300/people,2012-04-17,Porta ipsum lectus ipsum hymenaeos molestie montes libero morbi magna est proin diam a. Metus massa. Fames magna. Felis justo. Ipsum nulla. Felis purus rutrum ve velit ad etiam tortor et eros risus donec tempor metus. Metus proin ornare inceptos hymenaeos hac elit orci ipsum proin. Lacus neque sociis.,http://lorempixel.com/300/300/people,Inviting Forest|Leafy Glade|Weeping Willow Quarter,Tyree Aumick,Joanie Beaver,2012-03-20 +1,http://lorempixel.com/300/300/people,2012-06-11,Nulla proin. Nulla metus. Metus justo ullamcorper dictumst vivamus eget ultrices cum arcu. Felis fusce habitasse molestie et sit quam pharetra consectetuer varius. Magna risus orci a elit ad duis porta egestas. Massa purus magna auctor vitae parturient suscipit amet commodo. Purus lacus tempus erat montes blandit porttitor eu ut neque. Donec purus hac odio.,http://lorempixel.com/300/300/people,Admiral's Island|The Meadow at Private Abbey|Fairford Terrace,Kera Cybart,Juliane Houle,2012-04-23 +5,http://lorempixel.com/300/300/people,2013-06-11,Class morbi etiam mollis sociosqu malesuada. Augue risus mollis interdum feugiat tincidunt senectus. Lacus magna montes purus sodales potenti natoque. Felis netus turpis integer conubia. Ipsum netus magna libero. Risus ipsum. Lacus ipsum sociis eget curabitur senectus. Lorem fames.,http://lorempixel.com/300/300/people,Wooded Pasture,Caprice Doris,Coral Crossett,2013-05-15 +4,http://lorempixel.com/300/300/people,2012-06-13,Purus massa neque ornare at primis. Magna dolor libero. Lorem vitae lorem tellus. Fusce velit. Velit nulla risus dolor velit congue habitasse vel class vel. Netus curae class dis nisi tincidunt et urna ligula leo blandit. Nulla magna cursus tempus ultrices. Neque purus aenean suspendisse porta mollis pellentesque.,http://lorempixel.com/300/300/people,Angler's Meadows|The Villas of Dover Prairie,Tonya Mcentee,Monte Player,2012-05-17 +4,http://lorempixel.com/300/300/people,2012-03-21,Fusce proin nullam arcu cras etiam. Porta class. Ipsum proin faucibus quis varius fringilla mollis torquent justo et massa. Risus vitae lobortis in diam metus porttitor consequat duis potenti posuere laoreet erat facilisi et scelerisque at. Proin ipsum amet scelerisque et congue facilisi adipiscing fringilla neque. Nulla dolor. Justo fames vitae blandit dui. Donec curae nam amet dui velit sem parturient neque nisl cubilia vitae at et elit.,http://lorempixel.com/300/300/people,Mesa Verde,Fred Victory,Linn Rideout,2012-03-03 +3,http://lorempixel.com/300/300/people,2013-02-18,Metus curae. Donec magna hac dui eu congue augue elit sociis turpis risus quis dui. Class nulla sapien in. Risus justo. Justo purus sociis tortor pretium. Dolor neque ligula nulla erat lorem eu mollis sodales posuere elit. Nulla justo mus adipiscing mi vulputate lacus porttitor. Donec velit.,http://lorempixel.com/300/300/people,Lazy Bay,Allie Hance,Bethel Rispoli,2012-11-26 +5,http://lorempixel.com/300/300/people,2012-08-14,Lacus purus enim integer felis eget commodo eu. Justo lorem quam pretium porttitor magnis vestibulum fusce. Donec fusce duis. Ipsum fames vel. Fames proin scelerisque accumsan fusce amet ut luctus odio. Ipsum fames porttitor penatibus ipsum habitasse quisque dolor duis urna. Velit curae turpis placerat penatibus ac fermentum a porta euismod vivamus nascetur duis. Porta donec lectus.,http://lorempixel.com/300/300/people,Catamaran Lagoon,Bert Kohan,Myrta Leftwich,2012-05-16 +1,http://lorempixel.com/300/300/people,2012-06-27,Lorem vitae a ligula eros curae at. Lorem ipsum urna facilisi eu suspendisse enim duis. Fames dolor porta dolor. Massa proin dictum nisi convallis interdum accumsan lorem pede leo metus. Nulla class. Fames dolor leo quam. Risus etiam. Felis donec auctor litora.,http://lorempixel.com/300/300/people,Fireside Anchorage|The Woods of Crystal Cove|Puerto Bajo,Jennine Saephan,Iesha Bosque,2012-04-13 +1,http://lorempixel.com/300/300/people,2012-10-16,Velit porta vehicula vulputate nulla neque. Felis donec vulputate nec eget facilisis ac. Purus vitae. Porta dolor praesent habitasse id diam risus nullam mattis. Felis justo nec sociosqu nonummy malesuada orci. Netus velit non cras pede tincidunt nostra eleifend felis consectetuer. Proin morbi dolor. Magna augue pulvinar.,http://lorempixel.com/300/300/people,Sioux Cottages|Wooded Point,Brenda Orzechowski,Janine Heitz,2012-07-25 +4,http://lorempixel.com/300/300/people,2012-08-29,Justo massa malesuada. Donec curae duis. Felis neque fames nam amet ac nullam. Metus justo. Fames purus duis aliquet nonummy habitasse sociis cum adipiscing eu. Dolor morbi massa volutpat eu massa pellentesque ultricies. Ipsum class ipsum urna eu fusce primis varius. Risus proin.,http://lorempixel.com/300/300/people,Inviting Forest|Leafy Glade|Weeping Willow Quarter,Bert Kohan,Joanie Beaver,2012-06-21 +5,http://lorempixel.com/300/300/people,2012-05-21,Augue lorem montes duis id pellentesque aenean. Purus magna tempus vestibulum. Purus curae rhoncus quisque malesuada. Class lacus eros dolor orci cum vel natoque pede. Etiam felis enim netus blandit. Netus nulla semper enim urna eros mattis eget facilisis nullam tempor sit arcu at netus. Class felis accumsan vel. Class fusce pulvinar ultricies.,http://lorempixel.com/300/300/people,Salisbury Mesa|Chippewa Promontory,Mozelle Saez,Niesha Isbell,2012-03-13 +2,http://lorempixel.com/300/300/people,2013-03-14,Metus etiam felis a sodales mi risus purus metus a cras ve. Morbi justo etiam dui sit. Purus porta orci turpis torquent pharetra nulla imperdiet. Metus morbi lorem vehicula nec arcu enim amet sociis magnis pede. Nulla neque tempor velit imperdiet eni velit nisi. Porta proin primis vestibulum suscipit viverra elementum quam. Netus etiam. Lorem neque maecenas fusce ad magnis imperdiet ac nulla ad.,http://lorempixel.com/300/300/people,Sioux Cottages|Wooded Point,Birgit Shires,Janine Heitz,2013-02-11 +5,http://lorempixel.com/300/300/people,2012-02-20,Magna massa varius suspendisse lorem lectus sem dui in rutrum pellentesque. Magna fames erat. Porta metus natoque quisque amet mauris nisi conubia in erat fusce et ad. Vitae etiam tortor donec sociis. Netus massa class eros. Massa augue suspendisse facilisi phasellus justo. Lacus neque sed proin iaculis diam lacinia ve et duis habitant ipsum nonummy pede bibendum. Curae proin habitasse aptent tempor.,http://lorempixel.com/300/300/people,Porpoise Quay|Windward Beach,Zoila Meadow,Lilliam Sorrells,2012-02-17 +5,http://lorempixel.com/300/300/people,2012-04-16,Ipsum lorem vel metus dui phasellus. Velit dolor non. Class lacus vel. Netus purus vehicula ipsum penatibus maecenas mattis curae cubilia tellus nec auctor a. Metus augue a cras adipiscing primis dis vestibulum risus duis. Velit curae nisi purus convallis dui. Magna nulla platea dictumst facilisis urna. Ipsum fames accumsan per sociis hac lectus fringilla.,http://lorempixel.com/300/300/people,Palm Island|Macaw Anchorage|Banana Breakers,Ellsworth Rehman,Annice Elwood,2012-02-29 +1,http://lorempixel.com/300/300/people,2012-11-10,Risus proin curae arcu vel massa gravida maecenas. Nulla risus eros egestas erat. Fusce lacus. Metus dolor cursus parturient lorem vivamus. Metus etiam turpis eu lobortis odio ac pellentesque mattis. Magna augue a rutrum netus feugiat nam vestibulum parturient. Morbi porta magna auctor condimentum etiam nullam. Purus vitae penatibus quis elit vestibulum.,http://lorempixel.com/300/300/people,Mild Hills,Tyree Aumick,Lurline Nickols,2012-10-03 +4,http://lorempixel.com/300/300/people,2012-01-29,Porta morbi a. Risus porta vivamus luctus ad mi est id rhoncus ad. Massa fusce ligula massa lacinia elementum tempor netus iaculis. Donec fames a lacinia ac. Morbi curae maecenas eu hac amet vulputate risus et consectetuer. Curae lorem libero euismod elit eros adipiscing tempor nec vestibulum facilisis class tellus. Augue vitae ante ultricies maecenas. Vitae dolor.,http://lorempixel.com/300/300/people,Banyan Pier,Saundra Crigger,Reggie Sturgill,2012-01-07 +4,http://lorempixel.com/300/300/people,2013-01-14,Lacus morbi montes at sociosqu. Fames donec viverra sodales odio in pulvinar dui. Risus porta eleifend velit mi litora habitant adipiscing. Fames purus cursus ad est elit. Etiam justo. Ipsum netus dictum suscipit nunc egestas a tortor vitae gravida auctor eu at sed. Curae ipsum netus fames odio etiam. Vitae justo mauris etiam gravida euismod.,http://lorempixel.com/300/300/people,Sierra Baja|Guava Reef|Fisherman's Promontory,Candice Vidrio,Marylee Ziebarth,2012-10-21 +5,http://lorempixel.com/300/300/people,2012-11-04,Ipsum justo auctor. Lacus etiam molestie hendrerit eu ullamcorper quam. Donec massa porta. Felis nulla per diam vel. Justo magna. Risus porta dictum in commodo eget eu augue pellentesque ultricies. Lacus magna curae purus. Justo augue arcu ante sociosqu donec nunc aliquam.,http://lorempixel.com/300/300/people,Sandy Haven,Bert Kohan,Vena Gizzi,2012-10-31 +1,http://lorempixel.com/300/300/people,2012-12-25,Class justo a erat dolor in. Augue curae nam porttitor nullam tellus quam viverra. Class etiam est ante torquent donec mi ornare praesent ullamcorper vehicula porttitor consectetuer cubilia sed hymenaeos neque elit enim. Netus ipsum suspendisse ultrices magna. Metus etiam dictum. Justo massa tempor ipsum ac magna pede ante aptent id placerat tellus aliquet ve. Porta fames. Morbi justo tellus ac vehicula gravida ve morbi tortor ullamcorper lorem.,http://lorempixel.com/300/300/people,Wandering Vineyard,Tomika Shimer,Tonette Moos,2012-11-19 +5,http://lorempixel.com/300/300/people,2012-03-09,Porta massa. Velit magna. Ipsum fames semper nam adipiscing fames elit platea luctus nam sapien dignissim viverra porta diam ridiculus mollis accumsan sit donec venenatis fringilla. Ipsum velit libero pede. Velit justo nunc metus id semper. Risus fusce augue a viverra tortor varius eros cum ipsum primis lorem cursus adipiscing. Porta class magna. Neque fames netus molestie et lorem justo sociis.,http://lorempixel.com/300/300/people,The Village at Bear Firth|Bridgwater Leap|Sweet Knoll,Maryann Brunk,Ronda Mandujano,2012-02-01 +3,http://lorempixel.com/300/300/people,2013-01-10,Velit proin. Nulla magna. Proin vitae rhoncus aptent et at tincidunt curae sem nibh. Porta nulla cursus. Class etiam lacus purus facilisi lorem cras. Porta etiam. Porta nulla. Purus etiam purus magnis ut.,http://lorempixel.com/300/300/people,The Hills at Poplar Summit|Welcome Lakes,Nila Styons,Rolando Bjornson,2012-11-24 +2,http://lorempixel.com/300/300/people,2012-03-11,Augue lacus. Fusce lorem laoreet imperdiet tortor elit fermentum nec egestas. Massa magna a amet justo ullamcorper nam erat. Felis augue hendrerit odio scelerisque gravida. Etiam purus posuere cum facilisis dui iaculis. Purus lacus. Neque morbi vivamus sed venenatis duis nunc tristique. Neque proin porta eni erat placerat cursus commodo et odio commodo purus feugiat ve.,http://lorempixel.com/300/300/people,Exeter Estates|Admiral's Island,Saundra Crigger,Tracie Spraggs,2012-01-30 +1,http://lorempixel.com/300/300/people,2012-11-07,Neque fusce. Proin felis turpis adipiscing morbi diam ridiculus ad hendrerit. Nulla lorem arcu nisl natoque iaculis odio nec ipsum. Lorem neque urna in lacus senectus ut velit. Vitae lorem sit urna erat nam class blandit. Risus fames curae netus euismod ut. Fames morbi non habitant morbi id dignissim rhoncus luctus quis. Purus curae risus a.,http://lorempixel.com/300/300/people,Bedwyn Anchorage|Toucan Gulf,Virgen Brummitt,Dagny Darlington,2012-08-21 +5,http://lorempixel.com/300/300/people,2012-05-14,Velit morbi. Proin vitae aliquet quam in est quam aptent. Augue purus ullamcorper mi magnis etiam condimentum. Porta proin aliquam at. Fusce nulla. Morbi proin congue lacus curae netus. Risus nulla nec elit ve. Justo fusce est parturient felis cras fermentum ultrices et.,http://lorempixel.com/300/300/people,Mermaid Firth,Gary Trostle,Sal Andujar,2012-04-17 +5,http://lorempixel.com/300/300/people,2012-07-19,Netus vitae. Porta donec lacinia elementum urna scelerisque aliquet felis. Justo lorem hac tempor eu. Donec risus litora etiam torquent est fames vulputate adipiscing duis. Ipsum vitae duis purus felis suscipit venenatis pede. Lorem felis neque egestas lectus libero enim. Dolor purus. Nulla velit congue.,http://lorempixel.com/300/300/people,Mild Hills,Ling Mcmaster,Lurline Nickols,2012-06-29 +5,http://lorempixel.com/300/300/people,2013-03-16,Etiam augue posuere nisl mus netus dis justo curae porta pharetra. Netus metus morbi eget a morbi viverra dis mi. Donec neque. Class dolor placerat diam. Massa metus. Justo class. Risus massa bibendum justo velit nunc fermentum lacus erat lectus gravida tempus. Massa purus tempor porta curabitur aliquet nisl.,http://lorempixel.com/300/300/people,The Chapel at Palm Hearth|Admiral's Island,Isidro Hanlin,Sherika France,2013-02-23 +4,http://lorempixel.com/300/300/people,2012-04-12,Dolor morbi interdum pede sem magna eros non nisl euismod. Porta etiam varius hendrerit blandit per eu. Vitae fusce quis cum porta purus lobortis vestibulum sociis et. Etiam fusce integer sit adipiscing in inceptos quis consequat eu eros porta euismod ornare. Vitae dolor a nostra fringilla eleifend. Vitae morbi nec torquent malesuada curae netus facilisi. Risus dolor mus sed cubilia aptent ad pretium ante justo. Donec ipsum pharetra eu nostra a habitant nec et justo nunc malesuada.,http://lorempixel.com/300/300/people,Secluded View|Bedwyn Cottages,Michal Blish,Charla Fox,2012-02-04 +5,http://lorempixel.com/300/300/people,2012-03-20,Morbi magna non enim non aliquam aenean arcu cras bibendum. Curae class turpis odio pellentesque parturient duis fames ac dignissim ve penatibus class vitae nec donec habitasse. Felis massa. Metus lacus porta quisque nostra id. Massa class fusce vehicula magna sed curabitur dis. Metus purus congue. Lorem massa. Ipsum fusce tellus eget diam metus.,http://lorempixel.com/300/300/people,The Park at Liberty Acres,Era Mustafa,Shantay Shivers,2012-02-04 +2,http://lorempixel.com/300/300/people,2013-05-18,Etiam ipsum etiam arcu volutpat sollicitudin. Proin lorem eni ipsum nibh enim proin massa a gravida sapien mus id nisi nulla quam cubilia. Dolor curae per eros. Metus etiam condimentum sagittis nunc ligula vestibulum. Lorem proin amet penatibus. Donec magna netus mus eget ad mus duis aliquam. Metus netus molestie amet litora ad quam fames. Massa metus tortor class porttitor ante.,http://lorempixel.com/300/300/people,Fox Harbor|Tern Coast,Tomika Shimer,Gisele Giebler,2013-03-01 +4,http://lorempixel.com/300/300/people,2012-07-10,Fusce curae. Ipsum metus suspendisse inceptos sodales. Class vitae nisi vivamus magna ac libero facilisi condimentum. Porta netus vehicula neque. Augue vitae. Neque lorem nostra torquent. Class purus sociosqu quis phasellus pulvinar congue odio pede diam. Fusce netus leo parturient ultricies nibh.,http://lorempixel.com/300/300/people,Pilot Dunes|Windsor Overlook|Rambutan Bay,Rodrick Turberville,Rusty Canary,2012-04-17 +1,http://lorempixel.com/300/300/people,2012-09-22,Fames porta taciti. Morbi felis velit cursus quam tempor vestibulum. Felis lacus. Ipsum morbi cursus parturient. Lorem neque. Etiam vitae lectus. Nulla neque nullam neque mi vehicula euismod sollicitudin. Netus morbi diam senectus vestibulum viverra elit.,http://lorempixel.com/300/300/people,Admiral's Reef|Salisbury Mesa|Toucan Gulf,Kemberly Lecuyer,Hellen Gatton,2012-09-12 +5,http://lorempixel.com/300/300/people,2013-02-03,Donec massa. Felis morbi nunc ornare aliquam non at purus urna sapien congue sem. Velit lacus platea fusce vestibulum interdum dolor nulla nec. Proin risus. Donec lorem montes senectus nunc eni donec adipiscing pharetra dapibus cras ac pellentesque. Nulla massa. Augue justo habitasse libero parturient. Lorem metus volutpat fermentum consectetuer sodales massa.,http://lorempixel.com/300/300/people,Walnut Streams|Oak Haven|Iroquois Vineyard,Jade Clutts,Tonie Pille,2013-01-27 +2,http://lorempixel.com/300/300/people,2013-03-16,Purus nulla tempus lobortis class nostra. Proin curae augue fermentum per ipsum congue. Felis ipsum a nisi curae risus eleifend dis nibh. Donec netus suspendisse erat nisl diam vel iaculis mi et ad ac. Felis risus netus aptent libero dis blandit lorem nibh ante habitasse. Velit porta ipsum placerat ad primis a sodales. Donec velit ipsum lacinia. Etiam proin lectus torquent porttitor varius at mollis.,http://lorempixel.com/300/300/people,Starling Springs|Dorset Grove|Moose Bay,Everett Stever,Candie Warford,2013-01-23 +2,http://lorempixel.com/300/300/people,2012-11-03,Fames neque. Ipsum porta accumsan eu. Porta morbi. Vitae dolor mattis feugiat ve ante. Ipsum lacus nam nibh cum dapibus torquent turpis porta nunc nisi tellus mus pulvinar. Magna risus. Donec lacus libero proin tincidunt bibendum. Ipsum fames.,http://lorempixel.com/300/300/people,Salisbury Mesa|Chippewa Promontory,Willena Acoff,Niesha Isbell,2012-10-03 +3,http://lorempixel.com/300/300/people,2013-04-13,Class etiam dui erat class integer nostra nibh porta etiam. Netus lacus duis nec. Curae morbi rutrum porta ac. Donec morbi a eget adipiscing mattis. Curae vitae augue tempor sapien fames convallis. Neque fames nulla mus neque vestibulum suspendisse cursus et elit cras morbi. Dolor augue auctor in diam ante nisl eros vestibulum varius bibendum lectus. Class fames.,http://lorempixel.com/300/300/people,The Streams at Plymouth Ranch|The Butte at North Forest,Lili Scally,Georgann Caffrey,2013-04-06 +4,http://lorempixel.com/300/300/people,2013-07-07,Curae etiam. Netus class taciti ante montes potenti orci quam odio. Morbi lacus. Etiam dolor metus sodales placerat. Magna lacus. Metus lacus placerat elit lacinia a suspendisse per. Fames morbi eleifend sem odio molestie cum euismod aenean. Class porta commodo nam adipiscing.,http://lorempixel.com/300/300/people,Liberty Glade|The Vale at Evergreen Junction|The Villas at Sheffield City,Leona Welter,Jerilyn Crowder,2013-05-11 +1,http://lorempixel.com/300/300/people,2012-11-11,Massa fames ridiculus odio ultricies. Massa justo quam quisque erat suscipit venenatis at. Vitae donec. Velit magna. Dolor magna arcu lorem ut donec leo pede neque at orci dui mattis. Metus ipsum taciti dolor odio imperdiet. Justo netus ornare at cum ac tortor hendrerit class ve ultricies scelerisque habitasse duis euismod id facilisis natoque dis. Neque proin dictum feugiat id libero ut nunc vitae rhoncus vel commodo.,http://lorempixel.com/300/300/people,Sandpiper Quay|Castleton Gulf|The Orchards at Bison Glade,Kenda Scarboro,Fran Salsman,2012-08-16 +4,http://lorempixel.com/300/300/people,2012-03-08,Lacus lorem pharetra malesuada hac pede senectus luctus torquent tincidunt. Nulla augue montes. Purus fames sed urna nec a rutrum porta. Augue massa tempor mollis praesent luctus parturient placerat ante mi quam ornare venenatis facilisis. Fames metus dapibus quam nibh neque. Etiam fames mauris primis pharetra condimentum per tempus penatibus. Netus lorem. Massa risus taciti.,http://lorempixel.com/300/300/people,Whaler's Cove,Tonya Mcentee,Silvia Miranda,2012-02-04 +1,http://lorempixel.com/300/300/people,2012-08-23,Augue nulla ante nec rutrum pretium egestas. Metus fames a iaculis ad ornare eu libero consequat vitae. Porta fames nam eros tristique torquent duis arcu est. Magna morbi fames libero montes inceptos lectus class potenti. Proin purus erat nisi porta platea facilisis vestibulum ante fames ullamcorper torquent proin. Proin vitae amet cras auctor odio integer. Felis porta. Velit neque eni fringilla neque massa dictumst.,http://lorempixel.com/300/300/people,Magnolia Springs|Madera Buena,Jacque Behm,Gisele Michaels,2012-06-01 +2,http://lorempixel.com/300/300/people,2012-06-21,Porta donec vel vitae feugiat. Etiam massa. Curae purus metus tincidunt. Dolor morbi tellus augue orci ipsum lorem cras class. Magna neque porta libero nibh nisl litora. Donec class. Metus purus vel pede nisl sed inceptos a interdum eros. Metus netus sapien mi mattis curabitur.,http://lorempixel.com/300/300/people,Mesa Verde,Catherina Entrekin,Linn Rideout,2012-06-18 +1,http://lorempixel.com/300/300/people,2013-05-09,Proin vitae. Justo magna eros euismod urna hac sollicitudin mi feugiat erat. Felis morbi aptent lectus sit pharetra elementum. Fames dolor lectus rutrum justo nullam primis curabitur curae. Porta augue est orci cum. Massa nulla amet tempor pharetra. Class fusce. Massa magna suspendisse bibendum venenatis pellentesque adipiscing.,http://lorempixel.com/300/300/people,Pilot Dunes|Windsor Overlook|Rambutan Bay,Brenda Orzechowski,Rusty Canary,2013-04-24 +5,http://lorempixel.com/300/300/people,2012-06-30,Ipsum morbi felis cum cras habitant natoque eget. Lacus magna ipsum nec amet per. Donec proin porttitor et facilisis a dis fermentum velit mi neque torquent pede aptent. Lacus augue purus elementum adipiscing non porta penatibus curae mus cras morbi nonummy nisl adipiscing tempor. Nulla metus sed eros consequat sem pellentesque at augue sapien porta dolor sit primis rhoncus. Purus dolor sed odio pulvinar dis nonummy at eu ve quis. Purus velit luctus at molestie gravida consectetuer dignissim semper maecenas magna. Magna porta penatibus inceptos massa potenti urna a morbi.,http://lorempixel.com/300/300/people,The Sanctuary at Hastings Point|The Outlook at Andover Orchards|Buffalo Orchards,Jo May,Waylon Lubin,2012-06-14 +3,http://lorempixel.com/300/300/people,2013-02-08,Dolor etiam auctor tellus mus euismod sagittis ad. Donec neque. Netus lacus eni orci. Magna vitae elit dapibus litora nibh elementum mauris. Nulla fusce. Netus etiam leo tempus inceptos fermentum quam suspendisse quisque morbi nonummy aliquam. Etiam fames. Ipsum dolor.,http://lorempixel.com/300/300/people,Thanksgiving Cove|Windsor Overlook,Marnie Kemble,Chuck Navas,2013-02-03 +5,http://lorempixel.com/300/300/people,2012-05-28,Dolor massa pulvinar vestibulum iaculis dis. Metus fames. Dolor morbi aptent hymenaeos. Lacus massa mauris rutrum fringilla dis. Vitae etiam. Ipsum curae ligula taciti eni mollis aliquet duis. Porta justo a tempor diam habitasse. Donec risus.,http://lorempixel.com/300/300/people,The View at Cherokee Orchards|The Bluff at Bear Meadows|The Point at Queensborough Crag,Ashlie Rester,Taisha Glandon,2012-04-05 +5,http://lorempixel.com/300/300/people,2012-04-02,Purus lorem est natoque. Nulla risus. Donec magna vivamus commodo nibh vestibulum nisi morbi mauris parturient pulvinar nisl vulputate. Netus neque auctor et platea integer sodales. Velit netus pretium non feugiat mi. Class donec quis augue rhoncus blandit cras augue. Vitae proin. Velit etiam lacinia egestas nunc.,http://lorempixel.com/300/300/people,Mesa Gorda|Fireside Valley,Arianne Ebarb,Luetta Baumbach,2012-01-25 +3,http://lorempixel.com/300/300/people,2013-02-26,Justo magna. Morbi fames tristique quis scelerisque ut sapien elementum nullam duis quis. Vitae morbi tempor rutrum ultricies fusce. Curae fames posuere porttitor congue vehicula iaculis amet ad volutpat dis et. Netus morbi pede aptent viverra. Morbi proin. Metus massa cras. Metus velit sociis ac ultrices feugiat pulvinar ve fames ut.,http://lorempixel.com/300/300/people,Sandpiper Quay|Castleton Gulf|The Orchards at Bison Glade,Ellsworth Rehman,Fran Salsman,2013-01-15 +3,http://lorempixel.com/300/300/people,2012-08-23,Dolor risus cursus eu nibh habitant a sollicitudin ante netus. Fames lacus varius ve sociosqu placerat turpis adipiscing fames ante non curae tellus eu. Porta nulla habitant purus dis proin iaculis ve class mollis tristique vivamus. Augue magna nisl tristique sem risus est quis bibendum sapien vestibulum pellentesque pretium velit dui nisl. Justo dolor. Proin metus tempus tortor interdum facilisis odio mus. Augue morbi. Ipsum dolor.,http://lorempixel.com/300/300/people,Catamaran Lagoon,Tonya Mcentee,Myrta Leftwich,2012-08-14 +1,http://lorempixel.com/300/300/people,2012-09-22,Lorem magna cubilia mattis nam parturient vestibulum eu ultrices commodo sodales erat. Morbi neque a congue tristique parturient arcu morbi et ridiculus. Fusce netus pede nisi natoque ad ut eros metus tellus. Porta lorem tempus. Felis metus nullam mauris leo. Ipsum class lorem nullam massa aliquet hac habitant hendrerit curae blandit aliquet. Lorem fames sodales sem. Massa netus ridiculus pulvinar velit nonummy ornare.,http://lorempixel.com/300/300/people,Plymouth Cave|Myna Haven|The Cove at Whaler's Prospect,Chang Morquecho,Gwyneth Laidlaw,2012-09-03 +5,http://lorempixel.com/300/300/people,2013-04-04,Donec porta class sodales tempus et. Magna metus nisi euismod auctor class parturient. Magna etiam massa natoque cursus eu quam libero porttitor felis lorem ultrices hymenaeos turpis. Metus felis. Porta justo. Lacus donec nec justo potenti iaculis magnis. Massa velit pede felis. Fusce netus.,http://lorempixel.com/300/300/people,Songbird Parish,Elouise Connon,Natasha Goers,2013-04-03 +4,http://lorempixel.com/300/300/people,2012-03-11,Lacus neque. Lacus felis pede est non rhoncus a ullamcorper dui auctor bibendum velit proin interdum. Risus fames neque fames natoque class nunc aliquam. Curae vitae augue. Morbi augue congue eu pharetra iaculis natoque. Felis donec. Felis morbi dictumst dis conubia interdum tempus varius ante nisi mus quis praesent. Massa felis neque a diam fusce proin nec nunc augue sed adipiscing.,http://lorempixel.com/300/300/people,Darling Valley|The Estates at Old Orchards,Gia Kennamer,Elijah Manos,2012-01-13 +3,http://lorempixel.com/300/300/people,2012-03-27,Purus curae erat rhoncus dolor in ligula. Lorem morbi pharetra tincidunt curae urna. Justo morbi netus cum pharetra netus. Porta netus praesent metus id tempor. Morbi velit sit tortor. Lorem fames taciti ad pulvinar gravida nostra curae rhoncus est mi. Velit felis facilisi amet dui. Lorem morbi faucibus hac nulla montes pharetra torquent dictum tempor torquent natoque aliquam.,http://lorempixel.com/300/300/people,Spring Sanctuary|Sandpiper Pier|Lazy Vineyard,Jacque Behm,Marybeth Sinquefield,2012-02-03 +1,http://lorempixel.com/300/300/people,2012-04-15,Neque nulla curae augue proin fusce ligula risus sodales amet orci libero aliquet. Dolor ipsum. Massa magna. Ipsum risus. Netus risus commodo nisi. Curae magna dictum tortor laoreet ut dis mi nonummy urna. Neque augue sapien sed bibendum lacinia metus. Porta risus nullam pede orci nisi laoreet pede.,http://lorempixel.com/300/300/people,Bedwyn Anchorage|Toucan Gulf,Chang Morquecho,Dagny Darlington,2012-01-30 +2,http://lorempixel.com/300/300/people,2012-06-11,Massa nulla. Curae velit tristique. Ipsum risus. Lacus purus nonummy quis velit conubia sociis ipsum vitae natoque sagittis libero dictum dapibus sed. Risus class. Neque morbi elit nibh mauris per nec dapibus taciti litora hac nonummy eget accumsan non. Ipsum donec neque porttitor id venenatis. Dolor fusce.,http://lorempixel.com/300/300/people,Banyan Lagoon,Iona Lisenby,Alysha Lococo,2012-03-21 +1,http://lorempixel.com/300/300/people,2013-04-26,Augue risus a auctor quam ad. Augue etiam facilisi curae odio hac nam dis tincidunt sapien accumsan penatibus purus odio ipsum lectus. Velit donec dapibus pharetra neque porta. Metus neque velit. Risus ipsum netus enim sem etiam rhoncus. Fames felis velit ante molestie ipsum proin magna. Purus nulla a integer in ve. Class justo a quam netus ultricies volutpat aptent.,http://lorempixel.com/300/300/people,Azalea Glen,Tyree Aumick,Marget Charlebois,2013-04-21 +4,http://lorempixel.com/300/300/people,2012-03-09,Magna ipsum bibendum massa ad porta in proin. Risus class aptent eu dis. Netus etiam euismod. Proin lacus justo sapien et risus ac mollis vivamus orci potenti eu odio. Magna augue nonummy arcu leo. Donec neque lacus elit. Donec netus dapibus. Fames curae porta leo morbi ridiculus.,http://lorempixel.com/300/300/people,Mesa Gorda|Fireside Valley,Gary Trostle,Luetta Baumbach,2012-01-24 +2,http://lorempixel.com/300/300/people,2012-02-03,Morbi lorem facilisi fusce montes. Curae justo accumsan parturient sapien purus venenatis. Augue fames mus interdum justo velit urna. Fusce vitae semper sit pede hymenaeos. Massa morbi viverra. Dolor metus primis ve egestas nunc at torquent. Nulla justo. Etiam velit.,http://lorempixel.com/300/300/people,Shady Pasture,Randal Needleman,Roxann Leong,2012-01-04 +3,http://lorempixel.com/300/300/people,2012-10-05,Fusce donec. Lorem fames ullamcorper sem in sollicitudin. Metus lorem. Etiam morbi suscipit in ornare accumsan dui donec feugiat. Purus neque. Magna felis phasellus massa ut semper felis ridiculus ornare curae vestibulum placerat eros placerat. Nulla lacus lectus justo nostra mauris dictumst. Augue velit semper vulputate aliquam felis elit habitant nisi ultrices fringilla.,http://lorempixel.com/300/300/people,Magnolia Oaks|Kissing Highlands|Guava Sands,Tonya Mcentee,Anh Hermanson,2012-08-11 +5,http://lorempixel.com/300/300/people,2013-06-21,Donec fames lectus facilisi parturient cubilia cras in nisi vitae dapibus facilisis. Augue massa sociis tellus habitant euismod quisque. Proin donec justo blandit convallis lobortis ac amet. Metus dolor commodo tincidunt bibendum eu dolor. Felis massa lectus suspendisse. Purus justo rhoncus tortor leo dictumst commodo. Porta justo metus nonummy elit et. Metus magna malesuada diam hac urna sed.,http://lorempixel.com/300/300/people,Fireside Anchorage|The Woods of Crystal Cove|Puerto Bajo,Venessa Scull,Iesha Bosque,2013-04-08 +2,http://lorempixel.com/300/300/people,2012-09-03,Fusce magna cum accumsan imperdiet habitant duis aenean mattis duis ornare sodales. Magna felis cras lorem quisque faucibus magnis nunc. Risus donec sagittis non odio parturient id tempor. Vitae curae eleifend ridiculus class dui tincidunt lorem pede egestas morbi velit dictum dolor vivamus. Metus netus malesuada torquent ve ullamcorper. Fames etiam tempus sapien duis. Netus neque vulputate non odio ve morbi. Purus etiam ligula.,http://lorempixel.com/300/300/people,Tern Coast|Royal Abbey,Sharan Fucci,Augusta Bourquin,2012-08-18 +4,http://lorempixel.com/300/300/people,2012-03-15,Velit felis vivamus gravida aptent tortor sem in erat magna nisl. Justo metus massa primis. Justo lorem quam ac eros dolor porta leo amet ve morbi ultricies. Purus fames nostra lobortis maecenas ut. Dolor metus euismod montes ad eleifend faucibus nostra elit egestas. Velit proin. Velit magna. Donec curae nostra nulla.,http://lorempixel.com/300/300/people,Puerto Rojo|Angler's Corner|The Knoll at Blue Spruce Inlet,Sindy Koller,Hilda Hisey,2012-01-31 +4,http://lorempixel.com/300/300/people,2013-07-17,Ipsum fusce. Magna purus sit nunc a quis curae. Fusce magna cum adipiscing aptent ac placerat. Velit purus nibh non imperdiet curae ante neque semper ridiculus commodo consectetuer. Lorem massa commodo lacinia quis interdum a volutpat leo pretium turpis nam cursus. Magna proin auctor magna integer maecenas quis sociosqu metus. Lacus felis laoreet vitae est nunc neque. Ipsum etiam arcu hymenaeos id at elit pulvinar consequat dui lorem auctor accumsan.,http://lorempixel.com/300/300/people,Secluded Meadows|Partridge Park,Jo May,Venessa Mahmood,2013-04-21 +4,http://lorempixel.com/300/300/people,2012-01-27,Vitae augue dis nostra. Lacus etiam. Lacus metus magnis risus aliquet fusce posuere eget ad facilisi. Purus lacus elit nisl adipiscing venenatis ante pede elit. Vitae morbi nulla litora ac ornare. Curae metus. Morbi augue lacus nam sapien litora fusce tincidunt parturient. Justo felis erat turpis ut litora elit.,http://lorempixel.com/300/300/people,Angler's Meadows|The Villas of Dover Prairie,Janean Nordby,Monte Player,2012-01-13 +5,http://lorempixel.com/300/300/people,2012-09-14,Proin fusce. Metus ipsum eleifend ut massa ad luctus torquent condimentum accumsan. Neque morbi posuere dapibus litora cum taciti commodo sem. Curae netus montes turpis gravida pede eleifend litora semper cras eu. Vitae fusce. Felis metus per varius. Dolor metus litora senectus varius etiam venenatis justo. Fames vitae libero ligula hac.,http://lorempixel.com/300/300/people,Blue Spruce Crossing|The Crag at Weaver's Abbey|Avon Creek,Del Smithey,Irvin Hacker,2012-06-25 +1,http://lorempixel.com/300/300/people,2012-07-25,Proin metus. Velit risus inceptos risus non duis sodales ut vel. Lacus nulla. Magna ipsum nullam aptent leo quis tempor aptent magna curae rutrum et sit. Class velit lacus augue eleifend netus a varius habitasse curae. Lacus proin ridiculus dictumst morbi class phasellus. Etiam lorem quisque ante ad. Fames lorem.,http://lorempixel.com/300/300/people,Starling Outlook|Admiral's Island,Lili Scally,Yolanda Stlouis,2012-06-19 +1,http://lorempixel.com/300/300/people,2012-08-30,Fusce dolor ante a orci adipiscing montes ve curae sapien congue feugiat blandit auctor vel duis facilisis. Velit class urna. Lorem augue. Lacus netus senectus. Porta morbi platea fusce duis sed ridiculus nam sem posuere in. Risus ipsum lorem sit elit parturient elit risus ad. Lorem fames erat sociis vehicula. Lorem vitae nibh odio urna ipsum velit elit pede aliquet id.,http://lorempixel.com/300/300/people,Secluded View|Bedwyn Cottages,Tomika Shimer,Charla Fox,2012-06-13 +4,http://lorempixel.com/300/300/people,2013-06-13,Vitae donec aliquam ve inceptos. Felis dolor varius nibh pellentesque volutpat curae nam. Metus netus sodales sit eu libero. Fusce class magnis fermentum velit in ornare. Dolor ipsum a pede fusce in elementum scelerisque augue dictum. Fames morbi lorem netus aptent. Ipsum augue. Morbi etiam est.,http://lorempixel.com/300/300/people,Salisbury Mesa,Nila Styons,Kimber Moreman,2013-05-06 +4,http://lorempixel.com/300/300/people,2012-08-15,Fusce class inceptos id. Class morbi netus sociis ad et sed pede conubia eu erat elit. Magna class per nisl non. Magna massa cum nibh sit sed cum eni. Felis lorem. Massa ipsum magna aptent. Massa fusce. Massa curae litora dis cubilia et.,http://lorempixel.com/300/300/people,Mesa Nueva|Crab Pier,Hana Turnipseed,Hilary Giesen,2012-05-19 +3,http://lorempixel.com/300/300/people,2012-10-08,Morbi neque mauris penatibus cubilia pellentesque. Class lorem ullamcorper at taciti. Velit donec. Lorem morbi sodales conubia mattis. Etiam magna. Etiam purus. Felis augue per nascetur imperdiet. Morbi velit bibendum eu eget eu sollicitudin mauris ad.,http://lorempixel.com/300/300/people,The Valley at Navajo Chapel|Sunrise Mount|Tern Haven,Adriene Rizo,Krystle Huwe,2012-07-23 +3,http://lorempixel.com/300/300/people,2012-09-08,Purus proin dictum porta natoque imperdiet dictum ultricies auctor hymenaeos dapibus magnis enim ultricies. Porta magna nunc. Curae risus habitant augue a. Dolor porta magnis et libero a. Fames lorem dis magna lorem mattis velit inceptos. Morbi lacus congue. Massa augue gravida sociis fames vulputate. Porta fusce orci laoreet purus.,http://lorempixel.com/300/300/people,Valle Viejo,Josephine Mcauley,Clarice Ly,2012-08-29 +1,http://lorempixel.com/300/300/people,2012-07-17,Donec nulla elementum scelerisque netus mauris erat amet nam. Class neque suspendisse ve nostra posuere erat nullam et lorem. Neque velit neque dis quam vestibulum nam netus. Netus nulla pharetra hendrerit a hendrerit netus ve lectus a parturient. Velit augue scelerisque in nostra. Lacus felis proin mattis vestibulum etiam nisl lacus rutrum velit rhoncus. Purus ipsum praesent vestibulum libero. Curae purus mattis rutrum.,http://lorempixel.com/300/300/people,Thanksgiving Oaks,Jonah Newsom,Frankie Desantiago,2012-07-13 +2,http://lorempixel.com/300/300/people,2012-08-22,Velit curae eros. Velit fusce. Magna justo nisl facilisi risus commodo facilisi id ullamcorper. Purus felis cum nunc inceptos interdum purus ve. Dolor curae quisque ut justo fermentum. Class purus justo sit dapibus mi id eros sed. Porta curae congue ligula dictumst elementum consectetuer. Vitae class justo nisi lorem dolor faucibus curae in.,http://lorempixel.com/300/300/people,Puente Rojo|Moose Hearth|Seagull Landing,Adriene Rizo,Andree Kingman,2012-05-30 +5,http://lorempixel.com/300/300/people,2013-01-15,Proin massa eni. Magna metus vitae orci amet. Etiam risus a nonummy dictum. Augue fusce. Metus risus platea bibendum donec at turpis pede cras mollis in mus amet. Ipsum proin. Proin curae ultricies facilisi senectus mauris adipiscing consectetuer. Ipsum massa nec nisl id sollicitudin dictum taciti curabitur morbi.,http://lorempixel.com/300/300/people,Mar Blanco,Ellsworth Rehman,Leora Feinberg,2012-11-07 +5,http://lorempixel.com/300/300/people,2012-12-04,Etiam fames lorem congue imperdiet lorem diam accumsan nostra nullam penatibus. Netus felis nunc mollis lectus. Morbi nulla nunc in torquent per turpis vivamus integer feugiat sapien odio. Class purus odio vel est tincidunt taciti vitae massa mauris molestie lacinia. Porta metus nisi hac primis diam nam massa velit vitae fermentum cubilia. Fusce lacus. Metus netus cursus. Fusce morbi erat a porta aliquam suscipit ornare etiam feugiat primis eros facilisis ornare arcu.,http://lorempixel.com/300/300/people,Mermaid Firth,Gary Trostle,Sal Andujar,2012-10-08 +5,http://lorempixel.com/300/300/people,2012-10-18,Augue purus vel etiam parturient nonummy ante dictum at auctor sociosqu pede amet pretium sodales. Neque metus eni dui in. Vitae metus senectus amet auctor egestas taciti in porta tempor pellentesque aliquam bibendum dolor fames. Class lacus. Etiam neque dui duis accumsan maecenas id sociis nam turpis ultricies in mauris commodo. Proin fames dictum rutrum. Risus fames accumsan mi tempor. Justo netus cursus arcu eu fames pellentesque justo ut netus consectetuer porttitor aenean lobortis inceptos conubia.,http://lorempixel.com/300/300/people,Grizzly Harbor|The Streams at Moose View,Jo May,Sharri Dietrich,2012-08-29 +5,http://lorempixel.com/300/300/people,2012-02-10,Augue lorem metus aenean quis consectetuer. Dolor augue. Massa class. Neque justo turpis ultricies dapibus sollicitudin luctus in vulputate a. Lorem vitae augue. Felis nulla tempor. Metus porta pretium litora cras. Class fames non.,http://lorempixel.com/300/300/people,Angler's Bay|Welcome Lakes,Danyel Branstetter,,2012-02-08 +4,http://lorempixel.com/300/300/people,2013-07-02,Lorem proin cubilia taciti ve cum fermentum platea fames. Nulla curae dis proin egestas cum adipiscing vestibulum ac sociis molestie suspendisse molestie. Ipsum fusce mauris dolor maecenas ad ullamcorper. Augue morbi purus hac dui sem ac laoreet erat. Etiam velit litora pharetra congue conubia rhoncus nunc est. Donec neque tellus posuere viverra varius justo. Fames augue sed felis adipiscing et praesent. Morbi justo nonummy in.,http://lorempixel.com/300/300/people,Starling Springs|Dorset Grove|Moose Bay,Era Mustafa,Candie Warford,2013-04-24 +4,http://lorempixel.com/300/300/people,2013-05-16,Massa morbi. Curae fusce quam tempus parturient velit cras vulputate et tincidunt eget. Donec massa. Felis fusce. Lacus fames pretium convallis aenean congue cum accumsan aliquet potenti nonummy magnis felis. Curae augue. Neque lacus nec amet vivamus feugiat rutrum odio. Nulla neque auctor torquent pede senectus nam netus vitae urna purus.,http://lorempixel.com/300/300/people,Hawk Vale,Michal Blish,Evelyn Kier,2013-03-13 +1,http://lorempixel.com/300/300/people,2012-05-10,Porta etiam. Morbi lacus faucibus nisi cum conubia at luctus aenean. Magna morbi faucibus sem ve quam ipsum congue aenean per pede cum. Morbi dolor suspendisse interdum tristique a nam phasellus vitae at congue. Felis porta eget pede natoque nostra ornare elementum sem metus penatibus. Netus lacus vivamus habitasse. Netus lacus dictum magnis ridiculus donec lacinia pharetra. Lorem metus elit vivamus ut morbi suspendisse nisi orci urna id vel nibh sit.,http://lorempixel.com/300/300/people,South Prairie|Sioux Homestead|Placid Knoll,Carly Toro,Ivory Steigerwald,2012-04-08 +1,http://lorempixel.com/300/300/people,2012-05-14,Dolor lacus taciti fames non aenean sociosqu hac. Massa purus quisque montes. Lorem nulla lorem tellus proin laoreet eni. Lacus curae. Justo risus. Netus fusce nonummy ultricies quam vel porttitor morbi mi. Ipsum etiam lorem varius imperdiet congue id torquent leo ante duis hac a. Porta purus pede.,http://lorempixel.com/300/300/people,Leeward Reef,Buddy Herrod,Leslee Heard,2012-04-06 +1,http://lorempixel.com/300/300/people,2012-08-25,Metus dolor quisque vitae nec. Class risus odio hymenaeos fermentum neque ultrices. Class nulla sem duis parturient id lectus habitasse nonummy tellus sed. Donec etiam felis odio magnis lacinia erat ut. Felis augue erat turpis nullam torquent vestibulum aliquam nibh pellentesque. Velit neque. Dolor fusce quisque mi pharetra lacinia sodales. Purus vitae ligula augue blandit.,http://lorempixel.com/300/300/people,Salisbury Mesa|Owl Brook|Macaw Shore,Ling Mcmaster,Henriette Diedrich,2012-07-02 +2,http://lorempixel.com/300/300/people,2012-06-11,Class dolor dictum tellus. Metus lacus augue non orci dui sodales. Morbi metus. Nulla massa. Velit fusce luctus ullamcorper class taciti convallis interdum rutrum. Fusce etiam habitant ad. Lorem vitae morbi sociis mi cum fames viverra libero. Proin curae.,http://lorempixel.com/300/300/people,Secluded View|Bedwyn Cottages,Candice Vidrio,Charla Fox,2012-05-12 +4,http://lorempixel.com/300/300/people,2012-06-21,Etiam fusce placerat ut magna massa dapibus id convallis fusce sodales. Curae fames vulputate. Lacus velit aliquet. Etiam vitae erat sociis auctor ultrices felis augue sem cum. Neque magna ullamcorper mi taciti odio dapibus. Morbi vitae porta praesent mus viverra. Fusce massa morbi tempor mi. Proin etiam auctor sollicitudin venenatis felis erat a odio parturient litora sem.,http://lorempixel.com/300/300/people,Charming Acres|Leeward Cove|The Lakes at Royal Dunes,Tomika Shimer,Alex Groom,2012-05-23 +1,http://lorempixel.com/300/300/people,2012-01-28,Fusce ipsum praesent dui lorem quam rhoncus a ullamcorper. Netus morbi. Justo fames netus porta praesent at. Curae augue ligula. Curae felis. Risus fames. Fusce etiam cum ligula a adipiscing sit lacus taciti. Porta lorem.,http://lorempixel.com/300/300/people,Maple Ranch|The Point at Welcome Village|Passion Fruit Breakers,Gilda Puffer,Muoi Bays,2012-01-17 +2,http://lorempixel.com/300/300/people,2012-05-18,Class ipsum aenean risus placerat vestibulum tempor ve dignissim condimentum cum amet nam. Risus justo. Justo massa vivamus feugiat nunc torquent posuere natoque dictumst risus in tellus morbi. Augue massa proin placerat. Ipsum augue dapibus integer duis. Proin porta pede velit malesuada eget elit maecenas. Velit augue. Purus fames.,http://lorempixel.com/300/300/people,Inviting Forest|Leafy Glade|Weeping Willow Quarter,Marleen Venters,Joanie Beaver,2012-04-20 +3,http://lorempixel.com/300/300/people,2013-03-06,Class velit varius proin class vitae. Class etiam netus ullamcorper nisi imperdiet bibendum. Purus neque augue curabitur. Netus dolor ipsum dolor massa ipsum class dolor sed duis. Velit felis vel elit nibh. Massa etiam facilisis eni metus non cras. Magna justo a dapibus id sit orci erat. Justo massa auctor lacus sociosqu nam.,http://lorempixel.com/300/300/people,Catamaran Lagoon,Janean Nordby,Myrta Leftwich,2013-01-28 +2,http://lorempixel.com/300/300/people,2013-04-01,Velit purus semper class non bibendum a maecenas cras. Fames magna quam ve varius donec conubia. Porta risus velit dapibus et convallis a habitasse lorem hac duis. Purus netus hac augue dui duis ac elementum netus at nam consequat. Ipsum class. Fusce class integer nostra arcu ac purus tellus. Netus purus per nibh arcu lorem class donec felis scelerisque. Donec dolor dis cras ante.,http://lorempixel.com/300/300/people,Willow Meadows|The Cove at Maple Terrace|The Firth of Peaceful City,Tarra Hubbert,Lesli Mcdonnell,2013-02-09 +5,http://lorempixel.com/300/300/people,2012-11-27,Fames magna nibh integer eu non elit ut consectetuer aliquet velit. Augue justo auctor fusce parturient potenti eget ve pellentesque nonummy lacus magna euismod tempus eros. Purus massa risus dignissim eget sodales. Porta lorem euismod. Donec netus curabitur risus suscipit mus mi morbi per rutrum nonummy arcu sem velit. Donec lacus morbi netus lacinia elit ut velit in magnis. Fames magna cum magnis quisque aliquet ipsum egestas dignissim. Lorem velit ultrices arcu mus dictum.,http://lorempixel.com/300/300/people,Cambridge Ridge|Lazy Butte,Buddy Herrod,Glennie Borrero,2012-09-22 +1,http://lorempixel.com/300/300/people,2013-03-14,Fusce porta tincidunt lacinia ipsum at ve tempus ligula. Felis vitae volutpat curabitur aenean. Morbi purus. Porta class. Class neque class nisi ve justo fermentum. Fames curae sed nunc egestas tincidunt amet. Morbi vitae euismod metus quis rhoncus eget ad elit primis justo in ligula suscipit. Massa nulla dui nunc est euismod id leo fames.,http://lorempixel.com/300/300/people,Lazy Bay|Goose Vineyard|Regal Park,Era Mustafa,Kirsten Buchholtz,2013-03-07 +4,http://lorempixel.com/300/300/people,2012-02-11,Curae nulla pede mus arcu lorem ve. Proin dolor potenti in mattis ridiculus faucibus eu scelerisque duis. Fames porta posuere eget odio fusce. Felis augue sem parturient class enim ante. Fames lorem euismod nibh leo. Porta neque porta arcu libero urna suspendisse nam ve consectetuer cras. Velit proin ligula ve rutrum a adipiscing dui etiam convallis consequat adipiscing. Curae lacus pede montes dictum enim sodales ad dictum ut.,http://lorempixel.com/300/300/people,Spruce Ridge|Gentle Quarter,Marnie Kemble,Letha Lehto,2012-01-09 +2,http://lorempixel.com/300/300/people,2012-09-05,Risus etiam rutrum adipiscing sollicitudin posuere nunc. Risus dolor amet mi justo id. Dolor donec nibh curabitur pharetra ve. Porta risus conubia pede habitant vel neque sapien lobortis molestie ipsum consectetuer senectus lorem mi consectetuer. Risus morbi. Massa curae cum eros. Nulla augue condimentum sociosqu duis. Etiam vitae.,http://lorempixel.com/300/300/people,Graceful Lagoon|Admiral's Island|Madera Azul,Sharlene Chappell,Marget Lehn,2012-08-28 +2,http://lorempixel.com/300/300/people,2012-12-30,Justo curae feugiat ac blandit enim et. Morbi risus velit a laoreet. Nulla augue nisl iaculis eget accumsan condimentum nam taciti. Velit netus condimentum dui amet sed iaculis lacus per urna curabitur. Felis dolor a egestas ad molestie commodo mollis. Netus ipsum scelerisque dis varius nibh. Etiam lacus congue auctor. Proin vitae sem nisl potenti aliquam tincidunt libero adipiscing.,http://lorempixel.com/300/300/people,Birch Vista,Nila Styons,Tara Johnsrud,2012-12-10 +3,http://lorempixel.com/300/300/people,2013-02-05,Massa proin magna nullam lorem scelerisque. Proin neque urna vulputate aptent faucibus inceptos aptent cras fermentum sollicitudin iaculis fusce. Nulla ipsum tellus netus adipiscing ullamcorper tempor id nascetur lacinia. Donec netus habitasse arcu. Etiam proin metus semper ve. Curae risus. Felis netus. Curae nulla lectus auctor ac eleifend quisque ipsum.,http://lorempixel.com/300/300/people,Salisbury Mesa,Vikki Rufus,Kimber Moreman,2013-01-06 +3,http://lorempixel.com/300/300/people,2013-01-29,Porta ipsum commodo viverra. Justo lacus. Metus risus aenean interdum per. Curae morbi. Etiam metus donec ridiculus nonummy duis adipiscing elementum velit interdum lorem egestas. Curae augue mauris pharetra ridiculus a est. Massa metus magnis tellus risus quam fames. Curae magna nam.,http://lorempixel.com/300/300/people,Regal Estates,Ellsworth Rehman,Shizue Sadberry,2013-01-17 +1,http://lorempixel.com/300/300/people,2012-12-08,Netus fusce donec a pretium mi in nibh turpis non gravida in. Neque donec. Ipsum porta donec hac quam nec arcu cursus parturient vitae rhoncus integer ultrices libero. Lacus donec. Ipsum metus commodo est adipiscing vestibulum mi rutrum eni vivamus eu. Class magna facilisi mus egestas eleifend tellus interdum gravida nulla arcu vivamus massa. Lacus fames dictum nullam dis tortor. Proin nulla nisi in amet.,http://lorempixel.com/300/300/people,Magnolia Oaks|Kissing Highlands|Guava Sands,Marnie Kemble,Anh Hermanson,2012-12-05 +1,http://lorempixel.com/300/300/people,2012-09-26,Proin fames. Dolor risus enim augue feugiat lobortis auctor ipsum habitasse. Fames class. Neque proin duis elementum pharetra in. Velit felis primis auctor dolor blandit dictum. Netus class fames sit nulla non amet lacus. Magna justo accumsan magna sit urna odio urna. Fusce metus lacus varius ad accumsan.,http://lorempixel.com/300/300/people,Wandering Lakes|Aloha Beach,Venessa Scull,Lisha Belser,2012-07-24 +1,http://lorempixel.com/300/300/people,2012-05-06,Lacus morbi sagittis augue tincidunt parturient dis vestibulum. Vitae velit libero ve accumsan egestas iaculis ultricies. Morbi massa pretium ridiculus molestie. Felis morbi dolor ipsum platea at nostra taciti ad tempor justo. Fames netus etiam a duis nulla. Proin fames leo augue litora consectetuer. Felis augue hac neque nunc lacus tincidunt. Proin velit senectus velit a nostra nisi mi cras.,http://lorempixel.com/300/300/people,Wakefield Vale,Iona Lisenby,Monika Han,2012-03-12 +1,http://lorempixel.com/300/300/people,2013-01-20,Massa netus odio tempor. Lorem netus turpis mattis penatibus nascetur tellus nisl condimentum nonummy consectetuer lectus platea neque. Proin fames vel vehicula fermentum ultrices. Magna augue sodales at. Velit lorem est tristique. Ipsum class netus quam donec laoreet erat. Neque augue neque cras. Etiam lacus duis ipsum sapien primis.,http://lorempixel.com/300/300/people,Puente Rojo|Moose Hearth|Seagull Landing,Tomika Shimer,Andree Kingman,2012-12-05 +5,http://lorempixel.com/300/300/people,2012-09-02,Netus nulla eni amet. Dolor vitae lectus. Massa neque eros in. Risus neque sagittis cras nec cubilia ve nascetur gravida suscipit odio feugiat. Massa justo maecenas risus. Fusce ipsum elit hac amet sollicitudin vestibulum nisi proin integer. Ipsum curae nisi rhoncus. Fusce etiam tortor pede condimentum cubilia.,http://lorempixel.com/300/300/people,The Knoll at Inviting Downs|Aloha Dunes|Tamarind Harbor,Sharan Fucci,Jarvis Nazario,2012-07-29 +4,http://lorempixel.com/300/300/people,2012-08-18,Metus etiam. Felis class egestas laoreet primis odio lectus vivamus commodo duis class quisque. Metus augue sem pede elementum sem arcu enim euismod fames in inceptos nibh ve duis. Justo proin sociosqu eros id orci ridiculus. Netus donec interdum porta blandit rhoncus mattis. Curae proin nisl hymenaeos ac fermentum morbi eget a lorem dapibus turpis nisi. Neque metus suspendisse nisi arcu vel. Felis morbi dictumst lorem in platea integer nibh nisl molestie tristique.,http://lorempixel.com/300/300/people,Bedwyn Anchorage|Toucan Gulf,Lucinda Stracener,Dagny Darlington,2012-07-22 +5,http://lorempixel.com/300/300/people,2012-07-02,Class augue est neque nam arcu erat conubia. Porta dolor aptent consequat maecenas erat. Ipsum massa cras suspendisse et sociis nam ornare fusce nullam massa ac nisi. Risus felis inceptos porta magna hymenaeos platea a adipiscing sem adipiscing vestibulum. Lacus augue magnis congue vehicula nunc amet dolor diam urna mollis. Porta fames nulla pulvinar mus. Lorem purus a tempus phasellus hendrerit eros suspendisse eni nisl adipiscing eros nullam eu. Felis purus mauris malesuada ad.,http://lorempixel.com/300/300/people,Mermaid Firth,Iona Lisenby,Sal Andujar,2012-05-20 +4,http://lorempixel.com/300/300/people,2012-12-04,Fames purus mus accumsan. Purus lacus eget gravida per sagittis quisque pede duis consequat aptent augue class rhoncus diam adipiscing erat phasellus duis sem. Augue neque lectus lacus metus diam. Dolor lorem mollis diam. Velit dolor facilisi risus arcu lacinia elit quam risus blandit massa. Class vitae ipsum primis ve erat egestas nunc per proin blandit hymenaeos eros. Massa magna placerat amet per cubilia. Neque justo.,http://lorempixel.com/300/300/people,Sandpiper Quay,Danette Giltner,Sherly Lembo,2012-11-28 +1,http://lorempixel.com/300/300/people,2012-05-05,Magna class mus pede nam rhoncus. Metus porta ligula quis convallis tincidunt fames ligula suscipit ullamcorper interdum. Curae neque commodo aenean massa sed enim varius cubilia eros et ipsum amet ve quam vehicula phasellus fusce. Porta fames maecenas eu justo taciti. Velit risus. Nulla fames. Netus massa aptent donec faucibus mi massa eu proin nibh volutpat habitant vivamus in eget augue massa. Etiam velit.,http://lorempixel.com/300/300/people,Lazy Bay|Goose Vineyard|Regal Park,Lecia Harling,Kirsten Buchholtz,2012-02-11 +1,http://lorempixel.com/300/300/people,2012-09-13,Proin fusce. Felis risus netus. Velit nulla felis duis ve orci tellus fermentum ipsum. Donec metus. Magna netus. Lacus velit dui rhoncus cras. Proin metus dui magna gravida phasellus cras dis dolor ipsum donec. Felis etiam.,http://lorempixel.com/300/300/people,Papaya Strand,Houston Walborn,Tory Schuster,2012-07-06 +2,http://lorempixel.com/300/300/people,2013-05-20,Curae dolor nisl commodo enim quis interdum. Fames risus. Metus neque ornare metus diam nisi mollis tempor mi rutrum quam id sollicitudin. Nulla justo luctus diam ullamcorper vel. Massa donec diam placerat volutpat class massa laoreet eget. Fusce etiam felis vel magna facilisis cubilia per et sollicitudin aliquam nec lobortis. Augue class. Fames dolor.,http://lorempixel.com/300/300/people,Pueblo Nuevo,Larue Gay,Marilynn Shier,2013-02-20 +3,http://lorempixel.com/300/300/people,2013-06-28,Nulla lorem etiam ultricies faucibus. Etiam lorem est odio cum varius magna suscipit. Magna justo. Metus dolor eros class aliquam mollis est taciti augue massa tincidunt aenean. Fusce nulla netus hac per eu montes quam duis. Nulla fames egestas justo amet a ante adipiscing sit neque fames tempus orci sollicitudin. Proin metus dolor suspendisse lobortis consequat eleifend at est. Donec dolor sapien eu.,http://lorempixel.com/300/300/people,Weaver's Butte|Kelp Gulf|American Inlet,Seymour Bollig,Shara Lamonica,2013-04-09 +2,http://lorempixel.com/300/300/people,2012-05-24,Lacus felis curabitur tincidunt porta curabitur. Justo netus dis commodo lacus at dictum porta. Class felis curae cras ut. Augue etiam nisi sit metus amet taciti litora. Velit curae tortor in eros tincidunt ac ultricies proin ligula habitant ve suspendisse. Vitae proin aenean fames. Fusce netus tempor purus tellus. Metus ipsum luctus mollis amet.,http://lorempixel.com/300/300/people,Pueblo Norte,Maryann Brunk,Saturnina Somma,2012-03-31 +5,http://lorempixel.com/300/300/people,2013-02-17,Neque porta urna ac nisi senectus vehicula. Fames fusce aenean fusce pede velit lectus dolor suspendisse ac tellus posuere in diam curae condimentum bibendum neque. Magna lacus mattis mi arcu dictum mi placerat viverra tortor. Fusce lorem nulla eget sociosqu laoreet. Justo lorem primis dis aptent a parturient. Curae felis praesent convallis in penatibus vestibulum nibh aenean ad ve quam. Metus risus. Augue vitae.,http://lorempixel.com/300/300/people,Walnut Streams|Oak Haven|Iroquois Vineyard,Willena Acoff,Tonie Pille,2012-12-12 +2,http://lorempixel.com/300/300/people,2012-03-24,Vitae metus donec egestas eu ve per. Etiam metus diam sociosqu nam. Risus velit. Vitae justo. Etiam lorem lobortis. Morbi metus sagittis ante hymenaeos ut ve platea. Netus etiam mollis at nunc in. Curae porta nostra.,http://lorempixel.com/300/300/people,Salisbury Mesa,Reiko Oppenheimer,Kimber Moreman,2012-02-04 +2,http://lorempixel.com/300/300/people,2012-12-09,Curae metus. Fusce augue aliquam tristique pede cubilia tristique turpis. Class dolor quam at porta malesuada ante per quisque enim elit placerat tellus. Felis magna platea vestibulum netus orci hendrerit pharetra quis sed ridiculus. Netus morbi auctor. Lorem augue metus congue dolor leo vulputate cursus a. Justo velit bibendum magna rhoncus semper eni erat parturient. Nulla etiam felis mus parturient tempus risus eu libero porttitor augue sapien sit.,http://lorempixel.com/300/300/people,Porpoise Breakwater,Hana Turnipseed,Bea Midgley,2012-10-22 +4,http://lorempixel.com/300/300/people,2012-02-12,Lacus lorem vel pretium id sagittis nibh hendrerit sollicitudin parturient eros. Dolor fames etiam tempus pharetra ligula amet fusce. Felis lacus dui class. Magna netus. Justo nulla iaculis maecenas. Justo class. Etiam nulla elit pulvinar parturient litora. Lorem metus dis dui cum ut vitae felis lacinia maecenas.,http://lorempixel.com/300/300/people,Banana Anchorage|Rancho Blanco,Buddy Herrod,Rebbecca Friedlander,2012-01-14 +4,http://lorempixel.com/300/300/people,2013-02-09,Vitae proin tempor eleifend fringilla mi libero aliquam at quis at curae. Risus dolor convallis condimentum vel luctus est et donec. Lacus lorem a aliquam et nisl pretium velit nisl ad cras proin fringilla nec pellentesque donec. Fames purus dis hac per. Risus purus. Felis proin sit leo nam dis porttitor tellus pharetra nibh tincidunt mus sollicitudin nulla. Proin fusce risus viverra porta erat morbi ve convallis augue ve eget. Fusce dolor ullamcorper vel ante consectetuer eu lorem felis varius ligula.,http://lorempixel.com/300/300/people,Cypress Highlands,Allie Hance,Parker Foltz,2013-01-28 +1,http://lorempixel.com/300/300/people,2012-08-24,Curae fames nullam consectetuer aliquet torquent rutrum dictum morbi nec felis. Felis risus. Massa dolor enim fames magna diam inceptos a consectetuer duis feugiat ad. Metus etiam. Purus donec. Class augue mattis imperdiet porta a dictum pede sollicitudin at iaculis ad quis aliquet et mi. Neque lorem tempus ad mi eu ve. Morbi magna dignissim.,http://lorempixel.com/300/300/people,The Inlet of Thanksgiving Downs|Guava Harbor,Aja Hesler,Lionel Hellen,2012-08-14 +3,http://lorempixel.com/300/300/people,2013-02-11,Lorem porta eni proin ridiculus condimentum tristique. Nulla metus. Porta netus nulla. Morbi metus suspendisse bibendum quam eni duis elit ut tellus etiam parturient ullamcorper. Magna lorem congue in senectus. Metus massa sagittis ante cum proin penatibus senectus fusce. Ipsum justo odio in vehicula. Curae nulla.,http://lorempixel.com/300/300/people,Secluded Meadows|Partridge Park,Tonya Mcentee,Venessa Mahmood,2012-12-09 diff --git a/initial_data/property_names.txt b/initial_data/property_names.txt new file mode 100644 index 0000000..98216ee --- /dev/null +++ b/initial_data/property_names.txt @@ -0,0 +1,603 @@ + Acacia Streams + Acacia Terrace + Acacia Valley + Admiral's Delta + Admiral's Gulf + Admiral's Island + Admiral's Reef + Aloha Beach + Aloha Cove + Aloha Dunes + American Chapel + American Inlet + American Woods + Anchor Firth + Angler's Bay + Angler's Corner + Angler's Meadows + Antelope Acres + Arapahoe Acres + Arapahoe Inlet + Ash Dale + Ash Gulf + Ash Manor + Ash Woodlands + Autumn Overlook + Autumn Timbers + Avocado Delta + Avocado Waves + Avon Creek + Axbridge Homestead + Axminster Crag + Azalea Glen + Azalea Overlook + Banana Anchorage + Banana Breakers + Banana Dunes + Banana Firth + Banana Haven + Banana Landing + Banana Reef + Banyan Bay + Banyan Inlet + Banyan Lagoon + Banyan Pier + Baschurch Sanctuary + Bear Mount + Bear Promontory + Beaver Heights + Beaver Hills + Bedwyn Anchorage + Bedwyn Cottages + Beverley View + Bighorn Villas + Birch Estates + Birch Heights + Birch Vista + Bluejay Crossing + Blue Spruce Crossing + Breadfruit Bay + Breadfruit Cliffs + Breezy Inlet + Brideport Commons + Bridgwater Haven + Bridgwater Leap + Buckingham Inlet + Buckingham Mesa + Buffalo Orchards + Cambridge Ridge + Captain's Beach + Carlisle Summit + Castle Rock + Castleton Gulf + Catamaran Coast + Catamaran Lagoon + Charming Acres + Charming Dale + Chelsea Boulder + Cherokee Fields + Cherokee Rock + Cherry Acres + Cherry Harbor + Chester Estates + Chippewa Promontory + Choctaw Canyon + Choctaw Rock + Ciudad Grande + Ciudad Verde + Corbridge City + Corbridge Creek + Corbridge Haven + Cormorant Harbor + Cornwall Haven + Cougar Heath + Cougar Woods + Crab Island + Crab Pier + Crystal Abbey + Crystal Crag + Crystal Firth + Cypress Brook + Cypress Highlands + Cypress View + Darling Valley + Deer Downs + Deer Terrace + Dolphin Landing + Dorset Gardens + Dorset Grove + Dove Vale + Durham Cove + Dusky Lagoon + Dusky Vineyard + Evergreen Crag + Evergreen Grove + Evergreen Summit + Exeter Estates + Fairford Terrace + Falcon Forest + Firefly Knoll + Firefly Terrace + Fireside Anchorage + Fireside Firth + Fireside Knoll + Fireside Valley + Fisherman's Promontory + Flamingo Bay + Flamingo Delta + Flamingo Gulf + Flamingo Haven + Flamingo Shore + Flamingo Waves + Fox Anchorage + Fox Harbor + Fox Hills + Friendly Chapel + Gazelle Gulf + Gazelle Springs + Gentle Quarter + Golden Butte + Golden Crag + Golden Haven + Golden Leap + Golden View + Goose Estates + Goose Vineyard + Graceful Cove + Graceful Lagoon + Graceful Villas + Greater Island + Greater Quarter + Grizzly Harbor + Guava Bay + Guava Delta + Guava Harbor + Guava Haven + Guava Reef + Guava Sands + Gull Coast + Hawk Ranch + Hawk Vale + Herefordshire Gardens + Heron Bay + Heron Waves + Hexham Dunes + Holly Corner + Holly Forest + Hummingbird Rock + Hunter Creek + Hunter Downs + Inviting Bluff + Inviting Forest + Inviting Hills + Iroquois Bluff + Iroquois Gardens + Iroquois Leap + Iroquois Vineyard + Justice Prairie + Kelp Gulf + Kelp Landing + Kestrel Harbor + Kingsbridge Island + Kissing Canyon + Kissing Cave + Kissing Highlands + Lancashire Heath + Laughing Island + Laughing Vale + Lazy Bay + Lazy Butte + Lazy Crossing + Lazy Vineyard + Leafy Glade + Leafy Prospect + Leeward Cove + Leeward Reef + Leeward Shore + Liberation Outlook + Liberty Corner + Liberty Glade + Lighthouse Coast + Lonely Homestead + Lovely Corner + Lovely Farms + Lovely Knoll + Lychee Gulf + Lychee Landing + Lynx Mount + Macaw Anchorage + Macaw Bay + Macaw Firth + Macaw Island + Macaw Reef + Macaw Shore + Macaw Waves + Madera Azul + Madera Buena + Madera Grande + Madera Larga + Madera Roja + Magnolia Dunes + Magnolia Highlands + Magnolia Leap + Magnolia Mount + Magnolia Oaks + Magnolia Springs + Manatee Coast + Mango Firth + Mango Haven + Mango Sands + Mango Waves + Maple Farms + Maple Inlet + Maple Ranch + Mar Bajo + Mar Blanco + Mar Bonita + Mariner Firth + Mar Nueva + Mar Verde + Mermaid Firth + Mesa Alta + Mesa Buena + Mesa Coneja + Mesa Gorda + Mesa Larga + Mesa Nueva + Mesa Verde + Mild Grove + Mild Hills + Mild Meadows + Moose Bay + Moose Crest + Moose Hearth + Moose Vale + Moya Pier + Muskrat Prospect + Mussel Breakwater + Myna Cliffs + Myna Haven + Myna Shore + Navajo Heath + Navajo Lagoon + Navajo Streams + Newcastle Parish + Oak Haven + Oak Orchards + Oak Park + Oak Rise + Opportunity Butte + Opportunity Villas + Oriole Valley + Otter Highlands + Otter Rise + Owl Brook + Oyster Bay + Oyster Waves + Palm Bay + Palm Hollow + Palm Island + Palm Parish + Palm Suburb + Panda Vale + Papaya Strand + Parrot Dunes + Parrot Firth + Parrot Inlet + Partridge Estates + Partridge Park + Partridge Station + Paso Nuevo + Paso Rojo + Paso Verde + Passion Fruit Breakers + Passion Fruit Landing + Passion Fruit Quay + Passion Fruit Strand + Peaceful Crossing + Peaceful Farms + Peaceful Hollow + Peaceful Rock + Pelican Waves + Perigrine Haven + Pickering Meadows + Pilot Dunes + Pilot Pier + Pineapple Breakers + Pineapple Cove + Pine Boulder + Pine Creek + Pine Dale + Pine View + Placid Junction + Placid Knoll + Playa Alta + Playa Blanca + Playa Real + Playa Redonda + Pleasant Parish + Plymouth Cave + Plymouth Firth + Pomegranate Cove + Pomegranate Island + Poplar Abbey + Poplar Crest + Poplar Highlands + Porcupine Farms + Porpoise Breakers + Porpoise Breakwater + Porpoise Quay + Pueblo Bajo + Pueblo Norte + Pueblo Nuevo + Pueblo Redondo + Puente Alto + Puente Bajo + Puente Mariposa + Puente Rojo + Puerto Bajo + Puerto Bueno + Puerto Conejo + Puerto Largo + Puerto Redondo + Puerto Rojo + Quail Abbey + Quail Prairie + Queensborough City + Raccoon Homestead + Rambling Timbers + Rambutan Bay + Rambutan Dunes + Rambutan Pier + Rambutan Waves + Rancho Blanco + Rancho Bonito + Rancho Bueno + Rancho Grande + Regal Estates + Regal Harbor + Regal Park + Reindeer Inlet + Royal Abbey + Royal Vineyard + Sailor's Firth + Salisbury Firth + Salisbury Mesa + Sandpiper Pier + Sandpiper Quay + Sandpiper Strand + Sandy Haven + Seaford Inlet + Seagull Firth + Seagull Landing + Seagull Sands + Seagull Waves + Sea Lion Cliffs + Sea Lion Shore + Sea Spray Breakers + Secluded Inlet + Secluded Manor + Secluded Meadows + Secluded Ridge + Secluded View + Shady Anchorage + Shady Pasture + Shark Beach + Sierra Azul + Sierra Baja + Sierra Blanca + Sierra Grande + Sioux Colony + Sioux Cottages + Sioux Homestead + Sioux Promontory + Songbird Crossing + Songbird Parish + Songbird Prairie + Songbird Vale + South Hills + South Prairie + Spinnaker Beach + Spring Boulder + Spring Sanctuary + Spring Streams + Spruce Ridge + Squirrel Villas + Stafford Suburb + Starfish Gulf + Starfish Lagoon + Starfish Shore + Starling Outlook + Starling Springs + Stork Haven + Sunrise Mount + Sunrise Terrace + Sunset Bay + Sunset Butte + Sussex Grove + Sweet Crest + Sweet Knoll + Sweet Summit + Tamarind Cliffs + Tamarind Harbor + Tamarind Haven + Tamarind Pier + Tamarind Quay + Tanager Rock + Tanager Vale + Tern Coast + Tern Haven + Tern Inlet + Thanksgiving Cove + Thanksgiving Oaks + The Abbey of Hunter Lakes + The Acres at Inviting Timbers + The Acres at Leafy Ridge + The Bay at Sioux Sanctuary + The Bluff at Bear Meadows + The Brook of Axbridge Bluff + The Brook of Otter Fields + The Butte at North Forest + The Cave at Pleasant Commons + The Chapel at Palm Hearth + The Chapel at Tanager Mount + The Chapel at West Anchorage + The City at Chippewa Creek + The City at Freedom Dale + The City at Hummingbird Heath + The City at Hunter Bay + The City at Spruce Ridge + The Commons at Cougar Outlook + The Corner at Gentle Crag + The Corner at Summer Meadow + The Cottages at Blue Spruce Glade + The Cove at Maple Terrace + The Cove at Whaler's Prospect + The Crag at Weaver's Abbey + The Crossing at Dusky Oaks + The Crossing at Lonesome Village + The Dale at Antelope Quarter + The Downs at Weeping Willow Woods + The Dunes at Azalea Prospect + The Estates at Old Orchards + The Estates at Spruce Brook + The Farms at Antelope Heath + The Farms at Castle Hills + The Farms at Plymouth Vineyard + The Fields at Azalea Point + The Fields at Freedom Bluff + The Firth at Hummingbird Meadows + The Firth of Peaceful City + The Forest at Essex Knoll + The Gardens at Essex Forest + The Gardens at Gentle Cave + The Gardens of Azalea Glen + The Glen at Blue Spruce Park + The Glen at Holly Junction + The Gulf of Golden Grove + The Harbor at Fireside Promontory + The Haven at Antelope Junction + The Heath at Lonely Dunes + The Heath at Old Valley + The Highlands at Choctaw Parish + The Highlands of Wooded Streams + The Hills at Poplar Summit + The Homestead at Summer Promontory + The Inlet at Oak Vale + The Inlet of Thanksgiving Downs + The Junction at Avon Farms + The Knoll at Blue Spruce Inlet + The Knoll at Inviting Downs + The Knoll of Cherokee Junction + The Lagoon at Cherry Parish + The Lagoon of Elk Oaks + The Lakes at Laughing Promontory + The Lakes at Royal Dunes + The Leap at Lazy Sanctuary + The Meadow at Private Abbey + The Meadows of Secluded Knoll + The Oaks at Bridgwater Vineyard + The Oaks at Firefly Quarter + The Orchards at Bison Glade + The Orchards at Lonesome Station + The Outlook at Andover Orchards + The Outlook at Newbury Glade + The Overlook at Birch Quarter + The Overlook at Cypress Suburb + The Overlook at Evergreen Harbor + The Parish at Cypress Hearth + The Park at Dusky Park + The Park at Liberty Acres + The Park at Sweet Vista + The Park of Lovely Highlands + The Point at Holly Estates + The Point at Hunter Pasture + The Point at Queensborough Crag + The Point at Welcome Village + The Prairie of Thanksgiving Gulf + The Promontory at Greater Homestead + The Promontory at Maple Hearth + The Promontory at South Park + The Promontory of Darling Lagoon + The Quarter at Breezy Timbers + The Quarter at Buckingham Cove + The Quarter at Dusky Chapel + The Ranch at Cypress Anchorage + The Ridge at Fireside Gulf + The Ridge at Old Meadows + The Ridge at Sweet Mesa + The Rise of Leafy Parish + The Rock at Liberty Inlet + The Sanctuary at Hastings Point + The Sanctuary at Lonely Timbers + The Springs at Summer Villas + The Streams at Birch Overlook + The Streams at Leafy Rise + The Streams at Moose View + The Streams at Plymouth Ranch + The Suburb at Evergreen Village + The Timbers at Lonesome Mesa + The Timbers of Birch Park + The Vale at Evergreen Junction + The Valley at Navajo Chapel + The View at Cherokee Orchards + The Village at Bear Firth + The Village at Queensborough Gardens + The Villas at Choctaw Fields + The Villas at Iroquois Timbers + The Villas at Sheffield City + The Villas of Dover Prairie + The Vineyard at Bobcat Woods + The Vista at Lovely Lagoon + The Vista of Private Dunes + The Woods of Crystal Cove + Toucan Cove + Toucan Gulf + Toucan Island + Treasure Cliffs + Treasure Firth + Treasure Haven + Treasure Reef + Valle Grande + Valle Largo + Valle Mariposa + Valle Real + Valle Viejo + Vista Fresca + Wakefield Vale + Walnut Corner + Walnut Crag + Walnut Knoll + Walnut Streams + Walrus Breakers + Walrus Cliffs + Wandering Hills + Wandering Lakes + Wandering Vineyard + Warwick Oaks + Weaver's Butte + Weeping Willow Highlands + Weeping Willow Parish + Weeping Willow Quarter + Welcome Lakes + Wessex Vale + West Oaks + West Pasture + Whaler's Cove + Whaler's Farms + Whaler's Rock + Whaler's Timbers + Whistling Crest + Whistling Heath + Whistling View + Willow Bluff + Willow Downs + Willow Meadows + Windsor Overlook + Windsor Summit + Windward Beach + Wolf Haven + Wooded Butte + Wooded Pasture + Wooded Point + Wooded Valley diff --git a/initial_data/user_names.txt b/initial_data/user_names.txt new file mode 100644 index 0000000..dcaa2b5 --- /dev/null +++ b/initial_data/user_names.txt @@ -0,0 +1,600 @@ +Dyan Shay +Hazel Hume +Bea Midgley +Yang Brosnan +Venita Tucci +Aracely Miceli +Elza Gapinski +Merrilee Holz +Ronni Maudlin +Yanira Greb +Edwin Leight +Sherita Boley +Sharleen Mannix +Viva Fulmore +Eilene Delamora +Rebbecca Friedlander +Sharri Hunsucker +Ramon Coplin +Linsey Farris +Lisabeth Mcmiller +Augustine Failla +Lakesha Venable +Stefany Mohr +Lesa Rasmus +Letha Lehto +Glendora Kobayashi +Lisha Belser +Muoi Bays +Rolando Bjornson +Cora Daoust +Leslee Heard +Guy Lewter +Garry Thrall +Kimberli Minelli +Raphael Mcgovern +Eufemia Bohler +Kandace Schon +Conception Trickey +Yolanda Stlouis +Yuonne Crist +Jong Italiano +Jacalyn Risinger +Tamar Brackman +Gilda Puffer +Catherina Entrekin +Trista Provencal +Kassandra Gilpin +Cecille Ambrose +Floretta Kowalsky +Tarra Hubbert +Maxie Hollifield +Coy Berg +Valarie Macbeth +Elia Kelsch +Hilda Wayt +Qiana Lindenberg +Paulene Saia +Kathyrn Waterbury +Vikki Rufus +Henriette Diedrich +Tobie Day +Kenda Scarboro +Evangelina Agular +Hortencia Phelps +Alysha Lococo +Altha Ahumada +Celinda Luis +Jone Mays +Lyla Goodrow +Kristine Calvo +Ling Mcmaster +Byron Cleaver +Patria Marker +Lesli Mcdonnell +Kimber Moreman +Cyndy Summitt +Corrin Delnero +Cinderella Laber +Clark Groce +Carlee Tseng +Elyse Mollett +Grayce Vonderheide +Marilynn Shier +Thora Meeker +Kati Coury +Kira Broe +Alessandra Yoshimura +Elicia Melecio +Beatrice Kinne +Laurinda Franson +Breanne Mccurley +Georgann Caffrey +Kemberly Lecuyer +Aron Tellez +Lovie Nettles +Buddy Herrod +Viva Hacker +Tracie Spraggs +Sirena Holquin +Charlott Rondeau +Evan Aumann +Candice Vidrio +Colene Belizaire +Malika Waiters +Mavis Schramm +Carin Voegele +Kayleigh Mullins +Elias Poch +Dorla Postell +Judi Meneses +Dorathy Laney +Hilary Giesen +Carmel Gomer +Kati Opitz +Myrta Leftwich +Monte Player +Nikole Frum +Kirsten Buchholtz +Doloris Basden +Elma Weatherholt +Saundra Crigger +Carly Toro +Jackqueline Malagon +Lonnie Rye +Samara Tremble +Min Lin +Ellis Rohloff +Maryann Brunk +Audie Defelice +Nancie Keppler +Contessa Venable +Bonnie Loveland +Tomika Shimer +Napoleon Gleaves +Rachell Lenzen +Bud Carrow +Evelyn Kier +Gabrielle Derksen +Paulita Tagle +Alfonzo Blanke +Alejandra Pullin +Silvia Miranda +Danyel Branstetter +Glennis Fava +Shawnee Yager +Lida Bro +Joleen Gall +Dawna Vales +Aura Gershman +Elijah Fairbanks +Kip Almeida +Amos Hollis +Mariam Higuera +Latarsha Torres +Mohammed Stobaugh +Blaine Sevin +Almeda Hulen +Aletha Tonkin +Janina Delara +Del Smithey +Marisa Coyle +Lurline Nickols +Jacque Behm +Sandie Misiewicz +Marvis Ketelsen +Starr Gosse +Yung Melton +Larry Wold +Teresita Remy +Darius Gayton +Tonette Moos +Camelia Gabaldon +Timika Majors +Linn Rideout +Tonie Pille +Michal Blish +Otto Fu +Ellsworth Mecham +Irvin Hacker +Jamison Honaker +Cortney Cobble +Arianne Ebarb +Vern Begum +Carolann Stimage +Shawanda Steel +Ashley Pease +Danette Giltner +Herma Yocum +Leona Welter +Chuck Navas +Karyl Sutterfield +Brad Bradford +Vinnie Syverson +Kiana Villalon +Gracia Kubicek +Shauna Merkel +Coralee Gibbon +Elvie Seth +Keisha Bagnell +Saturnina Somma +Mattie Kegler +Darrin Stalcup +Tamie Kist +Randal Needleman +Shanae Fiske +Fran Salsman +Lillian Ristau +Catina Schriver +Charla Fox +Teresita Cory +Makeda Barlow +Malena Murden +Ranae Tope +Leena Newbury +Rodrick Turberville +John Mrozek +Raquel Yoshioka +Norberto Dynes +Assunta Dollard +Racheal Szabo +Clorinda Croxton +Terresa Cabe +Rey Dentler +Clarinda Coghlan +Enid Lawerence +Elicia Geist +Alvin Lenzi +Genie Gentry +Birgit Shires +Mozelle Saez +Juliane Bureau +Hollie Crochet +Maxwell Gammon +Fidel Perrier +Jong Speziale +Enda Briseno +Marlene Kutcher +Elly Whitenack +Fred Victory +Marilyn Scarborough +Gwyneth Laidlaw +Marnie Kemble +Soon Rosen +Ellsworth Thrailkill +Adriene Rizo +Maye Goosby +Glynis Rushing +Eli Henricksen +Winfred Begaye +Enedina Caves +Lilliam Sorrells +Luetta Baumbach +Allie Hance +Jonah Newsom +Kisha Mayson +Genesis Shoulders +Kamilah Croke +Taisha Glandon +Katrina Castorena +Leigha Wishon +Jammie Kirchoff +Marget Lehn +Jo May +Dalila Boutte +Florene Sakai +Frankie Desantiago +Leon Chumbley +Monika Han +Matilde Maddalena +Delilah Wagar +Lelia Coppinger +Gail Gatts +Luba Chaput +April Bundren +Everett Stever +Nelly Nutter +Dayna Santucci +Tatiana Mcanally +Corrine Perin +Tyra Feola +Lili Scally +Jenelle Sturgill +Gwen Mok +Berniece Sulton +Shantay Shivers +Gisele Michaels +Debbi Whitehill +Alejandro Roten +Ida Galang +Lola Franzen +Jackeline Silvernail +Bert Kohan +Sharri Dietrich +Twyla Hartness +Rubin Monks +Kenya Biggs +Annice Elwood +Sherly Lembo +Celinda Burd +Cythia Doten +Augustina Crespin +Arnette Patricia +Fidelia Brayton +Rene Friedrichs +Kristeen Kindel +Karey Maroon +Niesha Isbell +Bridgette Efird +Seymour Bollig +Johnsie Daring +Antionette Pendergast +Candie Warford +Kera Cybart +Caitlyn Borges +Karie Cue +Eleanor Krajewski +Irmgard Sroka +Elaine Castilleja +Dionne Michael +Rebbecca Vidrine +Sal Andujar +Yael Shuey +Carmelita Surber +Louie Horrigan +Agripina Hoskin +Tonya Mcentee +Maritza Fenster +Marcia Chabot +Iesha Bosque +Lucinda Stracener +Lupita Orona +Brynn Mohney +Melita Texada +Cassie Galley +Elissa Luton +Carly Bogue +Lai Speller +Nia Countess +Un Hixon +Linh Hanus +Glennie Borrero +Thuy Perino +Alex Groom +Melanie Bricker +Minh Shawl +Maire Spilman +Shizue Sadberry +Myrtice Hajduk +Sindy Koller +Latosha Foley +Consuela Koons +Clifford Winborne +Tiffany Bobby +Aurelio Munsell +Nichelle Stejskal +Nathalie Flury +Elisha Iannuzzi +Hilda Hisey +Heide Falco +Laureen Cartwright +Bethel Rispoli +Alvaro Millner +Zoila Meadow +Dione Sharma +Sharyn Frahm +Magdalen Richard +Rosendo Boye +Curtis Stouffer +Iona Lisenby +Wan Mcfarlin +Sherlyn Slaughter +Annamaria Gilliland +Germaine Exum +Drusilla Backstrom +Jaunita Deems +Rocco Kothari +Kia Vandam +Guy Peavler +Lashawna Tiggs +Jade Clutts +Armida Oddo +Clarice Ly +Lourdes Rucker +Haywood Conard +Ona Marois +Kristel Chausse +Dortha Manfre +Vena Gizzi +Pearl Hoffmeister +Clair Hamamoto +Lenita Fore +Huong Crothers +Roxann Leong +Shara Lamonica +Lorina Ketcham +Aja Hesler +Nila Styons +Sherise Beyer +Venessa Scull +Ernie Spitzer +Leora Feinberg +Waylon Lubin +Mi Kuester +Leslee Gustavson +Luther Cybart +Ronda Mandujano +Parker Foltz +Junie Nawrocki +Scot Kobayashi +Latonia Delozier +Lurline Spires +Na Jesus +Latoria Bento +Jennine Saephan +Sharon Larrison +Samatha Buskey +Ferdinand Straub +Caterina Derrow +Rusty Canary +Gisele Giebler +Cassaundra Ribera +Rey Rusin +Samella Zaccaria +Houston Walborn +Jeannette Leick +Norman Rugh +Marylee Ziebarth +Kelly Couto +Margaretta Trigg +Keena Wetherell +Lionel Hellen +Talitha Ryan +Leonia Clow +Glen Fomby +Hisako Lundell +Ellsworth Rehman +Nickie Martone +Era Mustafa +Toi Papenfuss +Marquis Holton +Dwight Oxford +Bev Whisman +Tara Johnsrud +Jackqueline Carvalho +Henry Strum +Lonnie Derby +Brenda Orzechowski +Petronila Amerine +Merri Mcmakin +Courtney Desilva +Adina Jezierski +Anderson Walton +Aleisha Leiser +Larue Gay +Janean Nordby +Elease Mullen +Virgen Brummitt +Josephine Mcauley +Sharan Fucci +Bennett Rieder +Angelic Koonce +Nelida Struble +Gus Ensign +Juliane Houle +Lanette Exner +Gary Trostle +Christel Henrickson +Dallas Urbanek +Valene Bakewell +Krystle Huwe +Dewayne Sisco +Louann Sizer +Alissa Wischmeier +Natasha Goers +Vonnie Strecker +Erica Marsee +Gabriela Bartel +Darlena Geier +Francesco Marcinkowski +Archie Perrodin +Yvette Sampsel +Eldon Rotter +Elijah Manos +Serina Gamon +Rea Janicki +Odette Albritton +Adelaide Sisto +Janel Poehler +Fredric Walck +Sherrie Delmont +Reggie Sturgill +Jonas Wronski +Gennie Amidon +Henry Dew +Tashina Lawyer +George Attaway +Tristan Teaster +Isidro Hanlin +Simona Barbara +Kristopher Wimmer +Lorraine Reeve +Peggie Super +Chang Morquecho +Phillip Smits +Harrison Mangus +Miyoko Demko +Barney Neubauer +Andree Kingman +Penelope Woolf +Jerilyn Crowder +Hana Turnipseed +Trina Studdard +Greg Niver +Zenobia Oros +Sharonda Degroff +Caron Jelinek +Corliss Jolin +Elicia Remley +So Pinkham +Marylee Carlow +Ocie Figg +Nerissa Netherton +Molly Monteleone +Marybeth Sinquefield +Dotty Todaro +Lovetta Sievert +Aida Carl +Detra Elsen +Johnson Jan +Joanie Beaver +Wes Royston +Jolyn Hunsberger +Andera Pagani +Tory Schuster +Dagny Darlington +Elouise Connon +Coral Crossett +Matilda Redmond +Marchelle Bernal +Veda Lindberg +Gonzalo Arzola +Miles Deacon +Margarete Robert +Tasha Dennard +Florine Lintner +Lashell Almodovar +Janine Heitz +Caprice Doris +Daron Minder +Anh Hermanson +Meta Thomure +Sherika France +Ivy Looby +Genesis Corrie +Ashlie Rester +Janet Stfleur +Siobhan Strelow +Joseph Morphis +Venice Feldman +Tyree Aumick +Joeann Vina +Candice Madonna +Alyssa Stansel +Marleen Venters +Cherry Shawl +Gia Kennamer +Shantel Lenard +Jarvis Nazario +Forest Tavernier +Augusta Bourquin +Luise Klippel +Lecia Harling +Syble Flynn +Antonio Willaims +Priscilla Sheller +Venessa Mahmood +Lisha Pion +Raisa Rio +Chase Adler +Audrea Wallington +Eleonor Mclachlan +Alfredo Clary +Vanetta Down +Bennie Rossin +Marget Charlebois +Audry Almazan +Justine Lett +Ivory Steigerwald +Willena Acoff +Sharlene Chappell +Reiko Oppenheimer +Hellen Gatton +Luanna Duggan +Melani Castilla +Tiera Jent +Daniel Wyrick +Trish Orum +Evangelina Pike +Bertram Cureton +Lera Heine diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..ce85e62 --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "handy.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/ranksearch/__init__.py b/ranksearch/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ranksearch/admin.py b/ranksearch/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/ranksearch/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/ranksearch/apps.py b/ranksearch/apps.py new file mode 100644 index 0000000..a648a8a --- /dev/null +++ b/ranksearch/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class RanksearchConfig(AppConfig): + name = 'ranksearch' diff --git a/ranksearch/management/__init__.py b/ranksearch/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ranksearch/management/commands/__init__.py b/ranksearch/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ranksearch/management/commands/recoverfixer.py b/ranksearch/management/commands/recoverfixer.py new file mode 100644 index 0000000..dc729b8 --- /dev/null +++ b/ranksearch/management/commands/recoverfixer.py @@ -0,0 +1,55 @@ +from django.core.management.base import BaseCommand, CommandError +from ranksearch.models import Owner, Property, Fixer, Job +import re +import csv + + +def artifice(name): + ret = {i: 1 for i in list(set(re.sub('[^a-z]', '', name.lower())))} + return 5 * len(ret.keys()) / 26 + + +class Command(BaseCommand): + + def handle(self, *args, **options): + count = 0 + jobs = csv.reader(open('./initial_data/newreviews.csv', 'rt')) + for job in jobs: + count = count + 1 + if (count % 10 == 0): + print("Done %s jobs" % count) + (rating, fixer_image, end_date, text, owner_image, + properties, fixer, owner, start_date) = job + + # Skip opening line, if present. + if rating == 'rating': + continue + + properties = properties.split('|') + newowner, isnew = Owner.objects.get_or_create(name=owner) + newowner.image_url = owner_image + newowner.save() + + newjobproperties = [] + for propertyname in properties: + newproperty, isnew = Property.objects.get_or_create( + owner=newowner, name=propertyname) + newproperty.save() + newjobproperties.append(newproperty) + + newfixer, isnew = Fixer.objects.get_or_create(name=fixer) + newfixer.image_url = fixer_image + newfixer.rating = artifice(fixer) + newfixer.save() + + newjob = Job( + fixer=newfixer, + start_date=start_date, + end_date=end_date, + comment=text, + rating=int(rating)) + newjob.save() + + for property in newjobproperties: + newjob.properties.add(property) + newjob.save() diff --git a/ranksearch/migrations/0001_initial.py b/ranksearch/migrations/0001_initial.py new file mode 100644 index 0000000..78d9db6 --- /dev/null +++ b/ranksearch/migrations/0001_initial.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-04-28 03:48 +from __future__ import unicode_literals + +import autoslug.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Fixer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250, verbose_name="Fixer's name")), + ('slug', autoslug.fields.AutoSlugField(editable=False, max_length=32, populate_from='name', unique=True)), + ('image_url', models.URLField(blank=True, max_length=255)), + ('rating', models.DecimalField(decimal_places=2, default=0, max_digits=3, verbose_name="Fixer's initial rating")), + ], + ), + migrations.CreateModel( + name='FixerRank', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rank', models.FloatField(default=0.0)), + ('fixer', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='score', to='ranksearch.Fixer')), + ], + ), + migrations.CreateModel( + name='Job', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('comment', models.TextField(default='')), + ('start_date', models.DateField()), + ('end_date', models.DateField(blank=True)), + ('rating', models.PositiveIntegerField(default=1)), + ('fixer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='jobs', to='ranksearch.Fixer')), + ], + ), + migrations.CreateModel( + name='Owner', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250, verbose_name="Owner's name")), + ('slug', autoslug.fields.AutoSlugField(editable=False, max_length=32, populate_from='name', unique=True)), + ('image_url', models.URLField(blank=True, max_length=255)), + ], + ), + migrations.CreateModel( + name='Property', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250)), + ('slug', autoslug.fields.AutoSlugField(editable=False, max_length=32, populate_from='name', unique=True)), + ('image_url', models.URLField(blank=True, max_length=255)), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='properties', to='ranksearch.Owner', verbose_name='Property')), + ], + ), + migrations.AddField( + model_name='job', + name='properties', + field=models.ManyToManyField(related_name='jobs', to='ranksearch.Property'), + ), + migrations.AlterUniqueTogether( + name='property', + unique_together=set([('name', 'owner')]), + ), + ] diff --git a/ranksearch/migrations/__init__.py b/ranksearch/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ranksearch/models.py b/ranksearch/models.py new file mode 100644 index 0000000..09a8cb8 --- /dev/null +++ b/ranksearch/models.py @@ -0,0 +1,85 @@ +from django.db import models +from django.db.models import Count, Sum +from autoslug.fields import AutoSlugField + + +class Owner(models.Model): + name = models.CharField(max_length=250, blank=False, + verbose_name="Owner's name") + slug = AutoSlugField(populate_from='name', max_length=32, unique=True) + image_url = models.URLField(unique=False, max_length=255, blank=True) + + def __str__(self): + return '%s' % (self.name) + + +class Property(models.Model): + owner = models.ForeignKey(Owner, related_name="properties", + verbose_name="Property") + name = models.CharField(max_length=250, blank=False) + slug = AutoSlugField(populate_from='name', max_length=32, unique=True) + image_url = models.URLField(unique=False, max_length=255, blank=True) + + class Meta: + unique_together = ("name", "owner") + + def __str__(self): + return '%s' % (self.name) + + +class Fixer(models.Model): + name = models.CharField( + max_length=250, blank=False, + verbose_name="Fixer's name") + slug = AutoSlugField(populate_from='name', max_length=32, unique=True) + image_url = models.URLField(unique=False, max_length=255, blank=True) + rating = models.DecimalField( + default=0, + max_digits=3, + decimal_places=2, + verbose_name="Fixer's initial rating") + + def __str__(self): + return '%s' % (self.name) + + +class FixerRank(models.Model): + fixer = models.OneToOneField(Fixer, related_name="score") + rank = models.FloatField(default=0.0) + + def save(self, *args, **kwargs): + score = self.fixer.jobs.aggregate(Sum('rating')) + jobs = self.fixer.jobs.count() + self.rank = float(self.fixer.rating) + (score['rating__sum'] / 10.0) + if jobs >= 10: + rank = score['rating__sum'] / jobs + return super(FixerRank, self).save(*args, **kwargs) + + +class Job(models.Model): + fixer = models.ForeignKey(Fixer, related_name="jobs") + properties = models.ManyToManyField(Property, related_name="jobs") + comment = models.TextField(default="") + start_date = models.DateField(blank=False) + end_date = models.DateField(blank=True) + rating = models.PositiveIntegerField(default=1) + + def __str__(self): + return '%s sat %s for %s' % (self.fixer.name, self.propertylist, + self.properties.all()[0].owner.name) + + @property + def propertylist(self): + return ', '.join([a.name for a in self.properties.all()]) + + def save(self, *args, **kwargs): + job = super(Job, self).save(*args, **kwargs) + score, c = FixerRank.objects.get_or_create(fixer=self.fixer) + score.save() + return job + + def delete(self, *args, **kwargs): + job = super(Job, self).delete(*args, **kwargs) + score = job.fixer.score + score.save() + return job diff --git a/ranksearch/static/ranksearch/paginate.js b/ranksearch/static/ranksearch/paginate.js new file mode 100644 index 0000000..ab5c504 --- /dev/null +++ b/ranksearch/static/ranksearch/paginate.js @@ -0,0 +1,148 @@ +/*global $, _, Backbone */ + +var Sitter = Backbone.Model.extend({}); + +var Sitters = Backbone.Collection.extend({ + comparator: function(a) { return -1 * a.get('score'); } +}); + + +var SittersView = Backbone.View.extend({ + initialize: function(options) { + options = options || {}; + this.parent_collection = options.collection || new Sitters([]); + if (!options.el) { + this.setElement($('#sitters')); + } + this.currentPage = options.page || 0; + this.minScore = 0; + this.interval = 10; + this.readFromTable(); + }, + + readFromTable: function() { + var unpackRow = function(index, row) { + return { + 'name': $('td:nth-child(2) a', row).text(), + 'link': $('td:nth-child(2) a', row).attr('href'), + 'image': $('td:nth-child(1) img', row).attr('src'), + 'score': parseFloat($('td:nth-child(3)', row).text()) + }; + }; + var data = this.$('table tr').map(unpackRow); + this.parent_collection.reset(data.get()); + this.runFilter(); + return this; + }, + + runFilter: function() { + this.collection = new Sitters(this.parent_collection.filter(function(i) { + return i.get('score') >= this.minScore; }.bind(this))); + return this; + }, + + events: { + 'click .next': 'next', + 'click .prev': 'prev', + 'click .page': 'page', + 'change #range': 'range', + 'input #range': 'range' + }, + + turn: function(page) { + if ((page < 0) || ((page * this.interval) > this.collection.length)) { + page = 0; + } + this.currentPage = page; + this.render(); + var oldsearch = window.location.search; + var newsearch = window.location.search.replace( + /(((\?|\&)page=\d+)|$)/, + function() { return (arguments[3] || '?') + 'page=' + (parseInt(page, 10) + 1); }); + window.history.pushState({page: page}, "", newsearch); + return this; + }, + + range: function(event) { + var handler = function() { + this.minScore = parseFloat(event.target.value); + this.$('#minscore').text(this.minScore); + return this.runFilter().renderPaginator().renderTable(); + }.bind(this); + _.debounce(handler, 200)(); + }, + + page: function(e) { return this.turn(parseInt($(e.target).text(), 10) - 1); }, + next: function(e) { return this.page(this.currentPage + 1); }, + prev: function(e) { return this.page(this.currentPage - 1); }, + + context: function() { + return { + minScore: this.minScore, + start: this.currentPage * this.interval, + interval: this.interval, + all: this.collection.length, + sitters: this.collection.toJSON() + }; + }, + + renderRange: function() { + this.$('#range').html(this._rangeTemplate(this.context())); + this.$('#range').fadeIn(150); + return this; + }, + + renderPaginator: function() { + this.$('#paginator').html(this._pagerTemplate(this.context())); + this.$('#paginator ul').fadeIn(150); + return this; + }, + + renderTable: function() { + this.$('#sittertable').html(this._tableTemplate(this.context())); + this.$('#sittertable').fadeIn(150); + return this; + }, + + render: function() { + var promises = _.map('#sittertable', '#paginator ul', '#range', function(sel) { + return this.$(sel).fadeOut(150); + }.bind(this)); + + $.when(promises).then(function() { + this.renderRange(); + this.renderPaginator(); + this.renderTable(); + }.bind(this)); + return this; + }, + + _rangeTemplate: _.template([ + ' ', + 'Now showing scores above: <%= minScore %>'].join('')), + + _pagerTemplate: _.template([ + 'Page: '].join('\n')), + + _tableTemplate: _.template([ + '<% for(var i=start, l=interval; (i < start + interval) && (i < all); i += 1) { var s = sitters[i]; %>', + ' ', + ' ', + ' <%= s.name %>', + ' <%= s.score %>', + ' ', + '<% } %>' + ].join('\n')) +}); + + +$(function() { + var pageset = (window.location.search.match(/((\?|\&)page=(\d+))/)); + var page = (pageset && pageset[3]) ? (parseInt(pageset[3], 10) - 1) : 0; + var sitters = new SittersView({page: page}).render(); +}); diff --git a/ranksearch/static/ranksearch/ranksearch.css b/ranksearch/static/ranksearch/ranksearch.css new file mode 100644 index 0000000..9e961c5 --- /dev/null +++ b/ranksearch/static/ranksearch/ranksearch.css @@ -0,0 +1,22 @@ +table#sittertable td img { + max-width: 48px; + max-height: 48px; +} + +table#sittertable td { + padding: 4px; + border: 1px solid #ccc; +} + +#paginator ul { + display: none; +} + +#paginator li { + display: inline; +} + +#range { + display: none; +} + diff --git a/ranksearch/templates/ranksearch/fixer.html b/ranksearch/templates/ranksearch/fixer.html new file mode 100644 index 0000000..64ea487 --- /dev/null +++ b/ranksearch/templates/ranksearch/fixer.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block content %} + +

Fixer: {{ fixer.name }}

+
+

Jobs:

+ +{% endblock %} diff --git a/ranksearch/templates/ranksearch/index.html b/ranksearch/templates/ranksearch/index.html new file mode 100644 index 0000000..b3185ab --- /dev/null +++ b/ranksearch/templates/ranksearch/index.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} +{% load staticfiles %} + +{% block content %} + +
+
+
Now showing scores above: <%= minScore %>
+
+
+

Our Fixers:

+ {% for fixer in fixers %} + + + + + + {% endfor %} +
{{ fixer.name }}{{ fixer.score.rank|floatformat:2 }}
+ + + + + +{% endblock %} diff --git a/ranksearch/templates/ranksearch/owner.html b/ranksearch/templates/ranksearch/owner.html new file mode 100644 index 0000000..3ea0cc1 --- /dev/null +++ b/ranksearch/templates/ranksearch/owner.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block content %} + +

{{ owner.name }}

+
+

Owns:

+ +{% endblock %} diff --git a/ranksearch/templates/ranksearch/property.html b/ranksearch/templates/ranksearch/property.html new file mode 100644 index 0000000..69c38d7 --- /dev/null +++ b/ranksearch/templates/ranksearch/property.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block content %} +
+

{{ property.name }}

+

Owned by: {{ owner.name }}

+

Other properties:

+ +{% endblock %} diff --git a/ranksearch/tests.py b/ranksearch/tests.py new file mode 100644 index 0000000..827b105 --- /dev/null +++ b/ranksearch/tests.py @@ -0,0 +1,66 @@ +from django.test import TestCase +from .models import Owner, Fixer, Property, Job +from random import randint + + +class CanSeeAll(TestCase): + + def setUp(self): + owner, c = Owner.objects.get_or_create(name="Alice") + owner.image_url = "http://localhost/" + owner.save() + + property, c = Property.objects.get_or_create( + name="Apartment #1", owner=owner) + property.save() + + fixer, c = Fixer.objects.get_or_create(name="Carol") + fixer.image_url = "http://localhost" + fixer.rating = 3 + + job = Job( + fixer=fixer, + start_date="2016-04-23", + end_date="2016-04-26", + comment="Lorem ipsum goes here", + rating=4) + job.save() + + job.properties.add(property) + job.save() + + # A quick set of tests, just a walk through the database. + # Asserts, at least, that given one owner, fixer, and property, we can + # see every object in the system. + + def test_01_get_index(self): + response = self.client.get('/search/') + self.assertEqual(response.status_code, 200) + + def test_02_get_fixer(self): + response = self.client.get('/search/') + fixer = response.context['fixers'][0] + response = self.client.get('/search/fixer/' + fixer.slug + '/') + self.assertEqual(response.status_code, 200) + + def test_03_get_property(self): + response = self.client.get('/search/') + fixer = response.context['fixers'][0] + response = self.client.get('/search/fixer/' + fixer.slug + '/') + jobs = response.context['fixer'].jobs + job = jobs.all()[0] + property = job.properties.all()[0] + response = self.client.get('/search/property/' + property.slug + '/') + self.assertEqual(response.status_code, 200) + + def test_03_get_owner(self): + response = self.client.get('/search/') + fixer = response.context['fixers'][0] + response = self.client.get('/search/fixer/' + fixer.slug + '/') + jobs = response.context['fixer'].jobs + job = jobs.all()[0] + property = job.properties.all()[0] + response = self.client.get('/search/property/' + property.slug + '/') + owner = response.context['owner'] + response = self.client.get('/search/owner/' + owner.slug + '/') + self.assertEqual(response.status_code, 200) diff --git a/ranksearch/urls.py b/ranksearch/urls.py new file mode 100644 index 0000000..9d2b9ea --- /dev/null +++ b/ranksearch/urls.py @@ -0,0 +1,10 @@ +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^$', views.index, name='index'), + url(r'^fixer/(?P[\w\-]+)/$', views.fixer, name='fixer'), + url(r'^owner/(?P[\w\-]+)/$', views.owner, name='owner'), + url(r'^property/(?P[\w\-]+)/$', views.property, name='property'), +] diff --git a/ranksearch/views.py b/ranksearch/views.py new file mode 100644 index 0000000..fdffbf5 --- /dev/null +++ b/ranksearch/views.py @@ -0,0 +1,32 @@ +from django.http import HttpResponse +from django.shortcuts import get_object_or_404, render +from django.views.generic import View +from .models import Fixer, Owner, Property + + +def index(request): + fixers = Fixer.objects.all().order_by('score__rank') + context = {'fixers': fixers} + return render(request, 'ranksearch/index.html', context) + + +def fixer(request, slug): + object = get_object_or_404(Fixer, slug=slug) + return render(request, 'ranksearch/fixer.html', + {'fixer': object, + 'jobs': object.jobs.order_by('start_date')}) + + +def owner(request, slug): + object = get_object_or_404(Owner, slug=slug) + return render(request, 'ranksearch/owner.html', + {'owner': object, + 'properties': object.properties.all()}) + + +def property(request, slug): + object = get_object_or_404(Property, slug=slug) + return render(request, 'ranksearch/property.html', + {'property': object, + 'properties': object.owner.properties.all().exclude(pk=object.pk), + 'owner': object.owner}) diff --git a/static/backbone.js b/static/backbone.js new file mode 100644 index 0000000..55ccb22 --- /dev/null +++ b/static/backbone.js @@ -0,0 +1,1920 @@ +// Backbone.js 1.3.3 + +// (c) 2010-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://backbonejs.org + +(function(factory) { + + // Establish the root object, `window` (`self`) in the browser, or `global` on the server. + // We use `self` instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global); + + // Set up Backbone appropriately for the environment. Start with AMD. + if (typeof define === 'function' && define.amd) { + define(['underscore', 'jquery', 'exports'], function(_, $, exports) { + // Export global even in AMD case in case this script is loaded with + // others that may still expect a global Backbone. + root.Backbone = factory(root, exports, _, $); + }); + + // Next for Node.js or CommonJS. jQuery may not be needed as a module. + } else if (typeof exports !== 'undefined') { + var _ = require('underscore'), $; + try { $ = require('jquery'); } catch (e) {} + factory(root, exports, _, $); + + // Finally, as a browser global. + } else { + root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$)); + } + +})(function(root, Backbone, _, $) { + + // Initial Setup + // ------------- + + // Save the previous value of the `Backbone` variable, so that it can be + // restored later on, if `noConflict` is used. + var previousBackbone = root.Backbone; + + // Create a local reference to a common array method we'll want to use later. + var slice = Array.prototype.slice; + + // Current version of the library. Keep in sync with `package.json`. + Backbone.VERSION = '1.3.3'; + + // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns + // the `$` variable. + Backbone.$ = $; + + // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable + // to its previous owner. Returns a reference to this Backbone object. + Backbone.noConflict = function() { + root.Backbone = previousBackbone; + return this; + }; + + // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option + // will fake `"PATCH"`, `"PUT"` and `"DELETE"` requests via the `_method` parameter and + // set a `X-Http-Method-Override` header. + Backbone.emulateHTTP = false; + + // Turn on `emulateJSON` to support legacy servers that can't deal with direct + // `application/json` requests ... this will encode the body as + // `application/x-www-form-urlencoded` instead and will send the model in a + // form param named `model`. + Backbone.emulateJSON = false; + + // Proxy Backbone class methods to Underscore functions, wrapping the model's + // `attributes` object or collection's `models` array behind the scenes. + // + // collection.filter(function(model) { return model.get('age') > 10 }); + // collection.each(this.addView); + // + // `Function#apply` can be slow so we use the method's arg count, if we know it. + var addMethod = function(length, method, attribute) { + switch (length) { + case 1: return function() { + return _[method](this[attribute]); + }; + case 2: return function(value) { + return _[method](this[attribute], value); + }; + case 3: return function(iteratee, context) { + return _[method](this[attribute], cb(iteratee, this), context); + }; + case 4: return function(iteratee, defaultVal, context) { + return _[method](this[attribute], cb(iteratee, this), defaultVal, context); + }; + default: return function() { + var args = slice.call(arguments); + args.unshift(this[attribute]); + return _[method].apply(_, args); + }; + } + }; + var addUnderscoreMethods = function(Class, methods, attribute) { + _.each(methods, function(length, method) { + if (_[method]) Class.prototype[method] = addMethod(length, method, attribute); + }); + }; + + // Support `collection.sortBy('attr')` and `collection.findWhere({id: 1})`. + var cb = function(iteratee, instance) { + if (_.isFunction(iteratee)) return iteratee; + if (_.isObject(iteratee) && !instance._isModel(iteratee)) return modelMatcher(iteratee); + if (_.isString(iteratee)) return function(model) { return model.get(iteratee); }; + return iteratee; + }; + var modelMatcher = function(attrs) { + var matcher = _.matches(attrs); + return function(model) { + return matcher(model.attributes); + }; + }; + + // Backbone.Events + // --------------- + + // A module that can be mixed in to *any object* in order to provide it with + // a custom event channel. You may bind a callback to an event with `on` or + // remove with `off`; `trigger`-ing an event fires all callbacks in + // succession. + // + // var object = {}; + // _.extend(object, Backbone.Events); + // object.on('expand', function(){ alert('expanded'); }); + // object.trigger('expand'); + // + var Events = Backbone.Events = {}; + + // Regular expression used to split event strings. + var eventSplitter = /\s+/; + + // Iterates over the standard `event, callback` (as well as the fancy multiple + // space-separated events `"change blur", callback` and jQuery-style event + // maps `{event: callback}`). + var eventsApi = function(iteratee, events, name, callback, opts) { + var i = 0, names; + if (name && typeof name === 'object') { + // Handle event maps. + if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback; + for (names = _.keys(name); i < names.length ; i++) { + events = eventsApi(iteratee, events, names[i], name[names[i]], opts); + } + } else if (name && eventSplitter.test(name)) { + // Handle space-separated event names by delegating them individually. + for (names = name.split(eventSplitter); i < names.length; i++) { + events = iteratee(events, names[i], callback, opts); + } + } else { + // Finally, standard events. + events = iteratee(events, name, callback, opts); + } + return events; + }; + + // Bind an event to a `callback` function. Passing `"all"` will bind + // the callback to all events fired. + Events.on = function(name, callback, context) { + return internalOn(this, name, callback, context); + }; + + // Guard the `listening` argument from the public API. + var internalOn = function(obj, name, callback, context, listening) { + obj._events = eventsApi(onApi, obj._events || {}, name, callback, { + context: context, + ctx: obj, + listening: listening + }); + + if (listening) { + var listeners = obj._listeners || (obj._listeners = {}); + listeners[listening.id] = listening; + } + + return obj; + }; + + // Inversion-of-control versions of `on`. Tell *this* object to listen to + // an event in another object... keeping track of what it's listening to + // for easier unbinding later. + Events.listenTo = function(obj, name, callback) { + if (!obj) return this; + var id = obj._listenId || (obj._listenId = _.uniqueId('l')); + var listeningTo = this._listeningTo || (this._listeningTo = {}); + var listening = listeningTo[id]; + + // This object is not listening to any other events on `obj` yet. + // Setup the necessary references to track the listening callbacks. + if (!listening) { + var thisId = this._listenId || (this._listenId = _.uniqueId('l')); + listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0}; + } + + // Bind callbacks on obj, and keep track of them on listening. + internalOn(obj, name, callback, this, listening); + return this; + }; + + // The reducing API that adds a callback to the `events` object. + var onApi = function(events, name, callback, options) { + if (callback) { + var handlers = events[name] || (events[name] = []); + var context = options.context, ctx = options.ctx, listening = options.listening; + if (listening) listening.count++; + + handlers.push({callback: callback, context: context, ctx: context || ctx, listening: listening}); + } + return events; + }; + + // Remove one or many callbacks. If `context` is null, removes all + // callbacks with that function. If `callback` is null, removes all + // callbacks for the event. If `name` is null, removes all bound + // callbacks for all events. + Events.off = function(name, callback, context) { + if (!this._events) return this; + this._events = eventsApi(offApi, this._events, name, callback, { + context: context, + listeners: this._listeners + }); + return this; + }; + + // Tell this object to stop listening to either specific events ... or + // to every object it's currently listening to. + Events.stopListening = function(obj, name, callback) { + var listeningTo = this._listeningTo; + if (!listeningTo) return this; + + var ids = obj ? [obj._listenId] : _.keys(listeningTo); + + for (var i = 0; i < ids.length; i++) { + var listening = listeningTo[ids[i]]; + + // If listening doesn't exist, this object is not currently + // listening to obj. Break out early. + if (!listening) break; + + listening.obj.off(name, callback, this); + } + + return this; + }; + + // The reducing API that removes a callback from the `events` object. + var offApi = function(events, name, callback, options) { + if (!events) return; + + var i = 0, listening; + var context = options.context, listeners = options.listeners; + + // Delete all events listeners and "drop" events. + if (!name && !callback && !context) { + var ids = _.keys(listeners); + for (; i < ids.length; i++) { + listening = listeners[ids[i]]; + delete listeners[listening.id]; + delete listening.listeningTo[listening.objId]; + } + return; + } + + var names = name ? [name] : _.keys(events); + for (; i < names.length; i++) { + name = names[i]; + var handlers = events[name]; + + // Bail out if there are no events stored. + if (!handlers) break; + + // Replace events if there are any remaining. Otherwise, clean up. + var remaining = []; + for (var j = 0; j < handlers.length; j++) { + var handler = handlers[j]; + if ( + callback && callback !== handler.callback && + callback !== handler.callback._callback || + context && context !== handler.context + ) { + remaining.push(handler); + } else { + listening = handler.listening; + if (listening && --listening.count === 0) { + delete listeners[listening.id]; + delete listening.listeningTo[listening.objId]; + } + } + } + + // Update tail event if the list has any events. Otherwise, clean up. + if (remaining.length) { + events[name] = remaining; + } else { + delete events[name]; + } + } + return events; + }; + + // Bind an event to only be triggered a single time. After the first time + // the callback is invoked, its listener will be removed. If multiple events + // are passed in using the space-separated syntax, the handler will fire + // once for each event, not once for a combination of all events. + Events.once = function(name, callback, context) { + // Map the event into a `{event: once}` object. + var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this)); + if (typeof name === 'string' && context == null) callback = void 0; + return this.on(events, callback, context); + }; + + // Inversion-of-control versions of `once`. + Events.listenToOnce = function(obj, name, callback) { + // Map the event into a `{event: once}` object. + var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj)); + return this.listenTo(obj, events); + }; + + // Reduces the event callbacks into a map of `{event: onceWrapper}`. + // `offer` unbinds the `onceWrapper` after it has been called. + var onceMap = function(map, name, callback, offer) { + if (callback) { + var once = map[name] = _.once(function() { + offer(name, once); + callback.apply(this, arguments); + }); + once._callback = callback; + } + return map; + }; + + // Trigger one or many events, firing all bound callbacks. Callbacks are + // passed the same arguments as `trigger` is, apart from the event name + // (unless you're listening on `"all"`, which will cause your callback to + // receive the true name of the event as the first argument). + Events.trigger = function(name) { + if (!this._events) return this; + + var length = Math.max(0, arguments.length - 1); + var args = Array(length); + for (var i = 0; i < length; i++) args[i] = arguments[i + 1]; + + eventsApi(triggerApi, this._events, name, void 0, args); + return this; + }; + + // Handles triggering the appropriate event callbacks. + var triggerApi = function(objEvents, name, callback, args) { + if (objEvents) { + var events = objEvents[name]; + var allEvents = objEvents.all; + if (events && allEvents) allEvents = allEvents.slice(); + if (events) triggerEvents(events, args); + if (allEvents) triggerEvents(allEvents, [name].concat(args)); + } + return objEvents; + }; + + // A difficult-to-believe, but optimized internal dispatch function for + // triggering events. Tries to keep the usual cases speedy (most internal + // Backbone events have 3 arguments). + var triggerEvents = function(events, args) { + var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; + switch (args.length) { + case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; + case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; + case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; + case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; + default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return; + } + }; + + // Aliases for backwards compatibility. + Events.bind = Events.on; + Events.unbind = Events.off; + + // Allow the `Backbone` object to serve as a global event bus, for folks who + // want global "pubsub" in a convenient place. + _.extend(Backbone, Events); + + // Backbone.Model + // -------------- + + // Backbone **Models** are the basic data object in the framework -- + // frequently representing a row in a table in a database on your server. + // A discrete chunk of data and a bunch of useful, related methods for + // performing computations and transformations on that data. + + // Create a new model with the specified attributes. A client id (`cid`) + // is automatically generated and assigned for you. + var Model = Backbone.Model = function(attributes, options) { + var attrs = attributes || {}; + options || (options = {}); + this.cid = _.uniqueId(this.cidPrefix); + this.attributes = {}; + if (options.collection) this.collection = options.collection; + if (options.parse) attrs = this.parse(attrs, options) || {}; + var defaults = _.result(this, 'defaults'); + attrs = _.defaults(_.extend({}, defaults, attrs), defaults); + this.set(attrs, options); + this.changed = {}; + this.initialize.apply(this, arguments); + }; + + // Attach all inheritable methods to the Model prototype. + _.extend(Model.prototype, Events, { + + // A hash of attributes whose current and previous value differ. + changed: null, + + // The value returned during the last failed validation. + validationError: null, + + // The default name for the JSON `id` attribute is `"id"`. MongoDB and + // CouchDB users may want to set this to `"_id"`. + idAttribute: 'id', + + // The prefix is used to create the client id which is used to identify models locally. + // You may want to override this if you're experiencing name clashes with model ids. + cidPrefix: 'c', + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Return a copy of the model's `attributes` object. + toJSON: function(options) { + return _.clone(this.attributes); + }, + + // Proxy `Backbone.sync` by default -- but override this if you need + // custom syncing semantics for *this* particular model. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Get the value of an attribute. + get: function(attr) { + return this.attributes[attr]; + }, + + // Get the HTML-escaped value of an attribute. + escape: function(attr) { + return _.escape(this.get(attr)); + }, + + // Returns `true` if the attribute contains a value that is not null + // or undefined. + has: function(attr) { + return this.get(attr) != null; + }, + + // Special-cased proxy to underscore's `_.matches` method. + matches: function(attrs) { + return !!_.iteratee(attrs, this)(this.attributes); + }, + + // Set a hash of model attributes on the object, firing `"change"`. This is + // the core primitive operation of a model, updating the data and notifying + // anyone who needs to know about the change in state. The heart of the beast. + set: function(key, val, options) { + if (key == null) return this; + + // Handle both `"key", value` and `{key: value}` -style arguments. + var attrs; + if (typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + options || (options = {}); + + // Run validation. + if (!this._validate(attrs, options)) return false; + + // Extract attributes and options. + var unset = options.unset; + var silent = options.silent; + var changes = []; + var changing = this._changing; + this._changing = true; + + if (!changing) { + this._previousAttributes = _.clone(this.attributes); + this.changed = {}; + } + + var current = this.attributes; + var changed = this.changed; + var prev = this._previousAttributes; + + // For each `set` attribute, update or delete the current value. + for (var attr in attrs) { + val = attrs[attr]; + if (!_.isEqual(current[attr], val)) changes.push(attr); + if (!_.isEqual(prev[attr], val)) { + changed[attr] = val; + } else { + delete changed[attr]; + } + unset ? delete current[attr] : current[attr] = val; + } + + // Update the `id`. + if (this.idAttribute in attrs) this.id = this.get(this.idAttribute); + + // Trigger all relevant attribute changes. + if (!silent) { + if (changes.length) this._pending = options; + for (var i = 0; i < changes.length; i++) { + this.trigger('change:' + changes[i], this, current[changes[i]], options); + } + } + + // You might be wondering why there's a `while` loop here. Changes can + // be recursively nested within `"change"` events. + if (changing) return this; + if (!silent) { + while (this._pending) { + options = this._pending; + this._pending = false; + this.trigger('change', this, options); + } + } + this._pending = false; + this._changing = false; + return this; + }, + + // Remove an attribute from the model, firing `"change"`. `unset` is a noop + // if the attribute doesn't exist. + unset: function(attr, options) { + return this.set(attr, void 0, _.extend({}, options, {unset: true})); + }, + + // Clear all attributes on the model, firing `"change"`. + clear: function(options) { + var attrs = {}; + for (var key in this.attributes) attrs[key] = void 0; + return this.set(attrs, _.extend({}, options, {unset: true})); + }, + + // Determine if the model has changed since the last `"change"` event. + // If you specify an attribute name, determine if that attribute has changed. + hasChanged: function(attr) { + if (attr == null) return !_.isEmpty(this.changed); + return _.has(this.changed, attr); + }, + + // Return an object containing all the attributes that have changed, or + // false if there are no changed attributes. Useful for determining what + // parts of a view need to be updated and/or what attributes need to be + // persisted to the server. Unset attributes will be set to undefined. + // You can also pass an attributes object to diff against the model, + // determining if there *would be* a change. + changedAttributes: function(diff) { + if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; + var old = this._changing ? this._previousAttributes : this.attributes; + var changed = {}; + for (var attr in diff) { + var val = diff[attr]; + if (_.isEqual(old[attr], val)) continue; + changed[attr] = val; + } + return _.size(changed) ? changed : false; + }, + + // Get the previous value of an attribute, recorded at the time the last + // `"change"` event was fired. + previous: function(attr) { + if (attr == null || !this._previousAttributes) return null; + return this._previousAttributes[attr]; + }, + + // Get all of the attributes of the model at the time of the previous + // `"change"` event. + previousAttributes: function() { + return _.clone(this._previousAttributes); + }, + + // Fetch the model from the server, merging the response with the model's + // local attributes. Any changed attributes will trigger a "change" event. + fetch: function(options) { + options = _.extend({parse: true}, options); + var model = this; + var success = options.success; + options.success = function(resp) { + var serverAttrs = options.parse ? model.parse(resp, options) : resp; + if (!model.set(serverAttrs, options)) return false; + if (success) success.call(options.context, model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Set a hash of model attributes, and sync the model to the server. + // If the server returns an attributes hash that differs, the model's + // state will be `set` again. + save: function(key, val, options) { + // Handle both `"key", value` and `{key: value}` -style arguments. + var attrs; + if (key == null || typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + options = _.extend({validate: true, parse: true}, options); + var wait = options.wait; + + // If we're not waiting and attributes exist, save acts as + // `set(attr).save(null, opts)` with validation. Otherwise, check if + // the model will be valid when the attributes, if any, are set. + if (attrs && !wait) { + if (!this.set(attrs, options)) return false; + } else if (!this._validate(attrs, options)) { + return false; + } + + // After a successful server-side save, the client is (optionally) + // updated with the server-side state. + var model = this; + var success = options.success; + var attributes = this.attributes; + options.success = function(resp) { + // Ensure attributes are restored during synchronous saves. + model.attributes = attributes; + var serverAttrs = options.parse ? model.parse(resp, options) : resp; + if (wait) serverAttrs = _.extend({}, attrs, serverAttrs); + if (serverAttrs && !model.set(serverAttrs, options)) return false; + if (success) success.call(options.context, model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + + // Set temporary attributes if `{wait: true}` to properly find new ids. + if (attrs && wait) this.attributes = _.extend({}, attributes, attrs); + + var method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); + if (method === 'patch' && !options.attrs) options.attrs = attrs; + var xhr = this.sync(method, this, options); + + // Restore attributes. + this.attributes = attributes; + + return xhr; + }, + + // Destroy this model on the server if it was already persisted. + // Optimistically removes the model from its collection, if it has one. + // If `wait: true` is passed, waits for the server to respond before removal. + destroy: function(options) { + options = options ? _.clone(options) : {}; + var model = this; + var success = options.success; + var wait = options.wait; + + var destroy = function() { + model.stopListening(); + model.trigger('destroy', model, model.collection, options); + }; + + options.success = function(resp) { + if (wait) destroy(); + if (success) success.call(options.context, model, resp, options); + if (!model.isNew()) model.trigger('sync', model, resp, options); + }; + + var xhr = false; + if (this.isNew()) { + _.defer(options.success); + } else { + wrapError(this, options); + xhr = this.sync('delete', this, options); + } + if (!wait) destroy(); + return xhr; + }, + + // Default URL for the model's representation on the server -- if you're + // using Backbone's restful methods, override this to change the endpoint + // that will be called. + url: function() { + var base = + _.result(this, 'urlRoot') || + _.result(this.collection, 'url') || + urlError(); + if (this.isNew()) return base; + var id = this.get(this.idAttribute); + return base.replace(/[^\/]$/, '$&/') + encodeURIComponent(id); + }, + + // **parse** converts a response into the hash of attributes to be `set` on + // the model. The default implementation is just to pass the response along. + parse: function(resp, options) { + return resp; + }, + + // Create a new model with identical attributes to this one. + clone: function() { + return new this.constructor(this.attributes); + }, + + // A model is new if it has never been saved to the server, and lacks an id. + isNew: function() { + return !this.has(this.idAttribute); + }, + + // Check if the model is currently in a valid state. + isValid: function(options) { + return this._validate({}, _.extend({}, options, {validate: true})); + }, + + // Run validation against the next complete set of model attributes, + // returning `true` if all is well. Otherwise, fire an `"invalid"` event. + _validate: function(attrs, options) { + if (!options.validate || !this.validate) return true; + attrs = _.extend({}, this.attributes, attrs); + var error = this.validationError = this.validate(attrs, options) || null; + if (!error) return true; + this.trigger('invalid', this, error, _.extend(options, {validationError: error})); + return false; + } + + }); + + // Underscore methods that we want to implement on the Model, mapped to the + // number of arguments they take. + var modelMethods = {keys: 1, values: 1, pairs: 1, invert: 1, pick: 0, + omit: 0, chain: 1, isEmpty: 1}; + + // Mix in each Underscore method as a proxy to `Model#attributes`. + addUnderscoreMethods(Model, modelMethods, 'attributes'); + + // Backbone.Collection + // ------------------- + + // If models tend to represent a single row of data, a Backbone Collection is + // more analogous to a table full of data ... or a small slice or page of that + // table, or a collection of rows that belong together for a particular reason + // -- all of the messages in this particular folder, all of the documents + // belonging to this particular author, and so on. Collections maintain + // indexes of their models, both in order, and for lookup by `id`. + + // Create a new **Collection**, perhaps to contain a specific type of `model`. + // If a `comparator` is specified, the Collection will maintain + // its models in sort order, as they're added and removed. + var Collection = Backbone.Collection = function(models, options) { + options || (options = {}); + if (options.model) this.model = options.model; + if (options.comparator !== void 0) this.comparator = options.comparator; + this._reset(); + this.initialize.apply(this, arguments); + if (models) this.reset(models, _.extend({silent: true}, options)); + }; + + // Default options for `Collection#set`. + var setOptions = {add: true, remove: true, merge: true}; + var addOptions = {add: true, remove: false}; + + // Splices `insert` into `array` at index `at`. + var splice = function(array, insert, at) { + at = Math.min(Math.max(at, 0), array.length); + var tail = Array(array.length - at); + var length = insert.length; + var i; + for (i = 0; i < tail.length; i++) tail[i] = array[i + at]; + for (i = 0; i < length; i++) array[i + at] = insert[i]; + for (i = 0; i < tail.length; i++) array[i + length + at] = tail[i]; + }; + + // Define the Collection's inheritable methods. + _.extend(Collection.prototype, Events, { + + // The default model for a collection is just a **Backbone.Model**. + // This should be overridden in most cases. + model: Model, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // The JSON representation of a Collection is an array of the + // models' attributes. + toJSON: function(options) { + return this.map(function(model) { return model.toJSON(options); }); + }, + + // Proxy `Backbone.sync` by default. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Add a model, or list of models to the set. `models` may be Backbone + // Models or raw JavaScript objects to be converted to Models, or any + // combination of the two. + add: function(models, options) { + return this.set(models, _.extend({merge: false}, options, addOptions)); + }, + + // Remove a model, or a list of models from the set. + remove: function(models, options) { + options = _.extend({}, options); + var singular = !_.isArray(models); + models = singular ? [models] : models.slice(); + var removed = this._removeModels(models, options); + if (!options.silent && removed.length) { + options.changes = {added: [], merged: [], removed: removed}; + this.trigger('update', this, options); + } + return singular ? removed[0] : removed; + }, + + // Update a collection by `set`-ing a new list of models, adding new ones, + // removing models that are no longer present, and merging models that + // already exist in the collection, as necessary. Similar to **Model#set**, + // the core operation for updating the data contained by the collection. + set: function(models, options) { + if (models == null) return; + + options = _.extend({}, setOptions, options); + if (options.parse && !this._isModel(models)) { + models = this.parse(models, options) || []; + } + + var singular = !_.isArray(models); + models = singular ? [models] : models.slice(); + + var at = options.at; + if (at != null) at = +at; + if (at > this.length) at = this.length; + if (at < 0) at += this.length + 1; + + var set = []; + var toAdd = []; + var toMerge = []; + var toRemove = []; + var modelMap = {}; + + var add = options.add; + var merge = options.merge; + var remove = options.remove; + + var sort = false; + var sortable = this.comparator && at == null && options.sort !== false; + var sortAttr = _.isString(this.comparator) ? this.comparator : null; + + // Turn bare objects into model references, and prevent invalid models + // from being added. + var model, i; + for (i = 0; i < models.length; i++) { + model = models[i]; + + // If a duplicate is found, prevent it from being added and + // optionally merge it into the existing model. + var existing = this.get(model); + if (existing) { + if (merge && model !== existing) { + var attrs = this._isModel(model) ? model.attributes : model; + if (options.parse) attrs = existing.parse(attrs, options); + existing.set(attrs, options); + toMerge.push(existing); + if (sortable && !sort) sort = existing.hasChanged(sortAttr); + } + if (!modelMap[existing.cid]) { + modelMap[existing.cid] = true; + set.push(existing); + } + models[i] = existing; + + // If this is a new, valid model, push it to the `toAdd` list. + } else if (add) { + model = models[i] = this._prepareModel(model, options); + if (model) { + toAdd.push(model); + this._addReference(model, options); + modelMap[model.cid] = true; + set.push(model); + } + } + } + + // Remove stale models. + if (remove) { + for (i = 0; i < this.length; i++) { + model = this.models[i]; + if (!modelMap[model.cid]) toRemove.push(model); + } + if (toRemove.length) this._removeModels(toRemove, options); + } + + // See if sorting is needed, update `length` and splice in new models. + var orderChanged = false; + var replace = !sortable && add && remove; + if (set.length && replace) { + orderChanged = this.length !== set.length || _.some(this.models, function(m, index) { + return m !== set[index]; + }); + this.models.length = 0; + splice(this.models, set, 0); + this.length = this.models.length; + } else if (toAdd.length) { + if (sortable) sort = true; + splice(this.models, toAdd, at == null ? this.length : at); + this.length = this.models.length; + } + + // Silently sort the collection if appropriate. + if (sort) this.sort({silent: true}); + + // Unless silenced, it's time to fire all appropriate add/sort/update events. + if (!options.silent) { + for (i = 0; i < toAdd.length; i++) { + if (at != null) options.index = at + i; + model = toAdd[i]; + model.trigger('add', model, this, options); + } + if (sort || orderChanged) this.trigger('sort', this, options); + if (toAdd.length || toRemove.length || toMerge.length) { + options.changes = { + added: toAdd, + removed: toRemove, + merged: toMerge + }; + this.trigger('update', this, options); + } + } + + // Return the added (or merged) model (or models). + return singular ? models[0] : models; + }, + + // When you have more items than you want to add or remove individually, + // you can reset the entire set with a new list of models, without firing + // any granular `add` or `remove` events. Fires `reset` when finished. + // Useful for bulk operations and optimizations. + reset: function(models, options) { + options = options ? _.clone(options) : {}; + for (var i = 0; i < this.models.length; i++) { + this._removeReference(this.models[i], options); + } + options.previousModels = this.models; + this._reset(); + models = this.add(models, _.extend({silent: true}, options)); + if (!options.silent) this.trigger('reset', this, options); + return models; + }, + + // Add a model to the end of the collection. + push: function(model, options) { + return this.add(model, _.extend({at: this.length}, options)); + }, + + // Remove a model from the end of the collection. + pop: function(options) { + var model = this.at(this.length - 1); + return this.remove(model, options); + }, + + // Add a model to the beginning of the collection. + unshift: function(model, options) { + return this.add(model, _.extend({at: 0}, options)); + }, + + // Remove a model from the beginning of the collection. + shift: function(options) { + var model = this.at(0); + return this.remove(model, options); + }, + + // Slice out a sub-array of models from the collection. + slice: function() { + return slice.apply(this.models, arguments); + }, + + // Get a model from the set by id, cid, model object with id or cid + // properties, or an attributes object that is transformed through modelId. + get: function(obj) { + if (obj == null) return void 0; + return this._byId[obj] || + this._byId[this.modelId(obj.attributes || obj)] || + obj.cid && this._byId[obj.cid]; + }, + + // Returns `true` if the model is in the collection. + has: function(obj) { + return this.get(obj) != null; + }, + + // Get the model at the given index. + at: function(index) { + if (index < 0) index += this.length; + return this.models[index]; + }, + + // Return models with matching attributes. Useful for simple cases of + // `filter`. + where: function(attrs, first) { + return this[first ? 'find' : 'filter'](attrs); + }, + + // Return the first model with matching attributes. Useful for simple cases + // of `find`. + findWhere: function(attrs) { + return this.where(attrs, true); + }, + + // Force the collection to re-sort itself. You don't need to call this under + // normal circumstances, as the set will maintain sort order as each item + // is added. + sort: function(options) { + var comparator = this.comparator; + if (!comparator) throw new Error('Cannot sort a set without a comparator'); + options || (options = {}); + + var length = comparator.length; + if (_.isFunction(comparator)) comparator = _.bind(comparator, this); + + // Run sort based on type of `comparator`. + if (length === 1 || _.isString(comparator)) { + this.models = this.sortBy(comparator); + } else { + this.models.sort(comparator); + } + if (!options.silent) this.trigger('sort', this, options); + return this; + }, + + // Pluck an attribute from each model in the collection. + pluck: function(attr) { + return this.map(attr + ''); + }, + + // Fetch the default set of models for this collection, resetting the + // collection when they arrive. If `reset: true` is passed, the response + // data will be passed through the `reset` method instead of `set`. + fetch: function(options) { + options = _.extend({parse: true}, options); + var success = options.success; + var collection = this; + options.success = function(resp) { + var method = options.reset ? 'reset' : 'set'; + collection[method](resp, options); + if (success) success.call(options.context, collection, resp, options); + collection.trigger('sync', collection, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Create a new instance of a model in this collection. Add the model to the + // collection immediately, unless `wait: true` is passed, in which case we + // wait for the server to agree. + create: function(model, options) { + options = options ? _.clone(options) : {}; + var wait = options.wait; + model = this._prepareModel(model, options); + if (!model) return false; + if (!wait) this.add(model, options); + var collection = this; + var success = options.success; + options.success = function(m, resp, callbackOpts) { + if (wait) collection.add(m, callbackOpts); + if (success) success.call(callbackOpts.context, m, resp, callbackOpts); + }; + model.save(null, options); + return model; + }, + + // **parse** converts a response into a list of models to be added to the + // collection. The default implementation is just to pass it through. + parse: function(resp, options) { + return resp; + }, + + // Create a new collection with an identical list of models as this one. + clone: function() { + return new this.constructor(this.models, { + model: this.model, + comparator: this.comparator + }); + }, + + // Define how to uniquely identify models in the collection. + modelId: function(attrs) { + return attrs[this.model.prototype.idAttribute || 'id']; + }, + + // Private method to reset all internal state. Called when the collection + // is first initialized or reset. + _reset: function() { + this.length = 0; + this.models = []; + this._byId = {}; + }, + + // Prepare a hash of attributes (or other model) to be added to this + // collection. + _prepareModel: function(attrs, options) { + if (this._isModel(attrs)) { + if (!attrs.collection) attrs.collection = this; + return attrs; + } + options = options ? _.clone(options) : {}; + options.collection = this; + var model = new this.model(attrs, options); + if (!model.validationError) return model; + this.trigger('invalid', this, model.validationError, options); + return false; + }, + + // Internal method called by both remove and set. + _removeModels: function(models, options) { + var removed = []; + for (var i = 0; i < models.length; i++) { + var model = this.get(models[i]); + if (!model) continue; + + var index = this.indexOf(model); + this.models.splice(index, 1); + this.length--; + + // Remove references before triggering 'remove' event to prevent an + // infinite loop. #3693 + delete this._byId[model.cid]; + var id = this.modelId(model.attributes); + if (id != null) delete this._byId[id]; + + if (!options.silent) { + options.index = index; + model.trigger('remove', model, this, options); + } + + removed.push(model); + this._removeReference(model, options); + } + return removed; + }, + + // Method for checking whether an object should be considered a model for + // the purposes of adding to the collection. + _isModel: function(model) { + return model instanceof Model; + }, + + // Internal method to create a model's ties to a collection. + _addReference: function(model, options) { + this._byId[model.cid] = model; + var id = this.modelId(model.attributes); + if (id != null) this._byId[id] = model; + model.on('all', this._onModelEvent, this); + }, + + // Internal method to sever a model's ties to a collection. + _removeReference: function(model, options) { + delete this._byId[model.cid]; + var id = this.modelId(model.attributes); + if (id != null) delete this._byId[id]; + if (this === model.collection) delete model.collection; + model.off('all', this._onModelEvent, this); + }, + + // Internal method called every time a model in the set fires an event. + // Sets need to update their indexes when models change ids. All other + // events simply proxy through. "add" and "remove" events that originate + // in other collections are ignored. + _onModelEvent: function(event, model, collection, options) { + if (model) { + if ((event === 'add' || event === 'remove') && collection !== this) return; + if (event === 'destroy') this.remove(model, options); + if (event === 'change') { + var prevId = this.modelId(model.previousAttributes()); + var id = this.modelId(model.attributes); + if (prevId !== id) { + if (prevId != null) delete this._byId[prevId]; + if (id != null) this._byId[id] = model; + } + } + } + this.trigger.apply(this, arguments); + } + + }); + + // Underscore methods that we want to implement on the Collection. + // 90% of the core usefulness of Backbone Collections is actually implemented + // right here: + var collectionMethods = {forEach: 3, each: 3, map: 3, collect: 3, reduce: 0, + foldl: 0, inject: 0, reduceRight: 0, foldr: 0, find: 3, detect: 3, filter: 3, + select: 3, reject: 3, every: 3, all: 3, some: 3, any: 3, include: 3, includes: 3, + contains: 3, invoke: 0, max: 3, min: 3, toArray: 1, size: 1, first: 3, + head: 3, take: 3, initial: 3, rest: 3, tail: 3, drop: 3, last: 3, + without: 0, difference: 0, indexOf: 3, shuffle: 1, lastIndexOf: 3, + isEmpty: 1, chain: 1, sample: 3, partition: 3, groupBy: 3, countBy: 3, + sortBy: 3, indexBy: 3, findIndex: 3, findLastIndex: 3}; + + // Mix in each Underscore method as a proxy to `Collection#models`. + addUnderscoreMethods(Collection, collectionMethods, 'models'); + + // Backbone.View + // ------------- + + // Backbone Views are almost more convention than they are actual code. A View + // is simply a JavaScript object that represents a logical chunk of UI in the + // DOM. This might be a single item, an entire list, a sidebar or panel, or + // even the surrounding frame which wraps your whole app. Defining a chunk of + // UI as a **View** allows you to define your DOM events declaratively, without + // having to worry about render order ... and makes it easy for the view to + // react to specific changes in the state of your models. + + // Creating a Backbone.View creates its initial element outside of the DOM, + // if an existing element is not provided... + var View = Backbone.View = function(options) { + this.cid = _.uniqueId('view'); + _.extend(this, _.pick(options, viewOptions)); + this._ensureElement(); + this.initialize.apply(this, arguments); + }; + + // Cached regex to split keys for `delegate`. + var delegateEventSplitter = /^(\S+)\s*(.*)$/; + + // List of view options to be set as properties. + var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events']; + + // Set up all inheritable **Backbone.View** properties and methods. + _.extend(View.prototype, Events, { + + // The default `tagName` of a View's element is `"div"`. + tagName: 'div', + + // jQuery delegate for element lookup, scoped to DOM elements within the + // current view. This should be preferred to global lookups where possible. + $: function(selector) { + return this.$el.find(selector); + }, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // **render** is the core function that your view should override, in order + // to populate its element (`this.el`), with the appropriate HTML. The + // convention is for **render** to always return `this`. + render: function() { + return this; + }, + + // Remove this view by taking the element out of the DOM, and removing any + // applicable Backbone.Events listeners. + remove: function() { + this._removeElement(); + this.stopListening(); + return this; + }, + + // Remove this view's element from the document and all event listeners + // attached to it. Exposed for subclasses using an alternative DOM + // manipulation API. + _removeElement: function() { + this.$el.remove(); + }, + + // Change the view's element (`this.el` property) and re-delegate the + // view's events on the new element. + setElement: function(element) { + this.undelegateEvents(); + this._setElement(element); + this.delegateEvents(); + return this; + }, + + // Creates the `this.el` and `this.$el` references for this view using the + // given `el`. `el` can be a CSS selector or an HTML string, a jQuery + // context or an element. Subclasses can override this to utilize an + // alternative DOM manipulation API and are only required to set the + // `this.el` property. + _setElement: function(el) { + this.$el = el instanceof Backbone.$ ? el : Backbone.$(el); + this.el = this.$el[0]; + }, + + // Set callbacks, where `this.events` is a hash of + // + // *{"event selector": "callback"}* + // + // { + // 'mousedown .title': 'edit', + // 'click .button': 'save', + // 'click .open': function(e) { ... } + // } + // + // pairs. Callbacks will be bound to the view, with `this` set properly. + // Uses event delegation for efficiency. + // Omitting the selector binds the event to `this.el`. + delegateEvents: function(events) { + events || (events = _.result(this, 'events')); + if (!events) return this; + this.undelegateEvents(); + for (var key in events) { + var method = events[key]; + if (!_.isFunction(method)) method = this[method]; + if (!method) continue; + var match = key.match(delegateEventSplitter); + this.delegate(match[1], match[2], _.bind(method, this)); + } + return this; + }, + + // Add a single event listener to the view's element (or a child element + // using `selector`). This only works for delegate-able events: not `focus`, + // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer. + delegate: function(eventName, selector, listener) { + this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener); + return this; + }, + + // Clears all callbacks previously bound to the view by `delegateEvents`. + // You usually don't need to use this, but may wish to if you have multiple + // Backbone views attached to the same DOM element. + undelegateEvents: function() { + if (this.$el) this.$el.off('.delegateEvents' + this.cid); + return this; + }, + + // A finer-grained `undelegateEvents` for removing a single delegated event. + // `selector` and `listener` are both optional. + undelegate: function(eventName, selector, listener) { + this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener); + return this; + }, + + // Produces a DOM element to be assigned to your view. Exposed for + // subclasses using an alternative DOM manipulation API. + _createElement: function(tagName) { + return document.createElement(tagName); + }, + + // Ensure that the View has a DOM element to render into. + // If `this.el` is a string, pass it through `$()`, take the first + // matching element, and re-assign it to `el`. Otherwise, create + // an element from the `id`, `className` and `tagName` properties. + _ensureElement: function() { + if (!this.el) { + var attrs = _.extend({}, _.result(this, 'attributes')); + if (this.id) attrs.id = _.result(this, 'id'); + if (this.className) attrs['class'] = _.result(this, 'className'); + this.setElement(this._createElement(_.result(this, 'tagName'))); + this._setAttributes(attrs); + } else { + this.setElement(_.result(this, 'el')); + } + }, + + // Set attributes from a hash on this view's element. Exposed for + // subclasses using an alternative DOM manipulation API. + _setAttributes: function(attributes) { + this.$el.attr(attributes); + } + + }); + + // Backbone.sync + // ------------- + + // Override this function to change the manner in which Backbone persists + // models to the server. You will be passed the type of request, and the + // model in question. By default, makes a RESTful Ajax request + // to the model's `url()`. Some possible customizations could be: + // + // * Use `setTimeout` to batch rapid-fire updates into a single request. + // * Send up the models as XML instead of JSON. + // * Persist models via WebSockets instead of Ajax. + // + // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests + // as `POST`, with a `_method` parameter containing the true HTTP method, + // as well as all requests with the body as `application/x-www-form-urlencoded` + // instead of `application/json` with the model in a param named `model`. + // Useful when interfacing with server-side languages like **PHP** that make + // it difficult to read the body of `PUT` requests. + Backbone.sync = function(method, model, options) { + var type = methodMap[method]; + + // Default options, unless specified. + _.defaults(options || (options = {}), { + emulateHTTP: Backbone.emulateHTTP, + emulateJSON: Backbone.emulateJSON + }); + + // Default JSON-request options. + var params = {type: type, dataType: 'json'}; + + // Ensure that we have a URL. + if (!options.url) { + params.url = _.result(model, 'url') || urlError(); + } + + // Ensure that we have the appropriate request data. + if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { + params.contentType = 'application/json'; + params.data = JSON.stringify(options.attrs || model.toJSON(options)); + } + + // For older servers, emulate JSON by encoding the request into an HTML-form. + if (options.emulateJSON) { + params.contentType = 'application/x-www-form-urlencoded'; + params.data = params.data ? {model: params.data} : {}; + } + + // For older servers, emulate HTTP by mimicking the HTTP method with `_method` + // And an `X-HTTP-Method-Override` header. + if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) { + params.type = 'POST'; + if (options.emulateJSON) params.data._method = type; + var beforeSend = options.beforeSend; + options.beforeSend = function(xhr) { + xhr.setRequestHeader('X-HTTP-Method-Override', type); + if (beforeSend) return beforeSend.apply(this, arguments); + }; + } + + // Don't process data on a non-GET request. + if (params.type !== 'GET' && !options.emulateJSON) { + params.processData = false; + } + + // Pass along `textStatus` and `errorThrown` from jQuery. + var error = options.error; + options.error = function(xhr, textStatus, errorThrown) { + options.textStatus = textStatus; + options.errorThrown = errorThrown; + if (error) error.call(options.context, xhr, textStatus, errorThrown); + }; + + // Make the request, allowing the user to override any Ajax options. + var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); + model.trigger('request', model, xhr, options); + return xhr; + }; + + // Map from CRUD to HTTP for our default `Backbone.sync` implementation. + var methodMap = { + 'create': 'POST', + 'update': 'PUT', + 'patch': 'PATCH', + 'delete': 'DELETE', + 'read': 'GET' + }; + + // Set the default implementation of `Backbone.ajax` to proxy through to `$`. + // Override this if you'd like to use a different library. + Backbone.ajax = function() { + return Backbone.$.ajax.apply(Backbone.$, arguments); + }; + + // Backbone.Router + // --------------- + + // Routers map faux-URLs to actions, and fire events when routes are + // matched. Creating a new one sets its `routes` hash, if not set statically. + var Router = Backbone.Router = function(options) { + options || (options = {}); + if (options.routes) this.routes = options.routes; + this._bindRoutes(); + this.initialize.apply(this, arguments); + }; + + // Cached regular expressions for matching named param parts and splatted + // parts of route strings. + var optionalParam = /\((.*?)\)/g; + var namedParam = /(\(\?)?:\w+/g; + var splatParam = /\*\w+/g; + var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; + + // Set up all inheritable **Backbone.Router** properties and methods. + _.extend(Router.prototype, Events, { + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Manually bind a single named route to a callback. For example: + // + // this.route('search/:query/p:num', 'search', function(query, num) { + // ... + // }); + // + route: function(route, name, callback) { + if (!_.isRegExp(route)) route = this._routeToRegExp(route); + if (_.isFunction(name)) { + callback = name; + name = ''; + } + if (!callback) callback = this[name]; + var router = this; + Backbone.history.route(route, function(fragment) { + var args = router._extractParameters(route, fragment); + if (router.execute(callback, args, name) !== false) { + router.trigger.apply(router, ['route:' + name].concat(args)); + router.trigger('route', name, args); + Backbone.history.trigger('route', router, name, args); + } + }); + return this; + }, + + // Execute a route handler with the provided parameters. This is an + // excellent place to do pre-route setup or post-route cleanup. + execute: function(callback, args, name) { + if (callback) callback.apply(this, args); + }, + + // Simple proxy to `Backbone.history` to save a fragment into the history. + navigate: function(fragment, options) { + Backbone.history.navigate(fragment, options); + return this; + }, + + // Bind all defined routes to `Backbone.history`. We have to reverse the + // order of the routes here to support behavior where the most general + // routes can be defined at the bottom of the route map. + _bindRoutes: function() { + if (!this.routes) return; + this.routes = _.result(this, 'routes'); + var route, routes = _.keys(this.routes); + while ((route = routes.pop()) != null) { + this.route(route, this.routes[route]); + } + }, + + // Convert a route string into a regular expression, suitable for matching + // against the current location hash. + _routeToRegExp: function(route) { + route = route.replace(escapeRegExp, '\\$&') + .replace(optionalParam, '(?:$1)?') + .replace(namedParam, function(match, optional) { + return optional ? match : '([^/?]+)'; + }) + .replace(splatParam, '([^?]*?)'); + return new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$'); + }, + + // Given a route, and a URL fragment that it matches, return the array of + // extracted decoded parameters. Empty or unmatched parameters will be + // treated as `null` to normalize cross-browser behavior. + _extractParameters: function(route, fragment) { + var params = route.exec(fragment).slice(1); + return _.map(params, function(param, i) { + // Don't decode the search params. + if (i === params.length - 1) return param || null; + return param ? decodeURIComponent(param) : null; + }); + } + + }); + + // Backbone.History + // ---------------- + + // Handles cross-browser history management, based on either + // [pushState](http://diveintohtml5.info/history.html) and real URLs, or + // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) + // and URL fragments. If the browser supports neither (old IE, natch), + // falls back to polling. + var History = Backbone.History = function() { + this.handlers = []; + this.checkUrl = _.bind(this.checkUrl, this); + + // Ensure that `History` can be used outside of the browser. + if (typeof window !== 'undefined') { + this.location = window.location; + this.history = window.history; + } + }; + + // Cached regex for stripping a leading hash/slash and trailing space. + var routeStripper = /^[#\/]|\s+$/g; + + // Cached regex for stripping leading and trailing slashes. + var rootStripper = /^\/+|\/+$/g; + + // Cached regex for stripping urls of hash. + var pathStripper = /#.*$/; + + // Has the history handling already been started? + History.started = false; + + // Set up all inheritable **Backbone.History** properties and methods. + _.extend(History.prototype, Events, { + + // The default interval to poll for hash changes, if necessary, is + // twenty times a second. + interval: 50, + + // Are we at the app root? + atRoot: function() { + var path = this.location.pathname.replace(/[^\/]$/, '$&/'); + return path === this.root && !this.getSearch(); + }, + + // Does the pathname match the root? + matchRoot: function() { + var path = this.decodeFragment(this.location.pathname); + var rootPath = path.slice(0, this.root.length - 1) + '/'; + return rootPath === this.root; + }, + + // Unicode characters in `location.pathname` are percent encoded so they're + // decoded for comparison. `%25` should not be decoded since it may be part + // of an encoded parameter. + decodeFragment: function(fragment) { + return decodeURI(fragment.replace(/%25/g, '%2525')); + }, + + // In IE6, the hash fragment and search params are incorrect if the + // fragment contains `?`. + getSearch: function() { + var match = this.location.href.replace(/#.*/, '').match(/\?.+/); + return match ? match[0] : ''; + }, + + // Gets the true hash value. Cannot use location.hash directly due to bug + // in Firefox where location.hash will always be decoded. + getHash: function(window) { + var match = (window || this).location.href.match(/#(.*)$/); + return match ? match[1] : ''; + }, + + // Get the pathname and search params, without the root. + getPath: function() { + var path = this.decodeFragment( + this.location.pathname + this.getSearch() + ).slice(this.root.length - 1); + return path.charAt(0) === '/' ? path.slice(1) : path; + }, + + // Get the cross-browser normalized URL fragment from the path or hash. + getFragment: function(fragment) { + if (fragment == null) { + if (this._usePushState || !this._wantsHashChange) { + fragment = this.getPath(); + } else { + fragment = this.getHash(); + } + } + return fragment.replace(routeStripper, ''); + }, + + // Start the hash change handling, returning `true` if the current URL matches + // an existing route, and `false` otherwise. + start: function(options) { + if (History.started) throw new Error('Backbone.history has already been started'); + History.started = true; + + // Figure out the initial configuration. Do we need an iframe? + // Is pushState desired ... is it available? + this.options = _.extend({root: '/'}, this.options, options); + this.root = this.options.root; + this._wantsHashChange = this.options.hashChange !== false; + this._hasHashChange = 'onhashchange' in window && (document.documentMode === void 0 || document.documentMode > 7); + this._useHashChange = this._wantsHashChange && this._hasHashChange; + this._wantsPushState = !!this.options.pushState; + this._hasPushState = !!(this.history && this.history.pushState); + this._usePushState = this._wantsPushState && this._hasPushState; + this.fragment = this.getFragment(); + + // Normalize root to always include a leading and trailing slash. + this.root = ('/' + this.root + '/').replace(rootStripper, '/'); + + // Transition from hashChange to pushState or vice versa if both are + // requested. + if (this._wantsHashChange && this._wantsPushState) { + + // If we've started off with a route from a `pushState`-enabled + // browser, but we're currently in a browser that doesn't support it... + if (!this._hasPushState && !this.atRoot()) { + var rootPath = this.root.slice(0, -1) || '/'; + this.location.replace(rootPath + '#' + this.getPath()); + // Return immediately as browser will do redirect to new url + return true; + + // Or if we've started out with a hash-based route, but we're currently + // in a browser where it could be `pushState`-based instead... + } else if (this._hasPushState && this.atRoot()) { + this.navigate(this.getHash(), {replace: true}); + } + + } + + // Proxy an iframe to handle location events if the browser doesn't + // support the `hashchange` event, HTML5 history, or the user wants + // `hashChange` but not `pushState`. + if (!this._hasHashChange && this._wantsHashChange && !this._usePushState) { + this.iframe = document.createElement('iframe'); + this.iframe.src = 'javascript:0'; + this.iframe.style.display = 'none'; + this.iframe.tabIndex = -1; + var body = document.body; + // Using `appendChild` will throw on IE < 9 if the document is not ready. + var iWindow = body.insertBefore(this.iframe, body.firstChild).contentWindow; + iWindow.document.open(); + iWindow.document.close(); + iWindow.location.hash = '#' + this.fragment; + } + + // Add a cross-platform `addEventListener` shim for older browsers. + var addEventListener = window.addEventListener || function(eventName, listener) { + return attachEvent('on' + eventName, listener); + }; + + // Depending on whether we're using pushState or hashes, and whether + // 'onhashchange' is supported, determine how we check the URL state. + if (this._usePushState) { + addEventListener('popstate', this.checkUrl, false); + } else if (this._useHashChange && !this.iframe) { + addEventListener('hashchange', this.checkUrl, false); + } else if (this._wantsHashChange) { + this._checkUrlInterval = setInterval(this.checkUrl, this.interval); + } + + if (!this.options.silent) return this.loadUrl(); + }, + + // Disable Backbone.history, perhaps temporarily. Not useful in a real app, + // but possibly useful for unit testing Routers. + stop: function() { + // Add a cross-platform `removeEventListener` shim for older browsers. + var removeEventListener = window.removeEventListener || function(eventName, listener) { + return detachEvent('on' + eventName, listener); + }; + + // Remove window listeners. + if (this._usePushState) { + removeEventListener('popstate', this.checkUrl, false); + } else if (this._useHashChange && !this.iframe) { + removeEventListener('hashchange', this.checkUrl, false); + } + + // Clean up the iframe if necessary. + if (this.iframe) { + document.body.removeChild(this.iframe); + this.iframe = null; + } + + // Some environments will throw when clearing an undefined interval. + if (this._checkUrlInterval) clearInterval(this._checkUrlInterval); + History.started = false; + }, + + // Add a route to be tested when the fragment changes. Routes added later + // may override previous routes. + route: function(route, callback) { + this.handlers.unshift({route: route, callback: callback}); + }, + + // Checks the current URL to see if it has changed, and if it has, + // calls `loadUrl`, normalizing across the hidden iframe. + checkUrl: function(e) { + var current = this.getFragment(); + + // If the user pressed the back button, the iframe's hash will have + // changed and we should use that for comparison. + if (current === this.fragment && this.iframe) { + current = this.getHash(this.iframe.contentWindow); + } + + if (current === this.fragment) return false; + if (this.iframe) this.navigate(current); + this.loadUrl(); + }, + + // Attempt to load the current URL fragment. If a route succeeds with a + // match, returns `true`. If no defined routes matches the fragment, + // returns `false`. + loadUrl: function(fragment) { + // If the root doesn't match, no routes can match either. + if (!this.matchRoot()) return false; + fragment = this.fragment = this.getFragment(fragment); + return _.some(this.handlers, function(handler) { + if (handler.route.test(fragment)) { + handler.callback(fragment); + return true; + } + }); + }, + + // Save a fragment into the hash history, or replace the URL state if the + // 'replace' option is passed. You are responsible for properly URL-encoding + // the fragment in advance. + // + // The options object can contain `trigger: true` if you wish to have the + // route callback be fired (not usually desirable), or `replace: true`, if + // you wish to modify the current URL without adding an entry to the history. + navigate: function(fragment, options) { + if (!History.started) return false; + if (!options || options === true) options = {trigger: !!options}; + + // Normalize the fragment. + fragment = this.getFragment(fragment || ''); + + // Don't include a trailing slash on the root. + var rootPath = this.root; + if (fragment === '' || fragment.charAt(0) === '?') { + rootPath = rootPath.slice(0, -1) || '/'; + } + var url = rootPath + fragment; + + // Strip the hash and decode for matching. + fragment = this.decodeFragment(fragment.replace(pathStripper, '')); + + if (this.fragment === fragment) return; + this.fragment = fragment; + + // If pushState is available, we use it to set the fragment as a real URL. + if (this._usePushState) { + this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url); + + // If hash changes haven't been explicitly disabled, update the hash + // fragment to store history. + } else if (this._wantsHashChange) { + this._updateHash(this.location, fragment, options.replace); + if (this.iframe && fragment !== this.getHash(this.iframe.contentWindow)) { + var iWindow = this.iframe.contentWindow; + + // Opening and closing the iframe tricks IE7 and earlier to push a + // history entry on hash-tag change. When replace is true, we don't + // want this. + if (!options.replace) { + iWindow.document.open(); + iWindow.document.close(); + } + + this._updateHash(iWindow.location, fragment, options.replace); + } + + // If you've told us that you explicitly don't want fallback hashchange- + // based history, then `navigate` becomes a page refresh. + } else { + return this.location.assign(url); + } + if (options.trigger) return this.loadUrl(fragment); + }, + + // Update the hash location, either replacing the current entry, or adding + // a new one to the browser history. + _updateHash: function(location, fragment, replace) { + if (replace) { + var href = location.href.replace(/(javascript:|#).*$/, ''); + location.replace(href + '#' + fragment); + } else { + // Some browsers require that `hash` contains a leading #. + location.hash = '#' + fragment; + } + } + + }); + + // Create the default Backbone.history. + Backbone.history = new History; + + // Helpers + // ------- + + // Helper function to correctly set up the prototype chain for subclasses. + // Similar to `goog.inherits`, but uses a hash of prototype properties and + // class properties to be extended. + var extend = function(protoProps, staticProps) { + var parent = this; + var child; + + // The constructor function for the new subclass is either defined by you + // (the "constructor" property in your `extend` definition), or defaulted + // by us to simply call the parent constructor. + if (protoProps && _.has(protoProps, 'constructor')) { + child = protoProps.constructor; + } else { + child = function(){ return parent.apply(this, arguments); }; + } + + // Add static properties to the constructor function, if supplied. + _.extend(child, parent, staticProps); + + // Set the prototype chain to inherit from `parent`, without calling + // `parent`'s constructor function and add the prototype properties. + child.prototype = _.create(parent.prototype, protoProps); + child.prototype.constructor = child; + + // Set a convenience property in case the parent's prototype is needed + // later. + child.__super__ = parent.prototype; + + return child; + }; + + // Set up inheritance for the model, collection, router, view and history. + Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend; + + // Throw an error when a URL is needed, and none is supplied. + var urlError = function() { + throw new Error('A "url" property or function must be specified'); + }; + + // Wrap an optional error callback with a fallback error event. + var wrapError = function(model, options) { + var error = options.error; + options.error = function(resp) { + if (error) error.call(options.context, model, resp, options); + model.trigger('error', model, resp, options); + }; + }; + + return Backbone; +}); diff --git a/static/base.css b/static/base.css new file mode 100644 index 0000000..9ecbb54 --- /dev/null +++ b/static/base.css @@ -0,0 +1,5174 @@ +/* + Base styl-file + Fetches defaults from sweep with additions and overrides +*/ +.fill-red { + background-color: #e51c23; +} +.fill-red .fill-minus-1, +.fill-red.fill-minus-1 { + background-color: #e84e40; +} +.fill-red .fill-minus-2, +.fill-red.fill-minus-2 { + background-color: #f36c60; +} +.fill-red .fill-minus-3, +.fill-red.fill-minus-3 { + background-color: #f69988; +} +.fill-red .fill-minus-4, +.fill-red.fill-minus-4 { + background-color: #f9bdbb; +} +.fill-red .fill-minus-5, +.fill-red.fill-minus-5 { + background-color: #fde0dc; +} +.fill-red .fill-plus-1, +.fill-red.fill-plus-1 { + background-color: #dd191d; +} +.fill-red .fill-plus-2, +.fill-red.fill-plus-2 { + background-color: #d01716; +} +.fill-red .fill-plus-3, +.fill-red.fill-plus-3 { + background-color: #c41411; +} +.fill-red .fill-plus-4, +.fill-red.fill-plus-4 { + background-color: #b0120a; +} +.fill-red .fill-accent-1, +.fill-red.fill-accent-1 { + background-color: #ff7997; +} +.fill-red .fill-accent-2, +.fill-red.fill-accent-2 { + background-color: #ff5177; +} +.fill-red .fill-accent-3, +.fill-red.fill-accent-3 { + background-color: #ff2d6f; +} +.fill-red .fill-accent-4, +.fill-red.fill-accent-4 { + background-color: #e00032; +} +.fill-red .fill-base, +.fill-red.fill-base { + background-color: #e51c23; +} +.text-red { + color: #e51c23; +} +.text-red .text-minus-1, +.text-red.text-minus-1 { + color: #e84e40; +} +.text-red .text-minus-2, +.text-red.text-minus-2 { + color: #f36c60; +} +.text-red .text-minus-3, +.text-red.text-minus-3 { + color: #f69988; +} +.text-red .text-minus-4, +.text-red.text-minus-4 { + color: #f9bdbb; +} +.text-red .text-minus-5, +.text-red.text-minus-5 { + color: #fde0dc; +} +.text-red .text-plus-1, +.text-red.text-plus-1 { + color: #dd191d; +} +.text-red .text-plus-2, +.text-red.text-plus-2 { + color: #d01716; +} +.text-red .text-plus-3, +.text-red.text-plus-3 { + color: #c41411; +} +.text-red .text-plus-4, +.text-red.text-plus-4 { + color: #b0120a; +} +.text-red .text-accent-1, +.text-red.text-accent-1 { + color: #ff7997; +} +.text-red .text-accent-2, +.text-red.text-accent-2 { + color: #ff5177; +} +.text-red .text-accent-3, +.text-red.text-accent-3 { + color: #ff2d6f; +} +.text-red .text-accent-4, +.text-red.text-accent-4 { + color: #e00032; +} +.text-red .text-base, +.text-red.text-base { + color: #e51c23; +} +.border-red { + border-color: #e51c23; +} +.border-red .border-minus-1, +.border-red.border-minus-1 { + border-color: #e84e40; +} +.border-red .border-minus-2, +.border-red.border-minus-2 { + border-color: #f36c60; +} +.border-red .border-minus-3, +.border-red.border-minus-3 { + border-color: #f69988; +} +.border-red .border-minus-4, +.border-red.border-minus-4 { + border-color: #f9bdbb; +} +.border-red .border-minus-5, +.border-red.border-minus-5 { + border-color: #fde0dc; +} +.border-red .border-plus-1, +.border-red.border-plus-1 { + border-color: #dd191d; +} +.border-red .border-plus-2, +.border-red.border-plus-2 { + border-color: #d01716; +} +.border-red .border-plus-3, +.border-red.border-plus-3 { + border-color: #c41411; +} +.border-red .border-plus-4, +.border-red.border-plus-4 { + border-color: #b0120a; +} +.border-red .border-accent-1, +.border-red.border-accent-1 { + border-color: #ff7997; +} +.border-red .border-accent-2, +.border-red.border-accent-2 { + border-color: #ff5177; +} +.border-red .border-accent-3, +.border-red.border-accent-3 { + border-color: #ff2d6f; +} +.border-red .border-accent-4, +.border-red.border-accent-4 { + border-color: #e00032; +} +.border-red .border-base, +.border-red.border-base { + border-color: #e51c23; +} +.fill-pink { + background-color: #e91e63; +} +.fill-pink .fill-minus-1, +.fill-pink.fill-minus-1 { + background-color: #ec407a; +} +.fill-pink .fill-minus-2, +.fill-pink.fill-minus-2 { + background-color: #f06292; +} +.fill-pink .fill-minus-3, +.fill-pink.fill-minus-3 { + background-color: #f48fb1; +} +.fill-pink .fill-minus-4, +.fill-pink.fill-minus-4 { + background-color: #f8bbd0; +} +.fill-pink .fill-minus-5, +.fill-pink.fill-minus-5 { + background-color: #fce4ec; +} +.fill-pink .fill-plus-1, +.fill-pink.fill-plus-1 { + background-color: #d81b60; +} +.fill-pink .fill-plus-2, +.fill-pink.fill-plus-2 { + background-color: #c2185b; +} +.fill-pink .fill-plus-3, +.fill-pink.fill-plus-3 { + background-color: #ad1457; +} +.fill-pink .fill-plus-4, +.fill-pink.fill-plus-4 { + background-color: #880e4f; +} +.fill-pink .fill-accent-1, +.fill-pink.fill-accent-1 { + background-color: #ff80ab; +} +.fill-pink .fill-accent-2, +.fill-pink.fill-accent-2 { + background-color: #ff4081; +} +.fill-pink .fill-accent-3, +.fill-pink.fill-accent-3 { + background-color: #f50057; +} +.fill-pink .fill-accent-4, +.fill-pink.fill-accent-4 { + background-color: #c51162; +} +.fill-pink .fill-base, +.fill-pink.fill-base { + background-color: #e91e63; +} +.text-pink { + color: #e91e63; +} +.text-pink .text-minus-1, +.text-pink.text-minus-1 { + color: #ec407a; +} +.text-pink .text-minus-2, +.text-pink.text-minus-2 { + color: #f06292; +} +.text-pink .text-minus-3, +.text-pink.text-minus-3 { + color: #f48fb1; +} +.text-pink .text-minus-4, +.text-pink.text-minus-4 { + color: #f8bbd0; +} +.text-pink .text-minus-5, +.text-pink.text-minus-5 { + color: #fce4ec; +} +.text-pink .text-plus-1, +.text-pink.text-plus-1 { + color: #d81b60; +} +.text-pink .text-plus-2, +.text-pink.text-plus-2 { + color: #c2185b; +} +.text-pink .text-plus-3, +.text-pink.text-plus-3 { + color: #ad1457; +} +.text-pink .text-plus-4, +.text-pink.text-plus-4 { + color: #880e4f; +} +.text-pink .text-accent-1, +.text-pink.text-accent-1 { + color: #ff80ab; +} +.text-pink .text-accent-2, +.text-pink.text-accent-2 { + color: #ff4081; +} +.text-pink .text-accent-3, +.text-pink.text-accent-3 { + color: #f50057; +} +.text-pink .text-accent-4, +.text-pink.text-accent-4 { + color: #c51162; +} +.text-pink .text-base, +.text-pink.text-base { + color: #e91e63; +} +.border-pink { + border-color: #e91e63; +} +.border-pink .border-minus-1, +.border-pink.border-minus-1 { + border-color: #ec407a; +} +.border-pink .border-minus-2, +.border-pink.border-minus-2 { + border-color: #f06292; +} +.border-pink .border-minus-3, +.border-pink.border-minus-3 { + border-color: #f48fb1; +} +.border-pink .border-minus-4, +.border-pink.border-minus-4 { + border-color: #f8bbd0; +} +.border-pink .border-minus-5, +.border-pink.border-minus-5 { + border-color: #fce4ec; +} +.border-pink .border-plus-1, +.border-pink.border-plus-1 { + border-color: #d81b60; +} +.border-pink .border-plus-2, +.border-pink.border-plus-2 { + border-color: #c2185b; +} +.border-pink .border-plus-3, +.border-pink.border-plus-3 { + border-color: #ad1457; +} +.border-pink .border-plus-4, +.border-pink.border-plus-4 { + border-color: #880e4f; +} +.border-pink .border-accent-1, +.border-pink.border-accent-1 { + border-color: #ff80ab; +} +.border-pink .border-accent-2, +.border-pink.border-accent-2 { + border-color: #ff4081; +} +.border-pink .border-accent-3, +.border-pink.border-accent-3 { + border-color: #f50057; +} +.border-pink .border-accent-4, +.border-pink.border-accent-4 { + border-color: #c51162; +} +.border-pink .border-base, +.border-pink.border-base { + border-color: #e91e63; +} +.fill-purple { + background-color: #9c27b0; +} +.fill-purple .fill-minus-1, +.fill-purple.fill-minus-1 { + background-color: #ab47bc; +} +.fill-purple .fill-minus-2, +.fill-purple.fill-minus-2 { + background-color: #ba68c8; +} +.fill-purple .fill-minus-3, +.fill-purple.fill-minus-3 { + background-color: #ce93d8; +} +.fill-purple .fill-minus-4, +.fill-purple.fill-minus-4 { + background-color: #e1bee7; +} +.fill-purple .fill-minus-5, +.fill-purple.fill-minus-5 { + background-color: #f3e5f5; +} +.fill-purple .fill-plus-1, +.fill-purple.fill-plus-1 { + background-color: #8e24aa; +} +.fill-purple .fill-plus-2, +.fill-purple.fill-plus-2 { + background-color: #7b1fa2; +} +.fill-purple .fill-plus-3, +.fill-purple.fill-plus-3 { + background-color: #6a1b9a; +} +.fill-purple .fill-plus-4, +.fill-purple.fill-plus-4 { + background-color: #4a148c; +} +.fill-purple .fill-accent-1, +.fill-purple.fill-accent-1 { + background-color: #ea80fc; +} +.fill-purple .fill-accent-2, +.fill-purple.fill-accent-2 { + background-color: #e040fb; +} +.fill-purple .fill-accent-3, +.fill-purple.fill-accent-3 { + background-color: #d500f9; +} +.fill-purple .fill-accent-4, +.fill-purple.fill-accent-4 { + background-color: #a0f; +} +.fill-purple .fill-base, +.fill-purple.fill-base { + background-color: #9c27b0; +} +.text-purple { + color: #9c27b0; +} +.text-purple .text-minus-1, +.text-purple.text-minus-1 { + color: #ab47bc; +} +.text-purple .text-minus-2, +.text-purple.text-minus-2 { + color: #ba68c8; +} +.text-purple .text-minus-3, +.text-purple.text-minus-3 { + color: #ce93d8; +} +.text-purple .text-minus-4, +.text-purple.text-minus-4 { + color: #e1bee7; +} +.text-purple .text-minus-5, +.text-purple.text-minus-5 { + color: #f3e5f5; +} +.text-purple .text-plus-1, +.text-purple.text-plus-1 { + color: #8e24aa; +} +.text-purple .text-plus-2, +.text-purple.text-plus-2 { + color: #7b1fa2; +} +.text-purple .text-plus-3, +.text-purple.text-plus-3 { + color: #6a1b9a; +} +.text-purple .text-plus-4, +.text-purple.text-plus-4 { + color: #4a148c; +} +.text-purple .text-accent-1, +.text-purple.text-accent-1 { + color: #ea80fc; +} +.text-purple .text-accent-2, +.text-purple.text-accent-2 { + color: #e040fb; +} +.text-purple .text-accent-3, +.text-purple.text-accent-3 { + color: #d500f9; +} +.text-purple .text-accent-4, +.text-purple.text-accent-4 { + color: #a0f; +} +.text-purple .text-base, +.text-purple.text-base { + color: #9c27b0; +} +.border-purple { + border-color: #9c27b0; +} +.border-purple .border-minus-1, +.border-purple.border-minus-1 { + border-color: #ab47bc; +} +.border-purple .border-minus-2, +.border-purple.border-minus-2 { + border-color: #ba68c8; +} +.border-purple .border-minus-3, +.border-purple.border-minus-3 { + border-color: #ce93d8; +} +.border-purple .border-minus-4, +.border-purple.border-minus-4 { + border-color: #e1bee7; +} +.border-purple .border-minus-5, +.border-purple.border-minus-5 { + border-color: #f3e5f5; +} +.border-purple .border-plus-1, +.border-purple.border-plus-1 { + border-color: #8e24aa; +} +.border-purple .border-plus-2, +.border-purple.border-plus-2 { + border-color: #7b1fa2; +} +.border-purple .border-plus-3, +.border-purple.border-plus-3 { + border-color: #6a1b9a; +} +.border-purple .border-plus-4, +.border-purple.border-plus-4 { + border-color: #4a148c; +} +.border-purple .border-accent-1, +.border-purple.border-accent-1 { + border-color: #ea80fc; +} +.border-purple .border-accent-2, +.border-purple.border-accent-2 { + border-color: #e040fb; +} +.border-purple .border-accent-3, +.border-purple.border-accent-3 { + border-color: #d500f9; +} +.border-purple .border-accent-4, +.border-purple.border-accent-4 { + border-color: #a0f; +} +.border-purple .border-base, +.border-purple.border-base { + border-color: #9c27b0; +} +.fill-deep-purple { + background-color: #673ab7; +} +.fill-deep-purple .fill-minus-1, +.fill-deep-purple.fill-minus-1 { + background-color: #7e57c2; +} +.fill-deep-purple .fill-minus-2, +.fill-deep-purple.fill-minus-2 { + background-color: #9575cd; +} +.fill-deep-purple .fill-minus-3, +.fill-deep-purple.fill-minus-3 { + background-color: #b39ddb; +} +.fill-deep-purple .fill-minus-4, +.fill-deep-purple.fill-minus-4 { + background-color: #d1c4e9; +} +.fill-deep-purple .fill-minus-5, +.fill-deep-purple.fill-minus-5 { + background-color: #ede7f6; +} +.fill-deep-purple .fill-plus-1, +.fill-deep-purple.fill-plus-1 { + background-color: #5e35b1; +} +.fill-deep-purple .fill-plus-2, +.fill-deep-purple.fill-plus-2 { + background-color: #512da8; +} +.fill-deep-purple .fill-plus-3, +.fill-deep-purple.fill-plus-3 { + background-color: #4527a0; +} +.fill-deep-purple .fill-plus-4, +.fill-deep-purple.fill-plus-4 { + background-color: #311b92; +} +.fill-deep-purple .fill-accent-1, +.fill-deep-purple.fill-accent-1 { + background-color: #b388ff; +} +.fill-deep-purple .fill-accent-2, +.fill-deep-purple.fill-accent-2 { + background-color: #7c4dff; +} +.fill-deep-purple .fill-accent-3, +.fill-deep-purple.fill-accent-3 { + background-color: #651fff; +} +.fill-deep-purple .fill-accent-4, +.fill-deep-purple.fill-accent-4 { + background-color: #6200ea; +} +.fill-deep-purple .fill-base, +.fill-deep-purple.fill-base { + background-color: #673ab7; +} +.text-deep-purple { + color: #673ab7; +} +.text-deep-purple .text-minus-1, +.text-deep-purple.text-minus-1 { + color: #7e57c2; +} +.text-deep-purple .text-minus-2, +.text-deep-purple.text-minus-2 { + color: #9575cd; +} +.text-deep-purple .text-minus-3, +.text-deep-purple.text-minus-3 { + color: #b39ddb; +} +.text-deep-purple .text-minus-4, +.text-deep-purple.text-minus-4 { + color: #d1c4e9; +} +.text-deep-purple .text-minus-5, +.text-deep-purple.text-minus-5 { + color: #ede7f6; +} +.text-deep-purple .text-plus-1, +.text-deep-purple.text-plus-1 { + color: #5e35b1; +} +.text-deep-purple .text-plus-2, +.text-deep-purple.text-plus-2 { + color: #512da8; +} +.text-deep-purple .text-plus-3, +.text-deep-purple.text-plus-3 { + color: #4527a0; +} +.text-deep-purple .text-plus-4, +.text-deep-purple.text-plus-4 { + color: #311b92; +} +.text-deep-purple .text-accent-1, +.text-deep-purple.text-accent-1 { + color: #b388ff; +} +.text-deep-purple .text-accent-2, +.text-deep-purple.text-accent-2 { + color: #7c4dff; +} +.text-deep-purple .text-accent-3, +.text-deep-purple.text-accent-3 { + color: #651fff; +} +.text-deep-purple .text-accent-4, +.text-deep-purple.text-accent-4 { + color: #6200ea; +} +.text-deep-purple .text-base, +.text-deep-purple.text-base { + color: #673ab7; +} +.border-deep-purple { + border-color: #673ab7; +} +.border-deep-purple .border-minus-1, +.border-deep-purple.border-minus-1 { + border-color: #7e57c2; +} +.border-deep-purple .border-minus-2, +.border-deep-purple.border-minus-2 { + border-color: #9575cd; +} +.border-deep-purple .border-minus-3, +.border-deep-purple.border-minus-3 { + border-color: #b39ddb; +} +.border-deep-purple .border-minus-4, +.border-deep-purple.border-minus-4 { + border-color: #d1c4e9; +} +.border-deep-purple .border-minus-5, +.border-deep-purple.border-minus-5 { + border-color: #ede7f6; +} +.border-deep-purple .border-plus-1, +.border-deep-purple.border-plus-1 { + border-color: #5e35b1; +} +.border-deep-purple .border-plus-2, +.border-deep-purple.border-plus-2 { + border-color: #512da8; +} +.border-deep-purple .border-plus-3, +.border-deep-purple.border-plus-3 { + border-color: #4527a0; +} +.border-deep-purple .border-plus-4, +.border-deep-purple.border-plus-4 { + border-color: #311b92; +} +.border-deep-purple .border-accent-1, +.border-deep-purple.border-accent-1 { + border-color: #b388ff; +} +.border-deep-purple .border-accent-2, +.border-deep-purple.border-accent-2 { + border-color: #7c4dff; +} +.border-deep-purple .border-accent-3, +.border-deep-purple.border-accent-3 { + border-color: #651fff; +} +.border-deep-purple .border-accent-4, +.border-deep-purple.border-accent-4 { + border-color: #6200ea; +} +.border-deep-purple .border-base, +.border-deep-purple.border-base { + border-color: #673ab7; +} +.fill-indigo { + background-color: #3f51b5; +} +.fill-indigo .fill-minus-1, +.fill-indigo.fill-minus-1 { + background-color: #5c6bc0; +} +.fill-indigo .fill-minus-2, +.fill-indigo.fill-minus-2 { + background-color: #7986cb; +} +.fill-indigo .fill-minus-3, +.fill-indigo.fill-minus-3 { + background-color: #9fa8da; +} +.fill-indigo .fill-minus-4, +.fill-indigo.fill-minus-4 { + background-color: #c5cae9; +} +.fill-indigo .fill-minus-5, +.fill-indigo.fill-minus-5 { + background-color: #e8eaf6; +} +.fill-indigo .fill-plus-1, +.fill-indigo.fill-plus-1 { + background-color: #3949ab; +} +.fill-indigo .fill-plus-2, +.fill-indigo.fill-plus-2 { + background-color: #303f9f; +} +.fill-indigo .fill-plus-3, +.fill-indigo.fill-plus-3 { + background-color: #283593; +} +.fill-indigo .fill-plus-4, +.fill-indigo.fill-plus-4 { + background-color: #1a237e; +} +.fill-indigo .fill-accent-1, +.fill-indigo.fill-accent-1 { + background-color: #8c9eff; +} +.fill-indigo .fill-accent-2, +.fill-indigo.fill-accent-2 { + background-color: #536dfe; +} +.fill-indigo .fill-accent-3, +.fill-indigo.fill-accent-3 { + background-color: #536dfe; +} +.fill-indigo .fill-accent-4, +.fill-indigo.fill-accent-4 { + background-color: #304ffe; +} +.fill-indigo .fill-base, +.fill-indigo.fill-base { + background-color: #3f51b5; +} +.text-indigo { + color: #3f51b5; +} +.text-indigo .text-minus-1, +.text-indigo.text-minus-1 { + color: #5c6bc0; +} +.text-indigo .text-minus-2, +.text-indigo.text-minus-2 { + color: #7986cb; +} +.text-indigo .text-minus-3, +.text-indigo.text-minus-3 { + color: #9fa8da; +} +.text-indigo .text-minus-4, +.text-indigo.text-minus-4 { + color: #c5cae9; +} +.text-indigo .text-minus-5, +.text-indigo.text-minus-5 { + color: #e8eaf6; +} +.text-indigo .text-plus-1, +.text-indigo.text-plus-1 { + color: #3949ab; +} +.text-indigo .text-plus-2, +.text-indigo.text-plus-2 { + color: #303f9f; +} +.text-indigo .text-plus-3, +.text-indigo.text-plus-3 { + color: #283593; +} +.text-indigo .text-plus-4, +.text-indigo.text-plus-4 { + color: #1a237e; +} +.text-indigo .text-accent-1, +.text-indigo.text-accent-1 { + color: #8c9eff; +} +.text-indigo .text-accent-2, +.text-indigo.text-accent-2 { + color: #536dfe; +} +.text-indigo .text-accent-3, +.text-indigo.text-accent-3 { + color: #536dfe; +} +.text-indigo .text-accent-4, +.text-indigo.text-accent-4 { + color: #304ffe; +} +.text-indigo .text-base, +.text-indigo.text-base { + color: #3f51b5; +} +.border-indigo { + border-color: #3f51b5; +} +.border-indigo .border-minus-1, +.border-indigo.border-minus-1 { + border-color: #5c6bc0; +} +.border-indigo .border-minus-2, +.border-indigo.border-minus-2 { + border-color: #7986cb; +} +.border-indigo .border-minus-3, +.border-indigo.border-minus-3 { + border-color: #9fa8da; +} +.border-indigo .border-minus-4, +.border-indigo.border-minus-4 { + border-color: #c5cae9; +} +.border-indigo .border-minus-5, +.border-indigo.border-minus-5 { + border-color: #e8eaf6; +} +.border-indigo .border-plus-1, +.border-indigo.border-plus-1 { + border-color: #3949ab; +} +.border-indigo .border-plus-2, +.border-indigo.border-plus-2 { + border-color: #303f9f; +} +.border-indigo .border-plus-3, +.border-indigo.border-plus-3 { + border-color: #283593; +} +.border-indigo .border-plus-4, +.border-indigo.border-plus-4 { + border-color: #1a237e; +} +.border-indigo .border-accent-1, +.border-indigo.border-accent-1 { + border-color: #8c9eff; +} +.border-indigo .border-accent-2, +.border-indigo.border-accent-2 { + border-color: #536dfe; +} +.border-indigo .border-accent-3, +.border-indigo.border-accent-3 { + border-color: #536dfe; +} +.border-indigo .border-accent-4, +.border-indigo.border-accent-4 { + border-color: #304ffe; +} +.border-indigo .border-base, +.border-indigo.border-base { + border-color: #3f51b5; +} +.fill-light-blue { + background-color: #03a9f4; +} +.fill-light-blue .fill-minus-1, +.fill-light-blue.fill-minus-1 { + background-color: #29b6f6; +} +.fill-light-blue .fill-minus-2, +.fill-light-blue.fill-minus-2 { + background-color: #4fc3f7; +} +.fill-light-blue .fill-minus-3, +.fill-light-blue.fill-minus-3 { + background-color: #81d4fa; +} +.fill-light-blue .fill-minus-4, +.fill-light-blue.fill-minus-4 { + background-color: #b3e5fc; +} +.fill-light-blue .fill-minus-5, +.fill-light-blue.fill-minus-5 { + background-color: #e1f5fe; +} +.fill-light-blue .fill-plus-1, +.fill-light-blue.fill-plus-1 { + background-color: #039be5; +} +.fill-light-blue .fill-plus-2, +.fill-light-blue.fill-plus-2 { + background-color: #0288d1; +} +.fill-light-blue .fill-plus-3, +.fill-light-blue.fill-plus-3 { + background-color: #0277bd; +} +.fill-light-blue .fill-plus-4, +.fill-light-blue.fill-plus-4 { + background-color: #01579b; +} +.fill-light-blue .fill-accent-1, +.fill-light-blue.fill-accent-1 { + background-color: #80d8ff; +} +.fill-light-blue .fill-accent-2, +.fill-light-blue.fill-accent-2 { + background-color: #40c4ff; +} +.fill-light-blue .fill-accent-3, +.fill-light-blue.fill-accent-3 { + background-color: #00b0ff; +} +.fill-light-blue .fill-accent-4, +.fill-light-blue.fill-accent-4 { + background-color: #0091ea; +} +.fill-light-blue .fill-base, +.fill-light-blue.fill-base { + background-color: #03a9f4; +} +.text-light-blue { + color: #03a9f4; +} +.text-light-blue .text-minus-1, +.text-light-blue.text-minus-1 { + color: #29b6f6; +} +.text-light-blue .text-minus-2, +.text-light-blue.text-minus-2 { + color: #4fc3f7; +} +.text-light-blue .text-minus-3, +.text-light-blue.text-minus-3 { + color: #81d4fa; +} +.text-light-blue .text-minus-4, +.text-light-blue.text-minus-4 { + color: #b3e5fc; +} +.text-light-blue .text-minus-5, +.text-light-blue.text-minus-5 { + color: #e1f5fe; +} +.text-light-blue .text-plus-1, +.text-light-blue.text-plus-1 { + color: #039be5; +} +.text-light-blue .text-plus-2, +.text-light-blue.text-plus-2 { + color: #0288d1; +} +.text-light-blue .text-plus-3, +.text-light-blue.text-plus-3 { + color: #0277bd; +} +.text-light-blue .text-plus-4, +.text-light-blue.text-plus-4 { + color: #01579b; +} +.text-light-blue .text-accent-1, +.text-light-blue.text-accent-1 { + color: #80d8ff; +} +.text-light-blue .text-accent-2, +.text-light-blue.text-accent-2 { + color: #40c4ff; +} +.text-light-blue .text-accent-3, +.text-light-blue.text-accent-3 { + color: #00b0ff; +} +.text-light-blue .text-accent-4, +.text-light-blue.text-accent-4 { + color: #0091ea; +} +.text-light-blue .text-base, +.text-light-blue.text-base { + color: #03a9f4; +} +.border-light-blue { + border-color: #03a9f4; +} +.border-light-blue .border-minus-1, +.border-light-blue.border-minus-1 { + border-color: #29b6f6; +} +.border-light-blue .border-minus-2, +.border-light-blue.border-minus-2 { + border-color: #4fc3f7; +} +.border-light-blue .border-minus-3, +.border-light-blue.border-minus-3 { + border-color: #81d4fa; +} +.border-light-blue .border-minus-4, +.border-light-blue.border-minus-4 { + border-color: #b3e5fc; +} +.border-light-blue .border-minus-5, +.border-light-blue.border-minus-5 { + border-color: #e1f5fe; +} +.border-light-blue .border-plus-1, +.border-light-blue.border-plus-1 { + border-color: #039be5; +} +.border-light-blue .border-plus-2, +.border-light-blue.border-plus-2 { + border-color: #0288d1; +} +.border-light-blue .border-plus-3, +.border-light-blue.border-plus-3 { + border-color: #0277bd; +} +.border-light-blue .border-plus-4, +.border-light-blue.border-plus-4 { + border-color: #01579b; +} +.border-light-blue .border-accent-1, +.border-light-blue.border-accent-1 { + border-color: #80d8ff; +} +.border-light-blue .border-accent-2, +.border-light-blue.border-accent-2 { + border-color: #40c4ff; +} +.border-light-blue .border-accent-3, +.border-light-blue.border-accent-3 { + border-color: #00b0ff; +} +.border-light-blue .border-accent-4, +.border-light-blue.border-accent-4 { + border-color: #0091ea; +} +.border-light-blue .border-base, +.border-light-blue.border-base { + border-color: #03a9f4; +} +.fill-cyan { + background-color: #00bcd4; +} +.fill-cyan .fill-minus-1, +.fill-cyan.fill-minus-1 { + background-color: #26c6da; +} +.fill-cyan .fill-minus-2, +.fill-cyan.fill-minus-2 { + background-color: #4dd0e1; +} +.fill-cyan .fill-minus-3, +.fill-cyan.fill-minus-3 { + background-color: #80deea; +} +.fill-cyan .fill-minus-4, +.fill-cyan.fill-minus-4 { + background-color: #b2ebf2; +} +.fill-cyan .fill-minus-5, +.fill-cyan.fill-minus-5 { + background-color: #e0f7fa; +} +.fill-cyan .fill-plus-1, +.fill-cyan.fill-plus-1 { + background-color: #00acc1; +} +.fill-cyan .fill-plus-2, +.fill-cyan.fill-plus-2 { + background-color: #0097a7; +} +.fill-cyan .fill-plus-3, +.fill-cyan.fill-plus-3 { + background-color: #00838f; +} +.fill-cyan .fill-plus-4, +.fill-cyan.fill-plus-4 { + background-color: #006064; +} +.fill-cyan .fill-accent-1, +.fill-cyan.fill-accent-1 { + background-color: #84ffff; +} +.fill-cyan .fill-accent-2, +.fill-cyan.fill-accent-2 { + background-color: #18ffff; +} +.fill-cyan .fill-accent-3, +.fill-cyan.fill-accent-3 { + background-color: #00e5ff; +} +.fill-cyan .fill-accent-4, +.fill-cyan.fill-accent-4 { + background-color: #00b8d4; +} +.fill-cyan .fill-base, +.fill-cyan.fill-base { + background-color: #00bcd4; +} +.text-cyan { + color: #00bcd4; +} +.text-cyan .text-minus-1, +.text-cyan.text-minus-1 { + color: #26c6da; +} +.text-cyan .text-minus-2, +.text-cyan.text-minus-2 { + color: #4dd0e1; +} +.text-cyan .text-minus-3, +.text-cyan.text-minus-3 { + color: #80deea; +} +.text-cyan .text-minus-4, +.text-cyan.text-minus-4 { + color: #b2ebf2; +} +.text-cyan .text-minus-5, +.text-cyan.text-minus-5 { + color: #e0f7fa; +} +.text-cyan .text-plus-1, +.text-cyan.text-plus-1 { + color: #00acc1; +} +.text-cyan .text-plus-2, +.text-cyan.text-plus-2 { + color: #0097a7; +} +.text-cyan .text-plus-3, +.text-cyan.text-plus-3 { + color: #00838f; +} +.text-cyan .text-plus-4, +.text-cyan.text-plus-4 { + color: #006064; +} +.text-cyan .text-accent-1, +.text-cyan.text-accent-1 { + color: #84ffff; +} +.text-cyan .text-accent-2, +.text-cyan.text-accent-2 { + color: #18ffff; +} +.text-cyan .text-accent-3, +.text-cyan.text-accent-3 { + color: #00e5ff; +} +.text-cyan .text-accent-4, +.text-cyan.text-accent-4 { + color: #00b8d4; +} +.text-cyan .text-base, +.text-cyan.text-base { + color: #00bcd4; +} +.border-cyan { + border-color: #00bcd4; +} +.border-cyan .border-minus-1, +.border-cyan.border-minus-1 { + border-color: #26c6da; +} +.border-cyan .border-minus-2, +.border-cyan.border-minus-2 { + border-color: #4dd0e1; +} +.border-cyan .border-minus-3, +.border-cyan.border-minus-3 { + border-color: #80deea; +} +.border-cyan .border-minus-4, +.border-cyan.border-minus-4 { + border-color: #b2ebf2; +} +.border-cyan .border-minus-5, +.border-cyan.border-minus-5 { + border-color: #e0f7fa; +} +.border-cyan .border-plus-1, +.border-cyan.border-plus-1 { + border-color: #00acc1; +} +.border-cyan .border-plus-2, +.border-cyan.border-plus-2 { + border-color: #0097a7; +} +.border-cyan .border-plus-3, +.border-cyan.border-plus-3 { + border-color: #00838f; +} +.border-cyan .border-plus-4, +.border-cyan.border-plus-4 { + border-color: #006064; +} +.border-cyan .border-accent-1, +.border-cyan.border-accent-1 { + border-color: #84ffff; +} +.border-cyan .border-accent-2, +.border-cyan.border-accent-2 { + border-color: #18ffff; +} +.border-cyan .border-accent-3, +.border-cyan.border-accent-3 { + border-color: #00e5ff; +} +.border-cyan .border-accent-4, +.border-cyan.border-accent-4 { + border-color: #00b8d4; +} +.border-cyan .border-base, +.border-cyan.border-base { + border-color: #00bcd4; +} +.fill-teal { + background-color: #009688; +} +.fill-teal .fill-minus-1, +.fill-teal.fill-minus-1 { + background-color: #26a69a; +} +.fill-teal .fill-minus-2, +.fill-teal.fill-minus-2 { + background-color: #4db6ac; +} +.fill-teal .fill-minus-3, +.fill-teal.fill-minus-3 { + background-color: #80cbc4; +} +.fill-teal .fill-minus-4, +.fill-teal.fill-minus-4 { + background-color: #b2dfdb; +} +.fill-teal .fill-minus-5, +.fill-teal.fill-minus-5 { + background-color: #e0f2f1; +} +.fill-teal .fill-plus-1, +.fill-teal.fill-plus-1 { + background-color: #00897b; +} +.fill-teal .fill-plus-2, +.fill-teal.fill-plus-2 { + background-color: #00796b; +} +.fill-teal .fill-plus-3, +.fill-teal.fill-plus-3 { + background-color: #00695c; +} +.fill-teal .fill-plus-4, +.fill-teal.fill-plus-4 { + background-color: #004d40; +} +.fill-teal .fill-accent-1, +.fill-teal.fill-accent-1 { + background-color: #a7ffeb; +} +.fill-teal .fill-accent-2, +.fill-teal.fill-accent-2 { + background-color: #64ffda; +} +.fill-teal .fill-accent-3, +.fill-teal.fill-accent-3 { + background-color: #1de9b6; +} +.fill-teal .fill-accent-4, +.fill-teal.fill-accent-4 { + background-color: #00bfa5; +} +.fill-teal .fill-base, +.fill-teal.fill-base { + background-color: #009688; +} +.text-teal { + color: #009688; +} +.text-teal .text-minus-1, +.text-teal.text-minus-1 { + color: #26a69a; +} +.text-teal .text-minus-2, +.text-teal.text-minus-2 { + color: #4db6ac; +} +.text-teal .text-minus-3, +.text-teal.text-minus-3 { + color: #80cbc4; +} +.text-teal .text-minus-4, +.text-teal.text-minus-4 { + color: #b2dfdb; +} +.text-teal .text-minus-5, +.text-teal.text-minus-5 { + color: #e0f2f1; +} +.text-teal .text-plus-1, +.text-teal.text-plus-1 { + color: #00897b; +} +.text-teal .text-plus-2, +.text-teal.text-plus-2 { + color: #00796b; +} +.text-teal .text-plus-3, +.text-teal.text-plus-3 { + color: #00695c; +} +.text-teal .text-plus-4, +.text-teal.text-plus-4 { + color: #004d40; +} +.text-teal .text-accent-1, +.text-teal.text-accent-1 { + color: #a7ffeb; +} +.text-teal .text-accent-2, +.text-teal.text-accent-2 { + color: #64ffda; +} +.text-teal .text-accent-3, +.text-teal.text-accent-3 { + color: #1de9b6; +} +.text-teal .text-accent-4, +.text-teal.text-accent-4 { + color: #00bfa5; +} +.text-teal .text-base, +.text-teal.text-base { + color: #009688; +} +.border-teal { + border-color: #009688; +} +.border-teal .border-minus-1, +.border-teal.border-minus-1 { + border-color: #26a69a; +} +.border-teal .border-minus-2, +.border-teal.border-minus-2 { + border-color: #4db6ac; +} +.border-teal .border-minus-3, +.border-teal.border-minus-3 { + border-color: #80cbc4; +} +.border-teal .border-minus-4, +.border-teal.border-minus-4 { + border-color: #b2dfdb; +} +.border-teal .border-minus-5, +.border-teal.border-minus-5 { + border-color: #e0f2f1; +} +.border-teal .border-plus-1, +.border-teal.border-plus-1 { + border-color: #00897b; +} +.border-teal .border-plus-2, +.border-teal.border-plus-2 { + border-color: #00796b; +} +.border-teal .border-plus-3, +.border-teal.border-plus-3 { + border-color: #00695c; +} +.border-teal .border-plus-4, +.border-teal.border-plus-4 { + border-color: #004d40; +} +.border-teal .border-accent-1, +.border-teal.border-accent-1 { + border-color: #a7ffeb; +} +.border-teal .border-accent-2, +.border-teal.border-accent-2 { + border-color: #64ffda; +} +.border-teal .border-accent-3, +.border-teal.border-accent-3 { + border-color: #1de9b6; +} +.border-teal .border-accent-4, +.border-teal.border-accent-4 { + border-color: #00bfa5; +} +.border-teal .border-base, +.border-teal.border-base { + border-color: #009688; +} +.fill-green { + background-color: #259b24; +} +.fill-green .fill-minus-1, +.fill-green.fill-minus-1 { + background-color: #2baf2b; +} +.fill-green .fill-minus-2, +.fill-green.fill-minus-2 { + background-color: #42bd41; +} +.fill-green .fill-minus-3, +.fill-green.fill-minus-3 { + background-color: #72d572; +} +.fill-green .fill-minus-4, +.fill-green.fill-minus-4 { + background-color: #a3e9a4; +} +.fill-green .fill-minus-5, +.fill-green.fill-minus-5 { + background-color: #d0f8ce; +} +.fill-green .fill-plus-1, +.fill-green.fill-plus-1 { + background-color: #0a8f08; +} +.fill-green .fill-plus-2, +.fill-green.fill-plus-2 { + background-color: #0a7e07; +} +.fill-green .fill-plus-3, +.fill-green.fill-plus-3 { + background-color: #056f00; +} +.fill-green .fill-plus-4, +.fill-green.fill-plus-4 { + background-color: #0d5302; +} +.fill-green .fill-accent-1, +.fill-green.fill-accent-1 { + background-color: #a2f78d; +} +.fill-green .fill-accent-2, +.fill-green.fill-accent-2 { + background-color: #5af158; +} +.fill-green .fill-accent-3, +.fill-green.fill-accent-3 { + background-color: #14e715; +} +.fill-green .fill-accent-4, +.fill-green.fill-accent-4 { + background-color: #12c700; +} +.fill-green .fill-base, +.fill-green.fill-base { + background-color: #259b24; +} +.text-green { + color: #259b24; +} +.text-green .text-minus-1, +.text-green.text-minus-1 { + color: #2baf2b; +} +.text-green .text-minus-2, +.text-green.text-minus-2 { + color: #42bd41; +} +.text-green .text-minus-3, +.text-green.text-minus-3 { + color: #72d572; +} +.text-green .text-minus-4, +.text-green.text-minus-4 { + color: #a3e9a4; +} +.text-green .text-minus-5, +.text-green.text-minus-5 { + color: #d0f8ce; +} +.text-green .text-plus-1, +.text-green.text-plus-1 { + color: #0a8f08; +} +.text-green .text-plus-2, +.text-green.text-plus-2 { + color: #0a7e07; +} +.text-green .text-plus-3, +.text-green.text-plus-3 { + color: #056f00; +} +.text-green .text-plus-4, +.text-green.text-plus-4 { + color: #0d5302; +} +.text-green .text-accent-1, +.text-green.text-accent-1 { + color: #a2f78d; +} +.text-green .text-accent-2, +.text-green.text-accent-2 { + color: #5af158; +} +.text-green .text-accent-3, +.text-green.text-accent-3 { + color: #14e715; +} +.text-green .text-accent-4, +.text-green.text-accent-4 { + color: #12c700; +} +.text-green .text-base, +.text-green.text-base { + color: #259b24; +} +.border-green { + border-color: #259b24; +} +.border-green .border-minus-1, +.border-green.border-minus-1 { + border-color: #2baf2b; +} +.border-green .border-minus-2, +.border-green.border-minus-2 { + border-color: #42bd41; +} +.border-green .border-minus-3, +.border-green.border-minus-3 { + border-color: #72d572; +} +.border-green .border-minus-4, +.border-green.border-minus-4 { + border-color: #a3e9a4; +} +.border-green .border-minus-5, +.border-green.border-minus-5 { + border-color: #d0f8ce; +} +.border-green .border-plus-1, +.border-green.border-plus-1 { + border-color: #0a8f08; +} +.border-green .border-plus-2, +.border-green.border-plus-2 { + border-color: #0a7e07; +} +.border-green .border-plus-3, +.border-green.border-plus-3 { + border-color: #056f00; +} +.border-green .border-plus-4, +.border-green.border-plus-4 { + border-color: #0d5302; +} +.border-green .border-accent-1, +.border-green.border-accent-1 { + border-color: #a2f78d; +} +.border-green .border-accent-2, +.border-green.border-accent-2 { + border-color: #5af158; +} +.border-green .border-accent-3, +.border-green.border-accent-3 { + border-color: #14e715; +} +.border-green .border-accent-4, +.border-green.border-accent-4 { + border-color: #12c700; +} +.border-green .border-base, +.border-green.border-base { + border-color: #259b24; +} +.fill-light-green { + background-color: #8bc34a; +} +.fill-light-green .fill-minus-1, +.fill-light-green.fill-minus-1 { + background-color: #9ccc65; +} +.fill-light-green .fill-minus-2, +.fill-light-green.fill-minus-2 { + background-color: #aed581; +} +.fill-light-green .fill-minus-3, +.fill-light-green.fill-minus-3 { + background-color: #c5e1a5; +} +.fill-light-green .fill-minus-4, +.fill-light-green.fill-minus-4 { + background-color: #dcedc8; +} +.fill-light-green .fill-minus-5, +.fill-light-green.fill-minus-5 { + background-color: #f1f8e9; +} +.fill-light-green .fill-plus-1, +.fill-light-green.fill-plus-1 { + background-color: #7cb342; +} +.fill-light-green .fill-plus-2, +.fill-light-green.fill-plus-2 { + background-color: #689f38; +} +.fill-light-green .fill-plus-3, +.fill-light-green.fill-plus-3 { + background-color: #558b2f; +} +.fill-light-green .fill-plus-4, +.fill-light-green.fill-plus-4 { + background-color: #33691e; +} +.fill-light-green .fill-accent-1, +.fill-light-green.fill-accent-1 { + background-color: #ccff90; +} +.fill-light-green .fill-accent-2, +.fill-light-green.fill-accent-2 { + background-color: #b2ff59; +} +.fill-light-green .fill-accent-3, +.fill-light-green.fill-accent-3 { + background-color: #76ff03; +} +.fill-light-green .fill-accent-4, +.fill-light-green.fill-accent-4 { + background-color: #64dd17; +} +.fill-light-green .fill-base, +.fill-light-green.fill-base { + background-color: #8bc34a; +} +.text-light-green { + color: #8bc34a; +} +.text-light-green .text-minus-1, +.text-light-green.text-minus-1 { + color: #9ccc65; +} +.text-light-green .text-minus-2, +.text-light-green.text-minus-2 { + color: #aed581; +} +.text-light-green .text-minus-3, +.text-light-green.text-minus-3 { + color: #c5e1a5; +} +.text-light-green .text-minus-4, +.text-light-green.text-minus-4 { + color: #dcedc8; +} +.text-light-green .text-minus-5, +.text-light-green.text-minus-5 { + color: #f1f8e9; +} +.text-light-green .text-plus-1, +.text-light-green.text-plus-1 { + color: #7cb342; +} +.text-light-green .text-plus-2, +.text-light-green.text-plus-2 { + color: #689f38; +} +.text-light-green .text-plus-3, +.text-light-green.text-plus-3 { + color: #558b2f; +} +.text-light-green .text-plus-4, +.text-light-green.text-plus-4 { + color: #33691e; +} +.text-light-green .text-accent-1, +.text-light-green.text-accent-1 { + color: #ccff90; +} +.text-light-green .text-accent-2, +.text-light-green.text-accent-2 { + color: #b2ff59; +} +.text-light-green .text-accent-3, +.text-light-green.text-accent-3 { + color: #76ff03; +} +.text-light-green .text-accent-4, +.text-light-green.text-accent-4 { + color: #64dd17; +} +.text-light-green .text-base, +.text-light-green.text-base { + color: #8bc34a; +} +.border-light-green { + border-color: #8bc34a; +} +.border-light-green .border-minus-1, +.border-light-green.border-minus-1 { + border-color: #9ccc65; +} +.border-light-green .border-minus-2, +.border-light-green.border-minus-2 { + border-color: #aed581; +} +.border-light-green .border-minus-3, +.border-light-green.border-minus-3 { + border-color: #c5e1a5; +} +.border-light-green .border-minus-4, +.border-light-green.border-minus-4 { + border-color: #dcedc8; +} +.border-light-green .border-minus-5, +.border-light-green.border-minus-5 { + border-color: #f1f8e9; +} +.border-light-green .border-plus-1, +.border-light-green.border-plus-1 { + border-color: #7cb342; +} +.border-light-green .border-plus-2, +.border-light-green.border-plus-2 { + border-color: #689f38; +} +.border-light-green .border-plus-3, +.border-light-green.border-plus-3 { + border-color: #558b2f; +} +.border-light-green .border-plus-4, +.border-light-green.border-plus-4 { + border-color: #33691e; +} +.border-light-green .border-accent-1, +.border-light-green.border-accent-1 { + border-color: #ccff90; +} +.border-light-green .border-accent-2, +.border-light-green.border-accent-2 { + border-color: #b2ff59; +} +.border-light-green .border-accent-3, +.border-light-green.border-accent-3 { + border-color: #76ff03; +} +.border-light-green .border-accent-4, +.border-light-green.border-accent-4 { + border-color: #64dd17; +} +.border-light-green .border-base, +.border-light-green.border-base { + border-color: #8bc34a; +} +.fill-lime { + background-color: #cddc39; +} +.fill-lime .fill-minus-1, +.fill-lime.fill-minus-1 { + background-color: #d4e157; +} +.fill-lime .fill-minus-2, +.fill-lime.fill-minus-2 { + background-color: #dce775; +} +.fill-lime .fill-minus-3, +.fill-lime.fill-minus-3 { + background-color: #e6ee9c; +} +.fill-lime .fill-minus-4, +.fill-lime.fill-minus-4 { + background-color: #f0f4c3; +} +.fill-lime .fill-minus-5, +.fill-lime.fill-minus-5 { + background-color: #f9fbe7; +} +.fill-lime .fill-plus-1, +.fill-lime.fill-plus-1 { + background-color: #c0ca33; +} +.fill-lime .fill-plus-2, +.fill-lime.fill-plus-2 { + background-color: #afb42b; +} +.fill-lime .fill-plus-3, +.fill-lime.fill-plus-3 { + background-color: #9e9d24; +} +.fill-lime .fill-plus-4, +.fill-lime.fill-plus-4 { + background-color: #827717; +} +.fill-lime .fill-accent-1, +.fill-lime.fill-accent-1 { + background-color: #f4ff81; +} +.fill-lime .fill-accent-2, +.fill-lime.fill-accent-2 { + background-color: #eeff41; +} +.fill-lime .fill-accent-3, +.fill-lime.fill-accent-3 { + background-color: #c6ff00; +} +.fill-lime .fill-accent-4, +.fill-lime.fill-accent-4 { + background-color: #aeea00; +} +.fill-lime .fill-base, +.fill-lime.fill-base { + background-color: #cddc39; +} +.text-lime { + color: #cddc39; +} +.text-lime .text-minus-1, +.text-lime.text-minus-1 { + color: #d4e157; +} +.text-lime .text-minus-2, +.text-lime.text-minus-2 { + color: #dce775; +} +.text-lime .text-minus-3, +.text-lime.text-minus-3 { + color: #e6ee9c; +} +.text-lime .text-minus-4, +.text-lime.text-minus-4 { + color: #f0f4c3; +} +.text-lime .text-minus-5, +.text-lime.text-minus-5 { + color: #f9fbe7; +} +.text-lime .text-plus-1, +.text-lime.text-plus-1 { + color: #c0ca33; +} +.text-lime .text-plus-2, +.text-lime.text-plus-2 { + color: #afb42b; +} +.text-lime .text-plus-3, +.text-lime.text-plus-3 { + color: #9e9d24; +} +.text-lime .text-plus-4, +.text-lime.text-plus-4 { + color: #827717; +} +.text-lime .text-accent-1, +.text-lime.text-accent-1 { + color: #f4ff81; +} +.text-lime .text-accent-2, +.text-lime.text-accent-2 { + color: #eeff41; +} +.text-lime .text-accent-3, +.text-lime.text-accent-3 { + color: #c6ff00; +} +.text-lime .text-accent-4, +.text-lime.text-accent-4 { + color: #aeea00; +} +.text-lime .text-base, +.text-lime.text-base { + color: #cddc39; +} +.border-lime { + border-color: #cddc39; +} +.border-lime .border-minus-1, +.border-lime.border-minus-1 { + border-color: #d4e157; +} +.border-lime .border-minus-2, +.border-lime.border-minus-2 { + border-color: #dce775; +} +.border-lime .border-minus-3, +.border-lime.border-minus-3 { + border-color: #e6ee9c; +} +.border-lime .border-minus-4, +.border-lime.border-minus-4 { + border-color: #f0f4c3; +} +.border-lime .border-minus-5, +.border-lime.border-minus-5 { + border-color: #f9fbe7; +} +.border-lime .border-plus-1, +.border-lime.border-plus-1 { + border-color: #c0ca33; +} +.border-lime .border-plus-2, +.border-lime.border-plus-2 { + border-color: #afb42b; +} +.border-lime .border-plus-3, +.border-lime.border-plus-3 { + border-color: #9e9d24; +} +.border-lime .border-plus-4, +.border-lime.border-plus-4 { + border-color: #827717; +} +.border-lime .border-accent-1, +.border-lime.border-accent-1 { + border-color: #f4ff81; +} +.border-lime .border-accent-2, +.border-lime.border-accent-2 { + border-color: #eeff41; +} +.border-lime .border-accent-3, +.border-lime.border-accent-3 { + border-color: #c6ff00; +} +.border-lime .border-accent-4, +.border-lime.border-accent-4 { + border-color: #aeea00; +} +.border-lime .border-base, +.border-lime.border-base { + border-color: #cddc39; +} +.fill-yellow { + background-color: #ffeb3b; +} +.fill-yellow .fill-minus-1, +.fill-yellow.fill-minus-1 { + background-color: #ffee58; +} +.fill-yellow .fill-minus-2, +.fill-yellow.fill-minus-2 { + background-color: #fff176; +} +.fill-yellow .fill-minus-3, +.fill-yellow.fill-minus-3 { + background-color: #fff59d; +} +.fill-yellow .fill-minus-4, +.fill-yellow.fill-minus-4 { + background-color: #fff9c4; +} +.fill-yellow .fill-minus-5, +.fill-yellow.fill-minus-5 { + background-color: #fffde7; +} +.fill-yellow .fill-plus-1, +.fill-yellow.fill-plus-1 { + background-color: #fdd835; +} +.fill-yellow .fill-plus-2, +.fill-yellow.fill-plus-2 { + background-color: #fbc02d; +} +.fill-yellow .fill-plus-3, +.fill-yellow.fill-plus-3 { + background-color: #f9a825; +} +.fill-yellow .fill-plus-4, +.fill-yellow.fill-plus-4 { + background-color: #f57f17; +} +.fill-yellow .fill-accent-1, +.fill-yellow.fill-accent-1 { + background-color: #ffff8d; +} +.fill-yellow .fill-accent-2, +.fill-yellow.fill-accent-2 { + background-color: #ff0; +} +.fill-yellow .fill-accent-3, +.fill-yellow.fill-accent-3 { + background-color: #ffea00; +} +.fill-yellow .fill-accent-4, +.fill-yellow.fill-accent-4 { + background-color: #ffd600; +} +.fill-yellow .fill-base, +.fill-yellow.fill-base { + background-color: #ffeb3b; +} +.text-yellow { + color: #ffeb3b; +} +.text-yellow .text-minus-1, +.text-yellow.text-minus-1 { + color: #ffee58; +} +.text-yellow .text-minus-2, +.text-yellow.text-minus-2 { + color: #fff176; +} +.text-yellow .text-minus-3, +.text-yellow.text-minus-3 { + color: #fff59d; +} +.text-yellow .text-minus-4, +.text-yellow.text-minus-4 { + color: #fff9c4; +} +.text-yellow .text-minus-5, +.text-yellow.text-minus-5 { + color: #fffde7; +} +.text-yellow .text-plus-1, +.text-yellow.text-plus-1 { + color: #fdd835; +} +.text-yellow .text-plus-2, +.text-yellow.text-plus-2 { + color: #fbc02d; +} +.text-yellow .text-plus-3, +.text-yellow.text-plus-3 { + color: #f9a825; +} +.text-yellow .text-plus-4, +.text-yellow.text-plus-4 { + color: #f57f17; +} +.text-yellow .text-accent-1, +.text-yellow.text-accent-1 { + color: #ffff8d; +} +.text-yellow .text-accent-2, +.text-yellow.text-accent-2 { + color: #ff0; +} +.text-yellow .text-accent-3, +.text-yellow.text-accent-3 { + color: #ffea00; +} +.text-yellow .text-accent-4, +.text-yellow.text-accent-4 { + color: #ffd600; +} +.text-yellow .text-base, +.text-yellow.text-base { + color: #ffeb3b; +} +.border-yellow { + border-color: #ffeb3b; +} +.border-yellow .border-minus-1, +.border-yellow.border-minus-1 { + border-color: #ffee58; +} +.border-yellow .border-minus-2, +.border-yellow.border-minus-2 { + border-color: #fff176; +} +.border-yellow .border-minus-3, +.border-yellow.border-minus-3 { + border-color: #fff59d; +} +.border-yellow .border-minus-4, +.border-yellow.border-minus-4 { + border-color: #fff9c4; +} +.border-yellow .border-minus-5, +.border-yellow.border-minus-5 { + border-color: #fffde7; +} +.border-yellow .border-plus-1, +.border-yellow.border-plus-1 { + border-color: #fdd835; +} +.border-yellow .border-plus-2, +.border-yellow.border-plus-2 { + border-color: #fbc02d; +} +.border-yellow .border-plus-3, +.border-yellow.border-plus-3 { + border-color: #f9a825; +} +.border-yellow .border-plus-4, +.border-yellow.border-plus-4 { + border-color: #f57f17; +} +.border-yellow .border-accent-1, +.border-yellow.border-accent-1 { + border-color: #ffff8d; +} +.border-yellow .border-accent-2, +.border-yellow.border-accent-2 { + border-color: #ff0; +} +.border-yellow .border-accent-3, +.border-yellow.border-accent-3 { + border-color: #ffea00; +} +.border-yellow .border-accent-4, +.border-yellow.border-accent-4 { + border-color: #ffd600; +} +.border-yellow .border-base, +.border-yellow.border-base { + border-color: #ffeb3b; +} +.fill-amber { + background-color: #ffc107; +} +.fill-amber .fill-minus-1, +.fill-amber.fill-minus-1 { + background-color: #ffca28; +} +.fill-amber .fill-minus-2, +.fill-amber.fill-minus-2 { + background-color: #ffd54f; +} +.fill-amber .fill-minus-3, +.fill-amber.fill-minus-3 { + background-color: #ffe082; +} +.fill-amber .fill-minus-4, +.fill-amber.fill-minus-4 { + background-color: #ffecb3; +} +.fill-amber .fill-minus-5, +.fill-amber.fill-minus-5 { + background-color: #fff8e1; +} +.fill-amber .fill-plus-1, +.fill-amber.fill-plus-1 { + background-color: #ffb300; +} +.fill-amber .fill-plus-2, +.fill-amber.fill-plus-2 { + background-color: #ffa000; +} +.fill-amber .fill-plus-3, +.fill-amber.fill-plus-3 { + background-color: #ff8f00; +} +.fill-amber .fill-plus-4, +.fill-amber.fill-plus-4 { + background-color: #ff6f00; +} +.fill-amber .fill-accent-1, +.fill-amber.fill-accent-1 { + background-color: #ffe57f; +} +.fill-amber .fill-accent-2, +.fill-amber.fill-accent-2 { + background-color: #ffd740; +} +.fill-amber .fill-accent-3, +.fill-amber.fill-accent-3 { + background-color: #ffc400; +} +.fill-amber .fill-accent-4, +.fill-amber.fill-accent-4 { + background-color: #ffab00; +} +.fill-amber .fill-base, +.fill-amber.fill-base { + background-color: #ffc107; +} +.text-amber { + color: #ffc107; +} +.text-amber .text-minus-1, +.text-amber.text-minus-1 { + color: #ffca28; +} +.text-amber .text-minus-2, +.text-amber.text-minus-2 { + color: #ffd54f; +} +.text-amber .text-minus-3, +.text-amber.text-minus-3 { + color: #ffe082; +} +.text-amber .text-minus-4, +.text-amber.text-minus-4 { + color: #ffecb3; +} +.text-amber .text-minus-5, +.text-amber.text-minus-5 { + color: #fff8e1; +} +.text-amber .text-plus-1, +.text-amber.text-plus-1 { + color: #ffb300; +} +.text-amber .text-plus-2, +.text-amber.text-plus-2 { + color: #ffa000; +} +.text-amber .text-plus-3, +.text-amber.text-plus-3 { + color: #ff8f00; +} +.text-amber .text-plus-4, +.text-amber.text-plus-4 { + color: #ff6f00; +} +.text-amber .text-accent-1, +.text-amber.text-accent-1 { + color: #ffe57f; +} +.text-amber .text-accent-2, +.text-amber.text-accent-2 { + color: #ffd740; +} +.text-amber .text-accent-3, +.text-amber.text-accent-3 { + color: #ffc400; +} +.text-amber .text-accent-4, +.text-amber.text-accent-4 { + color: #ffab00; +} +.text-amber .text-base, +.text-amber.text-base { + color: #ffc107; +} +.border-amber { + border-color: #ffc107; +} +.border-amber .border-minus-1, +.border-amber.border-minus-1 { + border-color: #ffca28; +} +.border-amber .border-minus-2, +.border-amber.border-minus-2 { + border-color: #ffd54f; +} +.border-amber .border-minus-3, +.border-amber.border-minus-3 { + border-color: #ffe082; +} +.border-amber .border-minus-4, +.border-amber.border-minus-4 { + border-color: #ffecb3; +} +.border-amber .border-minus-5, +.border-amber.border-minus-5 { + border-color: #fff8e1; +} +.border-amber .border-plus-1, +.border-amber.border-plus-1 { + border-color: #ffb300; +} +.border-amber .border-plus-2, +.border-amber.border-plus-2 { + border-color: #ffa000; +} +.border-amber .border-plus-3, +.border-amber.border-plus-3 { + border-color: #ff8f00; +} +.border-amber .border-plus-4, +.border-amber.border-plus-4 { + border-color: #ff6f00; +} +.border-amber .border-accent-1, +.border-amber.border-accent-1 { + border-color: #ffe57f; +} +.border-amber .border-accent-2, +.border-amber.border-accent-2 { + border-color: #ffd740; +} +.border-amber .border-accent-3, +.border-amber.border-accent-3 { + border-color: #ffc400; +} +.border-amber .border-accent-4, +.border-amber.border-accent-4 { + border-color: #ffab00; +} +.border-amber .border-base, +.border-amber.border-base { + border-color: #ffc107; +} +.fill-orange { + background-color: #ff9800; +} +.fill-orange .fill-minus-1, +.fill-orange.fill-minus-1 { + background-color: #ffa726; +} +.fill-orange .fill-minus-2, +.fill-orange.fill-minus-2 { + background-color: #ffb74d; +} +.fill-orange .fill-minus-3, +.fill-orange.fill-minus-3 { + background-color: #ffcc80; +} +.fill-orange .fill-minus-4, +.fill-orange.fill-minus-4 { + background-color: #ffe0b2; +} +.fill-orange .fill-minus-5, +.fill-orange.fill-minus-5 { + background-color: #fff3e0; +} +.fill-orange .fill-plus-1, +.fill-orange.fill-plus-1 { + background-color: #fb8c00; +} +.fill-orange .fill-plus-2, +.fill-orange.fill-plus-2 { + background-color: #f57c00; +} +.fill-orange .fill-plus-3, +.fill-orange.fill-plus-3 { + background-color: #ef6c00; +} +.fill-orange .fill-plus-4, +.fill-orange.fill-plus-4 { + background-color: #e65100; +} +.fill-orange .fill-accent-1, +.fill-orange.fill-accent-1 { + background-color: #ffd180; +} +.fill-orange .fill-accent-2, +.fill-orange.fill-accent-2 { + background-color: #ffab40; +} +.fill-orange .fill-accent-3, +.fill-orange.fill-accent-3 { + background-color: #ff9100; +} +.fill-orange .fill-accent-4, +.fill-orange.fill-accent-4 { + background-color: #ff6d00; +} +.fill-orange .fill-base, +.fill-orange.fill-base { + background-color: #ff9800; +} +.text-orange { + color: #ff9800; +} +.text-orange .text-minus-1, +.text-orange.text-minus-1 { + color: #ffa726; +} +.text-orange .text-minus-2, +.text-orange.text-minus-2 { + color: #ffb74d; +} +.text-orange .text-minus-3, +.text-orange.text-minus-3 { + color: #ffcc80; +} +.text-orange .text-minus-4, +.text-orange.text-minus-4 { + color: #ffe0b2; +} +.text-orange .text-minus-5, +.text-orange.text-minus-5 { + color: #fff3e0; +} +.text-orange .text-plus-1, +.text-orange.text-plus-1 { + color: #fb8c00; +} +.text-orange .text-plus-2, +.text-orange.text-plus-2 { + color: #f57c00; +} +.text-orange .text-plus-3, +.text-orange.text-plus-3 { + color: #ef6c00; +} +.text-orange .text-plus-4, +.text-orange.text-plus-4 { + color: #e65100; +} +.text-orange .text-accent-1, +.text-orange.text-accent-1 { + color: #ffd180; +} +.text-orange .text-accent-2, +.text-orange.text-accent-2 { + color: #ffab40; +} +.text-orange .text-accent-3, +.text-orange.text-accent-3 { + color: #ff9100; +} +.text-orange .text-accent-4, +.text-orange.text-accent-4 { + color: #ff6d00; +} +.text-orange .text-base, +.text-orange.text-base { + color: #ff9800; +} +.border-orange { + border-color: #ff9800; +} +.border-orange .border-minus-1, +.border-orange.border-minus-1 { + border-color: #ffa726; +} +.border-orange .border-minus-2, +.border-orange.border-minus-2 { + border-color: #ffb74d; +} +.border-orange .border-minus-3, +.border-orange.border-minus-3 { + border-color: #ffcc80; +} +.border-orange .border-minus-4, +.border-orange.border-minus-4 { + border-color: #ffe0b2; +} +.border-orange .border-minus-5, +.border-orange.border-minus-5 { + border-color: #fff3e0; +} +.border-orange .border-plus-1, +.border-orange.border-plus-1 { + border-color: #fb8c00; +} +.border-orange .border-plus-2, +.border-orange.border-plus-2 { + border-color: #f57c00; +} +.border-orange .border-plus-3, +.border-orange.border-plus-3 { + border-color: #ef6c00; +} +.border-orange .border-plus-4, +.border-orange.border-plus-4 { + border-color: #e65100; +} +.border-orange .border-accent-1, +.border-orange.border-accent-1 { + border-color: #ffd180; +} +.border-orange .border-accent-2, +.border-orange.border-accent-2 { + border-color: #ffab40; +} +.border-orange .border-accent-3, +.border-orange.border-accent-3 { + border-color: #ff9100; +} +.border-orange .border-accent-4, +.border-orange.border-accent-4 { + border-color: #ff6d00; +} +.border-orange .border-base, +.border-orange.border-base { + border-color: #ff9800; +} +.fill-deep-orange { + background-color: #ff5722; +} +.fill-deep-orange .fill-minus-1, +.fill-deep-orange.fill-minus-1 { + background-color: #ff7043; +} +.fill-deep-orange .fill-minus-2, +.fill-deep-orange.fill-minus-2 { + background-color: #ff8a65; +} +.fill-deep-orange .fill-minus-3, +.fill-deep-orange.fill-minus-3 { + background-color: #ffab91; +} +.fill-deep-orange .fill-minus-4, +.fill-deep-orange.fill-minus-4 { + background-color: #ffccbc; +} +.fill-deep-orange .fill-minus-5, +.fill-deep-orange.fill-minus-5 { + background-color: #fbe9e7; +} +.fill-deep-orange .fill-plus-1, +.fill-deep-orange.fill-plus-1 { + background-color: #f4511e; +} +.fill-deep-orange .fill-plus-2, +.fill-deep-orange.fill-plus-2 { + background-color: #e64a19; +} +.fill-deep-orange .fill-plus-3, +.fill-deep-orange.fill-plus-3 { + background-color: #d84315; +} +.fill-deep-orange .fill-plus-4, +.fill-deep-orange.fill-plus-4 { + background-color: #bf360c; +} +.fill-deep-orange .fill-accent-1, +.fill-deep-orange.fill-accent-1 { + background-color: #ff9e80; +} +.fill-deep-orange .fill-accent-2, +.fill-deep-orange.fill-accent-2 { + background-color: #ff6e40; +} +.fill-deep-orange .fill-accent-3, +.fill-deep-orange.fill-accent-3 { + background-color: #ff3d00; +} +.fill-deep-orange .fill-accent-4, +.fill-deep-orange.fill-accent-4 { + background-color: #dd2c00; +} +.fill-deep-orange .fill-base, +.fill-deep-orange.fill-base { + background-color: #ff5722; +} +.text-deep-orange { + color: #ff5722; +} +.text-deep-orange .text-minus-1, +.text-deep-orange.text-minus-1 { + color: #ff7043; +} +.text-deep-orange .text-minus-2, +.text-deep-orange.text-minus-2 { + color: #ff8a65; +} +.text-deep-orange .text-minus-3, +.text-deep-orange.text-minus-3 { + color: #ffab91; +} +.text-deep-orange .text-minus-4, +.text-deep-orange.text-minus-4 { + color: #ffccbc; +} +.text-deep-orange .text-minus-5, +.text-deep-orange.text-minus-5 { + color: #fbe9e7; +} +.text-deep-orange .text-plus-1, +.text-deep-orange.text-plus-1 { + color: #f4511e; +} +.text-deep-orange .text-plus-2, +.text-deep-orange.text-plus-2 { + color: #e64a19; +} +.text-deep-orange .text-plus-3, +.text-deep-orange.text-plus-3 { + color: #d84315; +} +.text-deep-orange .text-plus-4, +.text-deep-orange.text-plus-4 { + color: #bf360c; +} +.text-deep-orange .text-accent-1, +.text-deep-orange.text-accent-1 { + color: #ff9e80; +} +.text-deep-orange .text-accent-2, +.text-deep-orange.text-accent-2 { + color: #ff6e40; +} +.text-deep-orange .text-accent-3, +.text-deep-orange.text-accent-3 { + color: #ff3d00; +} +.text-deep-orange .text-accent-4, +.text-deep-orange.text-accent-4 { + color: #dd2c00; +} +.text-deep-orange .text-base, +.text-deep-orange.text-base { + color: #ff5722; +} +.border-deep-orange { + border-color: #ff5722; +} +.border-deep-orange .border-minus-1, +.border-deep-orange.border-minus-1 { + border-color: #ff7043; +} +.border-deep-orange .border-minus-2, +.border-deep-orange.border-minus-2 { + border-color: #ff8a65; +} +.border-deep-orange .border-minus-3, +.border-deep-orange.border-minus-3 { + border-color: #ffab91; +} +.border-deep-orange .border-minus-4, +.border-deep-orange.border-minus-4 { + border-color: #ffccbc; +} +.border-deep-orange .border-minus-5, +.border-deep-orange.border-minus-5 { + border-color: #fbe9e7; +} +.border-deep-orange .border-plus-1, +.border-deep-orange.border-plus-1 { + border-color: #f4511e; +} +.border-deep-orange .border-plus-2, +.border-deep-orange.border-plus-2 { + border-color: #e64a19; +} +.border-deep-orange .border-plus-3, +.border-deep-orange.border-plus-3 { + border-color: #d84315; +} +.border-deep-orange .border-plus-4, +.border-deep-orange.border-plus-4 { + border-color: #bf360c; +} +.border-deep-orange .border-accent-1, +.border-deep-orange.border-accent-1 { + border-color: #ff9e80; +} +.border-deep-orange .border-accent-2, +.border-deep-orange.border-accent-2 { + border-color: #ff6e40; +} +.border-deep-orange .border-accent-3, +.border-deep-orange.border-accent-3 { + border-color: #ff3d00; +} +.border-deep-orange .border-accent-4, +.border-deep-orange.border-accent-4 { + border-color: #dd2c00; +} +.border-deep-orange .border-base, +.border-deep-orange.border-base { + border-color: #ff5722; +} +.fill-brown { + background-color: #795548; +} +.fill-brown .fill-minus-1, +.fill-brown.fill-minus-1 { + background-color: #8d6e63; +} +.fill-brown .fill-minus-2, +.fill-brown.fill-minus-2 { + background-color: #a1887f; +} +.fill-brown .fill-minus-3, +.fill-brown.fill-minus-3 { + background-color: #bcaaa4; +} +.fill-brown .fill-minus-4, +.fill-brown.fill-minus-4 { + background-color: #d7ccc8; +} +.fill-brown .fill-minus-5, +.fill-brown.fill-minus-5 { + background-color: #efebe9; +} +.fill-brown .fill-plus-1, +.fill-brown.fill-plus-1 { + background-color: #6d4c41; +} +.fill-brown .fill-plus-2, +.fill-brown.fill-plus-2 { + background-color: #5d4037; +} +.fill-brown .fill-plus-3, +.fill-brown.fill-plus-3 { + background-color: #4e342e; +} +.fill-brown .fill-plus-4, +.fill-brown.fill-plus-4 { + background-color: #3e2723; +} +.fill-brown .fill-accent-1, +.fill-brown.fill-accent-1 { + background-color: #d7ccc8; +} +.fill-brown .fill-accent-2, +.fill-brown.fill-accent-2 { + background-color: #bcaaa4; +} +.fill-brown .fill-accent-3, +.fill-brown.fill-accent-3 { + background-color: #a1887f; +} +.fill-brown .fill-accent-4, +.fill-brown.fill-accent-4 { + background-color: #8d6e63; +} +.fill-brown .fill-base, +.fill-brown.fill-base { + background-color: #795548; +} +.text-brown { + color: #795548; +} +.text-brown .text-minus-1, +.text-brown.text-minus-1 { + color: #8d6e63; +} +.text-brown .text-minus-2, +.text-brown.text-minus-2 { + color: #a1887f; +} +.text-brown .text-minus-3, +.text-brown.text-minus-3 { + color: #bcaaa4; +} +.text-brown .text-minus-4, +.text-brown.text-minus-4 { + color: #d7ccc8; +} +.text-brown .text-minus-5, +.text-brown.text-minus-5 { + color: #efebe9; +} +.text-brown .text-plus-1, +.text-brown.text-plus-1 { + color: #6d4c41; +} +.text-brown .text-plus-2, +.text-brown.text-plus-2 { + color: #5d4037; +} +.text-brown .text-plus-3, +.text-brown.text-plus-3 { + color: #4e342e; +} +.text-brown .text-plus-4, +.text-brown.text-plus-4 { + color: #3e2723; +} +.text-brown .text-accent-1, +.text-brown.text-accent-1 { + color: #d7ccc8; +} +.text-brown .text-accent-2, +.text-brown.text-accent-2 { + color: #bcaaa4; +} +.text-brown .text-accent-3, +.text-brown.text-accent-3 { + color: #a1887f; +} +.text-brown .text-accent-4, +.text-brown.text-accent-4 { + color: #8d6e63; +} +.text-brown .text-base, +.text-brown.text-base { + color: #795548; +} +.border-brown { + border-color: #795548; +} +.border-brown .border-minus-1, +.border-brown.border-minus-1 { + border-color: #8d6e63; +} +.border-brown .border-minus-2, +.border-brown.border-minus-2 { + border-color: #a1887f; +} +.border-brown .border-minus-3, +.border-brown.border-minus-3 { + border-color: #bcaaa4; +} +.border-brown .border-minus-4, +.border-brown.border-minus-4 { + border-color: #d7ccc8; +} +.border-brown .border-minus-5, +.border-brown.border-minus-5 { + border-color: #efebe9; +} +.border-brown .border-plus-1, +.border-brown.border-plus-1 { + border-color: #6d4c41; +} +.border-brown .border-plus-2, +.border-brown.border-plus-2 { + border-color: #5d4037; +} +.border-brown .border-plus-3, +.border-brown.border-plus-3 { + border-color: #4e342e; +} +.border-brown .border-plus-4, +.border-brown.border-plus-4 { + border-color: #3e2723; +} +.border-brown .border-accent-1, +.border-brown.border-accent-1 { + border-color: #d7ccc8; +} +.border-brown .border-accent-2, +.border-brown.border-accent-2 { + border-color: #bcaaa4; +} +.border-brown .border-accent-3, +.border-brown.border-accent-3 { + border-color: #a1887f; +} +.border-brown .border-accent-4, +.border-brown.border-accent-4 { + border-color: #8d6e63; +} +.border-brown .border-base, +.border-brown.border-base { + border-color: #795548; +} +.fill-blue { + background-color: #5677fc; +} +.fill-blue .fill-minus-1, +.fill-blue.fill-minus-1 { + background-color: #738ffe; +} +.fill-blue .fill-minus-2, +.fill-blue.fill-minus-2 { + background-color: #91a7ff; +} +.fill-blue .fill-minus-3, +.fill-blue.fill-minus-3 { + background-color: #afbfff; +} +.fill-blue .fill-minus-4, +.fill-blue.fill-minus-4 { + background-color: #d0d9ff; +} +.fill-blue .fill-minus-5, +.fill-blue.fill-minus-5 { + background-color: #e7e9fd; +} +.fill-blue .fill-plus-1, +.fill-blue.fill-plus-1 { + background-color: #4e6cef; +} +.fill-blue .fill-plus-2, +.fill-blue.fill-plus-2 { + background-color: #455ede; +} +.fill-blue .fill-plus-3, +.fill-blue.fill-plus-3 { + background-color: #3b50ce; +} +.fill-blue .fill-plus-4, +.fill-blue.fill-plus-4 { + background-color: #2a36b1; +} +.fill-blue .fill-accent-1, +.fill-blue.fill-accent-1 { + background-color: #a6baff; +} +.fill-blue .fill-accent-2, +.fill-blue.fill-accent-2 { + background-color: #6889ff; +} +.fill-blue .fill-accent-3, +.fill-blue.fill-accent-3 { + background-color: #4d73ff; +} +.fill-blue .fill-accent-4, +.fill-blue.fill-accent-4 { + background-color: #4d69ff; +} +.fill-blue .fill-base, +.fill-blue.fill-base { + background-color: #5677fc; +} +.text-blue { + color: #5677fc; +} +.text-blue .text-minus-1, +.text-blue.text-minus-1 { + color: #738ffe; +} +.text-blue .text-minus-2, +.text-blue.text-minus-2 { + color: #91a7ff; +} +.text-blue .text-minus-3, +.text-blue.text-minus-3 { + color: #afbfff; +} +.text-blue .text-minus-4, +.text-blue.text-minus-4 { + color: #d0d9ff; +} +.text-blue .text-minus-5, +.text-blue.text-minus-5 { + color: #e7e9fd; +} +.text-blue .text-plus-1, +.text-blue.text-plus-1 { + color: #4e6cef; +} +.text-blue .text-plus-2, +.text-blue.text-plus-2 { + color: #455ede; +} +.text-blue .text-plus-3, +.text-blue.text-plus-3 { + color: #3b50ce; +} +.text-blue .text-plus-4, +.text-blue.text-plus-4 { + color: #2a36b1; +} +.text-blue .text-accent-1, +.text-blue.text-accent-1 { + color: #a6baff; +} +.text-blue .text-accent-2, +.text-blue.text-accent-2 { + color: #6889ff; +} +.text-blue .text-accent-3, +.text-blue.text-accent-3 { + color: #4d73ff; +} +.text-blue .text-accent-4, +.text-blue.text-accent-4 { + color: #4d69ff; +} +.text-blue .text-base, +.text-blue.text-base { + color: #5677fc; +} +.border-blue { + border-color: #5677fc; +} +.border-blue .border-minus-1, +.border-blue.border-minus-1 { + border-color: #738ffe; +} +.border-blue .border-minus-2, +.border-blue.border-minus-2 { + border-color: #91a7ff; +} +.border-blue .border-minus-3, +.border-blue.border-minus-3 { + border-color: #afbfff; +} +.border-blue .border-minus-4, +.border-blue.border-minus-4 { + border-color: #d0d9ff; +} +.border-blue .border-minus-5, +.border-blue.border-minus-5 { + border-color: #e7e9fd; +} +.border-blue .border-plus-1, +.border-blue.border-plus-1 { + border-color: #4e6cef; +} +.border-blue .border-plus-2, +.border-blue.border-plus-2 { + border-color: #455ede; +} +.border-blue .border-plus-3, +.border-blue.border-plus-3 { + border-color: #3b50ce; +} +.border-blue .border-plus-4, +.border-blue.border-plus-4 { + border-color: #2a36b1; +} +.border-blue .border-accent-1, +.border-blue.border-accent-1 { + border-color: #a6baff; +} +.border-blue .border-accent-2, +.border-blue.border-accent-2 { + border-color: #6889ff; +} +.border-blue .border-accent-3, +.border-blue.border-accent-3 { + border-color: #4d73ff; +} +.border-blue .border-accent-4, +.border-blue.border-accent-4 { + border-color: #4d69ff; +} +.border-blue .border-base, +.border-blue.border-base { + border-color: #5677fc; +} +.fill-blue-grey { + background-color: #607d8b; +} +.fill-blue-grey .fill-minus-1, +.fill-blue-grey.fill-minus-1 { + background-color: #78909c; +} +.fill-blue-grey .fill-minus-2, +.fill-blue-grey.fill-minus-2 { + background-color: #90a4ae; +} +.fill-blue-grey .fill-minus-3, +.fill-blue-grey.fill-minus-3 { + background-color: #b0bec5; +} +.fill-blue-grey .fill-minus-4, +.fill-blue-grey.fill-minus-4 { + background-color: #cfd8dc; +} +.fill-blue-grey .fill-minus-5, +.fill-blue-grey.fill-minus-5 { + background-color: #eceff1; +} +.fill-blue-grey .fill-plus-1, +.fill-blue-grey.fill-plus-1 { + background-color: #546e7a; +} +.fill-blue-grey .fill-plus-2, +.fill-blue-grey.fill-plus-2 { + background-color: #455a64; +} +.fill-blue-grey .fill-plus-3, +.fill-blue-grey.fill-plus-3 { + background-color: #37474f; +} +.fill-blue-grey .fill-plus-4, +.fill-blue-grey.fill-plus-4 { + background-color: #263238; +} +.fill-blue-grey .fill-accent-1, +.fill-blue-grey.fill-accent-1 { + background-color: #cfd8dc; +} +.fill-blue-grey .fill-accent-2, +.fill-blue-grey.fill-accent-2 { + background-color: #b0bec5; +} +.fill-blue-grey .fill-accent-3, +.fill-blue-grey.fill-accent-3 { + background-color: #90a4ae; +} +.fill-blue-grey .fill-accent-4, +.fill-blue-grey.fill-accent-4 { + background-color: #78909c; +} +.fill-blue-grey .fill-base, +.fill-blue-grey.fill-base { + background-color: #607d8b; +} +.text-blue-grey { + color: #607d8b; +} +.text-blue-grey .text-minus-1, +.text-blue-grey.text-minus-1 { + color: #78909c; +} +.text-blue-grey .text-minus-2, +.text-blue-grey.text-minus-2 { + color: #90a4ae; +} +.text-blue-grey .text-minus-3, +.text-blue-grey.text-minus-3 { + color: #b0bec5; +} +.text-blue-grey .text-minus-4, +.text-blue-grey.text-minus-4 { + color: #cfd8dc; +} +.text-blue-grey .text-minus-5, +.text-blue-grey.text-minus-5 { + color: #eceff1; +} +.text-blue-grey .text-plus-1, +.text-blue-grey.text-plus-1 { + color: #546e7a; +} +.text-blue-grey .text-plus-2, +.text-blue-grey.text-plus-2 { + color: #455a64; +} +.text-blue-grey .text-plus-3, +.text-blue-grey.text-plus-3 { + color: #37474f; +} +.text-blue-grey .text-plus-4, +.text-blue-grey.text-plus-4 { + color: #263238; +} +.text-blue-grey .text-accent-1, +.text-blue-grey.text-accent-1 { + color: #cfd8dc; +} +.text-blue-grey .text-accent-2, +.text-blue-grey.text-accent-2 { + color: #b0bec5; +} +.text-blue-grey .text-accent-3, +.text-blue-grey.text-accent-3 { + color: #90a4ae; +} +.text-blue-grey .text-accent-4, +.text-blue-grey.text-accent-4 { + color: #78909c; +} +.text-blue-grey .text-base, +.text-blue-grey.text-base { + color: #607d8b; +} +.border-blue-grey { + border-color: #607d8b; +} +.border-blue-grey .border-minus-1, +.border-blue-grey.border-minus-1 { + border-color: #78909c; +} +.border-blue-grey .border-minus-2, +.border-blue-grey.border-minus-2 { + border-color: #90a4ae; +} +.border-blue-grey .border-minus-3, +.border-blue-grey.border-minus-3 { + border-color: #b0bec5; +} +.border-blue-grey .border-minus-4, +.border-blue-grey.border-minus-4 { + border-color: #cfd8dc; +} +.border-blue-grey .border-minus-5, +.border-blue-grey.border-minus-5 { + border-color: #eceff1; +} +.border-blue-grey .border-plus-1, +.border-blue-grey.border-plus-1 { + border-color: #546e7a; +} +.border-blue-grey .border-plus-2, +.border-blue-grey.border-plus-2 { + border-color: #455a64; +} +.border-blue-grey .border-plus-3, +.border-blue-grey.border-plus-3 { + border-color: #37474f; +} +.border-blue-grey .border-plus-4, +.border-blue-grey.border-plus-4 { + border-color: #263238; +} +.border-blue-grey .border-accent-1, +.border-blue-grey.border-accent-1 { + border-color: #cfd8dc; +} +.border-blue-grey .border-accent-2, +.border-blue-grey.border-accent-2 { + border-color: #b0bec5; +} +.border-blue-grey .border-accent-3, +.border-blue-grey.border-accent-3 { + border-color: #90a4ae; +} +.border-blue-grey .border-accent-4, +.border-blue-grey.border-accent-4 { + border-color: #78909c; +} +.border-blue-grey .border-base, +.border-blue-grey.border-base { + border-color: #607d8b; +} +.fill-grey { + background-color: #9e9e9e; +} +.fill-grey .fill-minus-1, +.fill-grey.fill-minus-1 { + background-color: #bdbdbd; +} +.fill-grey .fill-minus-2, +.fill-grey.fill-minus-2 { + background-color: #e0e0e0; +} +.fill-grey .fill-minus-3, +.fill-grey.fill-minus-3 { + background-color: #eee; +} +.fill-grey .fill-minus-4, +.fill-grey.fill-minus-4 { + background-color: #f5f5f5; +} +.fill-grey .fill-minus-5, +.fill-grey.fill-minus-5 { + background-color: #fafafa; +} +.fill-grey .fill-plus-1, +.fill-grey.fill-plus-1 { + background-color: #757575; +} +.fill-grey .fill-plus-2, +.fill-grey.fill-plus-2 { + background-color: #616161; +} +.fill-grey .fill-plus-3, +.fill-grey.fill-plus-3 { + background-color: #424242; +} +.fill-grey .fill-plus-4, +.fill-grey.fill-plus-4 { + background-color: #212121; +} +.fill-grey .fill-accent-1, +.fill-grey.fill-accent-1 { + background-color: #f5f5f5; +} +.fill-grey .fill-accent-2, +.fill-grey.fill-accent-2 { + background-color: #eee; +} +.fill-grey .fill-accent-3, +.fill-grey.fill-accent-3 { + background-color: #e0e0e0; +} +.fill-grey .fill-accent-4, +.fill-grey.fill-accent-4 { + background-color: #bdbdbd; +} +.fill-grey .fill-base, +.fill-grey.fill-base { + background-color: #9e9e9e; +} +.text-grey { + color: #9e9e9e; +} +.text-grey .text-minus-1, +.text-grey.text-minus-1 { + color: #bdbdbd; +} +.text-grey .text-minus-2, +.text-grey.text-minus-2 { + color: #e0e0e0; +} +.text-grey .text-minus-3, +.text-grey.text-minus-3 { + color: #eee; +} +.text-grey .text-minus-4, +.text-grey.text-minus-4 { + color: #f5f5f5; +} +.text-grey .text-minus-5, +.text-grey.text-minus-5 { + color: #fafafa; +} +.text-grey .text-plus-1, +.text-grey.text-plus-1 { + color: #757575; +} +.text-grey .text-plus-2, +.text-grey.text-plus-2 { + color: #616161; +} +.text-grey .text-plus-3, +.text-grey.text-plus-3 { + color: #424242; +} +.text-grey .text-plus-4, +.text-grey.text-plus-4 { + color: #212121; +} +.text-grey .text-accent-1, +.text-grey.text-accent-1 { + color: #f5f5f5; +} +.text-grey .text-accent-2, +.text-grey.text-accent-2 { + color: #eee; +} +.text-grey .text-accent-3, +.text-grey.text-accent-3 { + color: #e0e0e0; +} +.text-grey .text-accent-4, +.text-grey.text-accent-4 { + color: #bdbdbd; +} +.text-grey .text-base, +.text-grey.text-base { + color: #9e9e9e; +} +.border-grey { + border-color: #9e9e9e; +} +.border-grey .border-minus-1, +.border-grey.border-minus-1 { + border-color: #bdbdbd; +} +.border-grey .border-minus-2, +.border-grey.border-minus-2 { + border-color: #e0e0e0; +} +.border-grey .border-minus-3, +.border-grey.border-minus-3 { + border-color: #eee; +} +.border-grey .border-minus-4, +.border-grey.border-minus-4 { + border-color: #f5f5f5; +} +.border-grey .border-minus-5, +.border-grey.border-minus-5 { + border-color: #fafafa; +} +.border-grey .border-plus-1, +.border-grey.border-plus-1 { + border-color: #757575; +} +.border-grey .border-plus-2, +.border-grey.border-plus-2 { + border-color: #616161; +} +.border-grey .border-plus-3, +.border-grey.border-plus-3 { + border-color: #424242; +} +.border-grey .border-plus-4, +.border-grey.border-plus-4 { + border-color: #212121; +} +.border-grey .border-accent-1, +.border-grey.border-accent-1 { + border-color: #f5f5f5; +} +.border-grey .border-accent-2, +.border-grey.border-accent-2 { + border-color: #eee; +} +.border-grey .border-accent-3, +.border-grey.border-accent-3 { + border-color: #e0e0e0; +} +.border-grey .border-accent-4, +.border-grey.border-accent-4 { + border-color: #bdbdbd; +} +.border-grey .border-base, +.border-grey.border-base { + border-color: #9e9e9e; +} +.fill-black { + background-color: #000; +} +.fill-black .fill-base, +.fill-black.fill-base { + background-color: #000; +} +.text-black { + color: #000; +} +.text-black .text-base, +.text-black.text-base { + color: #000; +} +.border-black { + border-color: #000; +} +.border-black .border-base, +.border-black.border-base { + border-color: #000; +} +.fill-white { + background-color: #fff; +} +.fill-white .fill-base, +.fill-white.fill-base { + background-color: #fff; +} +.text-white { + color: #fff; +} +.text-white .text-base, +.text-white.text-base { + color: #fff; +} +.border-white { + border-color: #fff; +} +.border-white .border-base, +.border-white.border-base { + border-color: #fff; +} +.text { + overflow: hidden; + position: relative; +} +.clearfix:before, +.clearfix:after { + content: " "; + display: table; +} +.clearfix:after { + clear: both; +} +.pull-left { + float: left; +} +.pull-right { + float: right; +} +.inline-block { + display: inline-block; + *display: inline; + *zoom: 1; +} +.text-center { + text-align: center; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.block { + display: block; +} +a { + word-break: break-word; +} +ul.minimized ul { + visibility: hidden; + opacity: 0; + overflow: hidden; + display: none; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; +} +ul.minimized ul.opened { + visibility: visible; + opacity: 1; + border-color: #cfd8dc; +} +ul.unstyled { + list-style: none; + margin: 0; + padding: 0; +} +ul.unstyled li { + display: block; +} +ul.unstyled ul { + list-style: none; + margin: 0; + padding: 0; +} +ul.unstyled ul li a { + padding-left: 20px; +} +ul.unstyled ul li ul li a { + padding-left: 40px; +} +ul.unstyled ul li ul ul li a { + padding-left: 60px; +} +ul.inline { + list-style: none; + padding: 0; + margin: 0; +} +ul.inline > li { + display: inline-block; + *display: inline; + *zoom: 1; +} +*, +*:before, +*:after { + box-sizing: border-box; +} +html { + font-size: 62.5%; + line-height: 62.5%; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; + line-height: inherit; +} +/* normalize.css v3.0.0 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + line-height: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; + line-height: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; + line-height: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +html, +body { + height: 100%; + margin: 0; +} +body { + display: table; + height: 100%; + width: 100%; +} +html { + overflow-y: scroll; +} +footer, +.bot, +header, +.top, +#wrapper { + display: table-row; + height: 1px; +} +#wrapper { + height: 100%; +} +.crow { + text-align: center; + height: 100%; + font-size: 0; + line-height: 0; + padding: 0 15px; +} +.crow .w-1 { + width: 1%; +} +.crow .w-2 { + width: 2%; +} +.crow .w-3 { + width: 3%; +} +.crow .w-4 { + width: 4%; +} +.crow .w-5 { + width: 5%; +} +.crow .w-6 { + width: 6%; +} +.crow .w-7 { + width: 7%; +} +.crow .w-8 { + width: 8%; +} +.crow .w-9 { + width: 9%; +} +.crow .w-10 { + width: 10%; +} +.crow .w-11 { + width: 11%; +} +.crow .w-12 { + width: 12%; +} +.crow .w-13 { + width: 13%; +} +.crow .w-14 { + width: 14%; +} +.crow .w-15 { + width: 15%; +} +.crow .w-16 { + width: 16%; +} +.crow .w-17 { + width: 17%; +} +.crow .w-18 { + width: 18%; +} +.crow .w-19 { + width: 19%; +} +.crow .w-20 { + width: 20%; +} +.crow .w-21 { + width: 21%; +} +.crow .w-22 { + width: 22%; +} +.crow .w-23 { + width: 23%; +} +.crow .w-24 { + width: 24%; +} +.crow .w-25 { + width: 25%; +} +.crow .w-26 { + width: 26%; +} +.crow .w-27 { + width: 27%; +} +.crow .w-28 { + width: 28%; +} +.crow .w-29 { + width: 29%; +} +.crow .w-30 { + width: 30%; +} +.crow .w-31 { + width: 31%; +} +.crow .w-32 { + width: 32%; +} +.crow .w-33 { + width: 33%; +} +.crow .w-34 { + width: 34%; +} +.crow .w-35 { + width: 35%; +} +.crow .w-36 { + width: 36%; +} +.crow .w-37 { + width: 37%; +} +.crow .w-38 { + width: 38%; +} +.crow .w-39 { + width: 39%; +} +.crow .w-40 { + width: 40%; +} +.crow .w-41 { + width: 41%; +} +.crow .w-42 { + width: 42%; +} +.crow .w-43 { + width: 43%; +} +.crow .w-44 { + width: 44%; +} +.crow .w-45 { + width: 45%; +} +.crow .w-46 { + width: 46%; +} +.crow .w-47 { + width: 47%; +} +.crow .w-48 { + width: 48%; +} +.crow .w-49 { + width: 49%; +} +.crow .w-50 { + width: 50%; +} +.crow .w-51 { + width: 51%; +} +.crow .w-52 { + width: 52%; +} +.crow .w-53 { + width: 53%; +} +.crow .w-54 { + width: 54%; +} +.crow .w-55 { + width: 55%; +} +.crow .w-56 { + width: 56%; +} +.crow .w-57 { + width: 57%; +} +.crow .w-58 { + width: 58%; +} +.crow .w-59 { + width: 59%; +} +.crow .w-60 { + width: 60%; +} +.crow .w-61 { + width: 61%; +} +.crow .w-62 { + width: 62%; +} +.crow .w-63 { + width: 63%; +} +.crow .w-64 { + width: 64%; +} +.crow .w-65 { + width: 65%; +} +.crow .w-66 { + width: 66%; +} +.crow .w-67 { + width: 67%; +} +.crow .w-68 { + width: 68%; +} +.crow .w-69 { + width: 69%; +} +.crow .w-70 { + width: 70%; +} +.crow .w-71 { + width: 71%; +} +.crow .w-72 { + width: 72%; +} +.crow .w-73 { + width: 73%; +} +.crow .w-74 { + width: 74%; +} +.crow .w-75 { + width: 75%; +} +.crow .w-76 { + width: 76%; +} +.crow .w-77 { + width: 77%; +} +.crow .w-78 { + width: 78%; +} +.crow .w-79 { + width: 79%; +} +.crow .w-80 { + width: 80%; +} +.crow .w-81 { + width: 81%; +} +.crow .w-82 { + width: 82%; +} +.crow .w-83 { + width: 83%; +} +.crow .w-84 { + width: 84%; +} +.crow .w-85 { + width: 85%; +} +.crow .w-86 { + width: 86%; +} +.crow .w-87 { + width: 87%; +} +.crow .w-88 { + width: 88%; +} +.crow .w-89 { + width: 89%; +} +.crow .w-90 { + width: 90%; +} +.crow .w-91 { + width: 91%; +} +.crow .w-92 { + width: 92%; +} +.crow .w-93 { + width: 93%; +} +.crow .w-94 { + width: 94%; +} +.crow .w-95 { + width: 95%; +} +.crow .w-96 { + width: 96%; +} +.crow .w-97 { + width: 97%; +} +.crow .w-98 { + width: 98%; +} +.crow .w-99 { + width: 99%; +} +.crow .w-100 { + width: 100%; +} +.crow .ws-1 { + width: 8.333333333333334%; +} +.crow .ws-2 { + width: 16.666666666666668%; +} +.crow .ws-3 { + width: 25%; +} +.crow .ws-4 { + width: 33.333333333333336%; +} +.crow .ws-5 { + width: 41.666666666666664%; +} +.crow .ws-6 { + width: 50%; +} +.crow .ws-7 { + width: 58.333333333333336%; +} +.crow .ws-8 { + width: 66.66666666666667%; +} +.crow .ws-9 { + width: 75%; +} +.crow .ws-10 { + width: 83.33333333333333%; +} +.crow .ws-11 { + width: 91.66666666666667%; +} +.crow .ws-12 { + width: 100%; +} +.crow .crow { + text-align: center; + font-size: 0; + line-height: 0; + padding: 0; +} +.crow.fly > div:first-child:nth-last-child(1), +.crow.fly > div:first-child:nth-last-child(1) ~ div { + width: 100%; +} +.crow.fly > div:first-child:nth-last-child(2), +.crow.fly > div:first-child:nth-last-child(2) ~ div { + width: 50%; +} +.crow.fly > div:first-child:nth-last-child(3), +.crow.fly > div:first-child:nth-last-child(3) ~ div { + width: 33.333333333333336%; +} +.crow.fly > div:first-child:nth-last-child(4), +.crow.fly > div:first-child:nth-last-child(4) ~ div { + width: 25%; +} +.crow.fly > div:first-child:nth-last-child(5), +.crow.fly > div:first-child:nth-last-child(5) ~ div { + width: 20%; +} +.crow.fly > div:first-child:nth-last-child(6), +.crow.fly > div:first-child:nth-last-child(6) ~ div { + width: 16.666666666666668%; +} +.crow.fly > div:first-child:nth-last-child(7), +.crow.fly > div:first-child:nth-last-child(7) ~ div { + width: 14.285714285714286%; +} +.crow.fly > div:first-child:nth-last-child(8), +.crow.fly > div:first-child:nth-last-child(8) ~ div { + width: 12.5%; +} +.crow.fly > div:first-child:nth-last-child(9), +.crow.fly > div:first-child:nth-last-child(9) ~ div { + width: 11.11111111111111%; +} +.crow.fly > div:first-child:nth-last-child(10), +.crow.fly > div:first-child:nth-last-child(10) ~ div { + width: 10%; +} +.crow.fly > div:first-child:nth-last-child(11), +.crow.fly > div:first-child:nth-last-child(11) ~ div { + width: 9.090909090909092%; +} +.crow.fly > div:first-child:nth-last-child(12), +.crow.fly > div:first-child:nth-last-child(12) ~ div { + width: 8.333333333333334%; +} +.crow.no-gutter { + padding: 0; +} +.crow.no-gutter > div { + padding: 0; +} +.crow.up > div { + vertical-align: top; +} +.crow.down > div { + vertical-align: bottom; +} +.crow > div { + vertical-align: middle; + font-size: 140rem; + font-size: 14px; + line-height: 140rem; + line-height: 14px; + line-height: 220rem; + line-height: 22px; + display: inline-block; + padding: 0 15px; +} +.crow > div:not(.text-center) { + text-align: left; +} +.crow > div.up { + vertical-align: top; +} +.crow > div.down { + vertical-align: bottom; +} +.crow:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; +} +.container { + width: 960px; + margin: 0 auto; + padding: 0 15px; +} +.container > .crow { + margin: 0 -15px; + padding: 0 !important; +} +@media (min-width: 1200px) { + .container { + width: 970px; + } +} +@media (min-width: 768px) and (max-width: 1199px) { + body .container { + width: 750px; + } + body .container .crow > .crow.crow { + height: auto; + } + body .container .crow > .crow.crow > div { + display: block; + width: 100%; + } + body .container .crow > .crow.crow:before { + content: ''; + display: none; + } +} +@media (max-width: 767px) { + body .container { + width: auto; + } + body .crow > .crow:not(.keep-alive).crow, + body .crow.crow:not(.keep-alive).crow { + height: auto; + } + body .crow > .crow:not(.keep-alive).crow > div, + body .crow.crow:not(.keep-alive).crow > div { + display: block; + width: 100%; + } + body .crow > .crow:not(.keep-alive).crow:before, + body .crow.crow:not(.keep-alive).crow:before { + content: ''; + display: none; + } +} +input[type=text] { + width: 100%; + background: none; + border: 0; + border-bottom: 1px solid #cfd8dc; + padding: 5px 0 9px 0; + -webkit-font-smoothing: antialiased; +} +input[type=text]:focus { + outline: 0; + border-width: 2px; + padding-bottom: 8px; + border-color: #00bcd4; +} +input[type=text]:disabled { + border-style: dotted; +} +input[type=text]:disabled:hover { + cursor: not-allowed; +} +input[type=text]:disabled::-webkit-input-placeholder { + opacity: 0.5; +} +input[type=text]:disabled:-moz-placeholder { + opacity: 0.5; +} +input[type=text]:disabled::-moz-placeholder { + opacity: 0.5; +} +input[type=text]:disabled:-ms-input-placeholder { + opacity: 0.5; +} +.input { + position: relative; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + padding: 10px; +} +.input .error-message { + padding: 0 10px; + opacity: 0; + visibility: hidden; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + font-size: 80%; + line-height: 80%; + color: #e51c23; +} +.input.error { + margin-bottom: 20px; +} +.input.error .error-message { + opacity: 1; + visibility: visible; +} +.input.error input, +.input.error textarea { + border-width: 2px; + padding-bottom: 8px; + border-color: #e51c23; +} +textarea { + max-width: 100%; + min-width: 100%; + min-height: 100px; + width: 100%; + background: none; + border: 0; + border-bottom: 1px solid #cfd8dc; + padding: 5px 0 9px 0; + -webkit-font-smoothing: antialiased; +} +textarea:focus { + outline: 0; + border-width: 2px; + padding-bottom: 8px; + border-color: #00bcd4; +} +textarea:disabled { + border-style: dotted; +} +textarea:disabled:hover { + cursor: not-allowed; +} +textarea:disabled::-webkit-input-placeholder { + opacity: 0.5; +} +textarea:disabled:-moz-placeholder { + opacity: 0.5; +} +textarea:disabled::-moz-placeholder { + opacity: 0.5; +} +textarea:disabled:-ms-input-placeholder { + opacity: 0.5; +} +select { + width: 100%; +} +label, +.label { + font-size: 80%; + line-height: 80%; + color: #9e9e9e; +} +label:not(div), +.label:not(div) { + display: inline-block; + *display: inline; + *zoom: 1; +} +input[type=submit] { + -webkit-appearance: none; + border: 0; + -webkit-font-smoothing: antialiased; + padding: 10px 20px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + text-transform: uppercase; + font-size: 90%; + line-height: 90%; + width: auto !important; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + display: inline-block; + *display: inline; + *zoom: 1; + -webkit-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + -moz-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); +} +input[type=submit]:hover { + background-color: #0097a7; + -webkit-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + -moz-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); +} +input[type=submit]:active { + -webkit-box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); + -moz-box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); + box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); +} +input[type=submit].disabled { + background-color: #eee; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type=submit].disabled:hover { + background-color: none; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type=submit].disabled:active { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type=submit]:focus { + outline: 0; +} +input[type=submit]:hover { + color: #e6e6e6; +} +input[type=submit].flat { + color: inherit; +} +input[type=submit].disabled, +input[type=submit]:disabled { + background-color: #eee; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type=submit].disabled:hover, +input[type=submit]:disabled:hover { + background-color: none; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type=submit].disabled:active, +input[type=submit]:disabled:active { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button { + padding: 10px 20px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + text-transform: uppercase; + font-size: 90%; + line-height: 90%; + width: auto !important; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + display: inline-block; + *display: inline; + *zoom: 1; + -webkit-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + -moz-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); +} +.button:hover { + background-color: #0097a7; + -webkit-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + -moz-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); +} +.button:active { + -webkit-box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); + -moz-box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); + box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); +} +.button.disabled { + background-color: #eee; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.disabled:hover { + background-color: none; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.disabled:active { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.flat { + background: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.flat:hover { + background-color: #4dd0e1; + -webkit-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + -moz-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); +} +.button.flat:active { + -webkit-box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); + -moz-box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); + box-shadow: 0px 6px 12px 2px rgba(0,0,0,0.19); +} +.button.flat.disabled { + background-color: #eee; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.flat.disabled:hover { + background-color: none; + color: #bdbdbd; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.flat.disabled:active { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.text { + background: none; + padding: 0 20px 0 0; + font-weight: bold; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.text:hover { + background: none; + color: #4dd0e1; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.text:active { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.button.text.disabled { + background: none; +} +.button.text.disabled:hover { + color: #bdbdbd; +} +a.button:hover { + text-decoration: none; + color: #e6e6e6; +} +.card { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + overflow: hidden; + -webkit-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + -moz-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + display: inline-block; + *display: inline; + *zoom: 1; +} +a.card { + color: inherit; +} +.circle { + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + border-radius: 50%; + overflow: hidden; + width: 100%; + text-align: center; + display: inline-block; + *display: inline; + *zoom: 1; + -webkit-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + -moz-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); +} +.circle:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + margin-right: -0.125em; + margin-left: -0.125em; +} +.circle *:first-child { + vertical-align: middle; + display: inline-block; + *display: inline; + *zoom: 1; +} +.circle *:first-child * { + vertical-align: baseline; +} +.circle .icon { + font-size: 300rem; + font-size: 30px; + line-height: 300rem; + line-height: 30px; +} +a.circle:hover { + text-decoration: none; +} +.relative { + position: relative; +} +.relative .drop { + visibility: hidden; + opacity: 0; + font-size: initial; + line-height: initial; + color: initial; +} +.relative .drop a.list-item:hover { + background-color: #eee; +} +.relative:hover .drop { + visibility: visible; + opacity: 1; +} +.drop { + position: absolute; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + z-index: 11; +} +.drop.up { + bottom: 0; + top: auto; +} +.drop.up.max { + width: 100%; +} +.drop.up-left { + top: auto; + bottom: 100%; + left: 0; + right: auto; +} +.drop.up-left.max { + width: 100%; +} +.drop.up-right { + top: auto; + bottom: 100%; + right: 0; + left: auto; +} +.drop.up-right.max { + width: 100%; +} +.drop.down { + top: 0; + bottom: auto; +} +.drop.down.max { + width: 100%; +} +.drop.down-left { + top: 100%; + bottom: auto; + left: 0; + right: auto; +} +.drop.down-left.max { + width: 100%; +} +.drop.down-right { + top: 100%; + bottom: auto; + right: 0; + left: auto; +} +.drop.down-right.max { + width: 100%; +} +.drop.left { + left: 0; + right: auto; +} +.drop.left-down { + left: auto; + right: 100%; + top: 0; + bottom: auto; +} +.drop.left-down.max { + width: 100%; +} +.drop.left-up { + left: auto; + right: 100%; + bottom: 0; + top: auto; +} +.drop.left-up.max { + width: 100%; +} +.drop.right { + right: 0; + left: auto; +} +.drop.right-down { + right: auto; + left: 100%; + top: 0; + bottom: auto; +} +.drop.right-down.max { + width: 100%; +} +.drop.right-up { + right: auto; + left: 100%; + bottom: 0; + top: auto; +} +.drop.right-up.max { + width: 100%; +} +.image { + line-height: 0; + position: relative; +} +.overlay { + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + background-color: rgba(0,0,0,0.5); + line-height: initial; + padding: 10px; + color: #fff; +} +a.list-item, +span.list-item, +strong.list-item { + color: #424242; + display: block; + width: 100%; + position: relative; + padding: 10px 10px; +} +a.list-item:before, +span.list-item:before, +strong.list-item:before, +a.list-item:after, +span.list-item:after, +strong.list-item:after { + content: " "; + display: table; +} +a.list-item:after, +span.list-item:after, +strong.list-item:after { + clear: both; +} +a.list-item .text, +span.list-item .text, +strong.list-item .text { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; +} +a.list-item .text:before, +span.list-item .text:before, +strong.list-item .text:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + margin-right: -0.125em; + margin-left: -0.125em; +} +a.list-item .text *:first-child, +span.list-item .text *:first-child, +strong.list-item .text *:first-child { + vertical-align: middle; + display: inline-block; + *display: inline; + *zoom: 1; +} +a.list-item .text *:first-child *, +span.list-item .text *:first-child *, +strong.list-item .text *:first-child * { + vertical-align: baseline; +} +a.list-item .pull-left + .text, +span.list-item .pull-left + .text, +strong.list-item .pull-left + .text { + padding: 0 0 10px 0; + border-bottom: 1px solid #cfd8dc; +} +a.list-item .clearfix .pull-left:before, +span.list-item .clearfix .pull-left:before, +strong.list-item .clearfix .pull-left:before, +a.list-item .clearfix .pull-right:before, +span.list-item .clearfix .pull-right:before, +strong.list-item .clearfix .pull-right:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + margin-right: -0.125em; + margin-left: -0.125em; +} +a.list-item .clearfix .pull-left *:first-child, +span.list-item .clearfix .pull-left *:first-child, +strong.list-item .clearfix .pull-left *:first-child, +a.list-item .clearfix .pull-right *:first-child, +span.list-item .clearfix .pull-right *:first-child, +strong.list-item .clearfix .pull-right *:first-child { + vertical-align: middle; + display: inline-block; + *display: inline; + *zoom: 1; +} +a.list-item .clearfix .pull-left *:first-child *, +span.list-item .clearfix .pull-left *:first-child *, +strong.list-item .clearfix .pull-left *:first-child *, +a.list-item .clearfix .pull-right *:first-child *, +span.list-item .clearfix .pull-right *:first-child *, +strong.list-item .clearfix .pull-right *:first-child * { + vertical-align: baseline; +} +a.list-item .icon:first-child, +span.list-item .icon:first-child, +strong.list-item .icon:first-child { + margin-right: 5px; +} +a.list-item:hover, +span.list-item:hover, +strong.list-item:hover { + text-decoration: none; + color: #009688; +} +.modal { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0,0,0,0.5); +} +.modal .modal-inner { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} +.slider { + overflow: hidden; + position: relative; +} +.slider .stripe:before, +.slider .stripe:after { + content: " "; + display: table; +} +.slider .stripe:after { + clear: both; +} +.slider .stripe .slide { + background-size: cover; + background-position: center center; + height: 100%; +} +.slider .stripe .slide img { + width: 100%; +} +.slider .slider-nav { + position: absolute; + bottom: 20px; + left: 0; + right: 0; + width: 100%; + text-align: center; + z-index: 10; +} +.slider .slider-nav ul li { + padding: 0; +} +.slider .slider-nav ul li a { + width: 10px; + height: 10px; + background-color: #9e9e9e; +} +.slider .slider-nav ul li a:hover { + background-color: #e0e0e0; +} +.slider .slider-nav ul li a.active { + background-color: #fff; +} +.onoffswitch { + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + display: inline-block; + *display: inline; + *zoom: 1; +} +.onoffswitch .checkbox { + display: none; +} +.onoffswitch .checkbox:checked + .switch .inner { + margin-left: -100%; +} +.onoffswitch .checkbox:checked + .switch .handle { + right: 50%; +} +.onoffswitch .switch { + margin: 0; + display: block; + overflow: hidden; + cursor: pointer; + border: 1px solid #cfd8dc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + height: 100%; +} +.onoffswitch .switch .inner { + height: inherit; + width: 200%; + -webkit-transition: margin 0.3s ease-in; + transition: margin 0.3s ease-in; + text-transform: uppercase; +} +.onoffswitch .switch .inner .on { + margin: 0 -1px 0 -2px; + color: #fff; + background-color: #00bcd4; +} +.onoffswitch .switch .inner .on, +.onoffswitch .switch .inner .off { + height: inherit; + width: 50%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + font-size: 0; + line-height: 0; + display: inline-block; + *display: inline; + *zoom: 1; + color: #fff; +} +.onoffswitch .switch .inner .on .value, +.onoffswitch .switch .inner .off .value { + padding: 8px 8px; + vertical-align: middle; + width: 50%; + line-height: 240rem; + line-height: 24px; + font-size: 140rem; + font-size: 14px; + line-height: 140rem; + line-height: 14px; + text-align: center; + display: inline-block; + *display: inline; + *zoom: 1; +} +.onoffswitch .switch .inner .off { + text-align: right; + background-color: #e0e0e0; + color: #fff; +} +.onoffswitch .switch .inner .off .value { + padding-right: 16px; +} +.onoffswitch .switch .handle { + position: absolute; + top: 0; + bottom: 0; + right: 0px; + width: 50%; + border: 1px solid #cfd8dc; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + display: block; + -webkit-transition: all 0.3s ease-in; + transition: all 0.3s ease-in; + background-color: #fff; +} +.tile { + -webkit-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + -moz-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + display: inline-block; + *display: inline; + *zoom: 1; +} +a.tile { + color: inherit; +} +.notice:before, +.notice:after { + content: " "; + display: table; +} +.notice:after { + clear: both; +} +.notice .message { + margin: 10px; + padding: 15px 20px; + background-color: #212121; + -webkit-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + -moz-box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + box-shadow: 0px 1px 4px 1px rgba(0,0,0,0.12); + display: inline-block; + *display: inline; + *zoom: 1; + color: #fff; + display: block; +} +.notice .message span { + font-size: 90%; + line-height: 90%; +} +.notice .message .button { + padding: 0; + color: #00bcd4; +} +.notice .message .button:hover { + background: none; + color: #80deea; +} +.tabs a.tab-link { + text-align: center; + border-bottom: 2px solid transparent; + display: block; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + margin: 0 -2px; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.tabs a.tab-link.icon { + font-size: 120%; + line-height: 120%; +} +.tabs a.tab-link:hover, +.tabs a.tab-link.active { + text-decoration: none; + background: none; + border-color: #00bcd4; + color: #00bcd4; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.tabs a.tab-link:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.mod-row .mod { + padding: 2.5px; +} +body { + font-family: 'Roboto', arial; + font-size: 140rem; + font-size: 14px; + line-height: 140rem; + line-height: 14px; + line-height: 220rem; + line-height: 22px; + color: #424242; + background-color: #fafafa; + -webkit-font-smoothing: antialiased; +} +body:before { + position: fixed; + visibility: hidden; + *display: none; +} +.show-on-mobile { + display: none; +} +a { + color: #00bcd4; + text-decoration: none; +} +a:hover, +a:focus { + color: #4dd0e1; + text-decoration: underline; +} +h1 { + font-size: 340rem; + font-size: 34px; + line-height: 340rem; + line-height: 34px; + line-height: 510rem; + line-height: 51px; +} +h2 { + font-size: 200rem; + font-size: 20px; + line-height: 200rem; + line-height: 20px; + line-height: 300rem; + line-height: 30px; +} +h3 { + font-size: 160rem; + font-size: 16px; + line-height: 160rem; + line-height: 16px; + line-height: 240rem; + line-height: 24px; +} +h4 { + font-size: 140rem; + font-size: 14px; + line-height: 140rem; + line-height: 14px; + line-height: 210rem; + line-height: 21px; +} +h5 { + font-size: 120rem; + font-size: 12px; + line-height: 120rem; + line-height: 12px; + line-height: 180rem; + line-height: 18px; +} +img { + max-width: 100%; +} +#wrapper { + position: relative; +} +#wrapper .fullwidth { + height: 100%; +} +header .fullwidth, +.top .fullwidth { + -webkit-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + -moz-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); +} +footer .fullwidth, +.bot .fullwidth { + padding: 12px 0 10px 0; + -webkit-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + -moz-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); + box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.16); +} +hr { + border: 0; + border-bottom: 1px solid #cfd8dc; +} +.small { + font-size: 80%; + line-height: 80%; +} +.large { + font-size: 120%; + line-height: 120%; +} +.base-padding { + padding: 10px; +} +.strong-padding { + padding: 15px; +} +.spacer { + height: 40px; +} +.spacer.half { + height: 20px; +} +.spacer.quarter { + height: 10px; +} +@media (min-width: 1200px) { + body:before { + content: 'desktop'; + } +} +@media (max-width: 767px) { + body { + overflow: hidden; + } + body .sharer, + body .desktop-nav { + display: none; + } + body .show-on-mobile { + display: block; + } +@media (max-width: 481px) { + body:before { + content: 'smartphone vertical'; + } +} +@media (min-width: 481px) and (max-width: 767px) { + body:before { + content: 'smartphone horizontal'; + } +} +} diff --git a/static/jquery.js b/static/jquery.js new file mode 100644 index 0000000..3854747 --- /dev/null +++ b/static/jquery.js @@ -0,0 +1,9842 @@ +/*! + * jQuery JavaScript Library v2.2.3 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-04-05T19:26Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var arr = []; + +var document = window.document; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "2.2.3", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isPlainObject: function( obj ) { + var key; + + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf( "use strict" ) === 1 ) { + script = document.createElement( "script" ); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + + // Inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE9-10 only + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + register: function( owner, initial ) { + var value = initial || {}; + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable, non-writable property + // configurability must be true to allow the property to be + // deleted with the delete operator + } else { + Object.defineProperty( owner, this.expando, { + value: value, + writable: true, + configurable: true + } ); + } + return owner[ this.expando ]; + }, + cache: function( owner ) { + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( !acceptData( owner ) ) { + return {}; + } + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + owner[ this.expando ] && owner[ this.expando ][ key ]; + }, + access: function( owner, key, value ) { + var stored; + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase( key ) ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key === undefined ) { + this.register( owner ); + + } else { + + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <= 35-45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data, camelKey; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // with the key as-is + data = dataUser.get( elem, key ) || + + // Try to find dashed key if it exists (gh-2779) + // This is for 2.2.x only + dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); + + if ( data !== undefined ) { + return data; + } + + camelKey = jQuery.camelCase( key ); + + // Attempt to get data from the cache + // with the key camelized + data = dataUser.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + camelKey = jQuery.camelCase( key ); + this.each( function() { + + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = dataUser.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + dataUser.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf( "-" ) > -1 && data !== undefined ) { + dataUser.set( this, key, value ); + } + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "
", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE9-11+ + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0-4.3, Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + + "screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "