diff --git a/civicrm.php b/civicrm.php
index 0ee13e852f6257cad520fc4aee3088eade86e892..8595224444f8fd3700197cf89dd7deabd8a303a3 100644
--- a/civicrm.php
+++ b/civicrm.php
@@ -2,7 +2,7 @@
 /**
  * Plugin Name: CiviCRM
  * Description: CiviCRM - Growing and Sustaining Relationships
- * Version: 5.79.1
+ * Version: 5.80.0
  * Requires at least: 4.9
  * Requires PHP:      7.4
  * Author: CiviCRM LLC
@@ -36,7 +36,7 @@ if (!defined('ABSPATH')) {
 }
 
 // Set version here: changing it forces Javascript and CSS to reload.
-define('CIVICRM_PLUGIN_VERSION', '5.79.1');
+define('CIVICRM_PLUGIN_VERSION', '5.80.0');
 
 // Store reference to this file.
 if (!defined('CIVICRM_PLUGIN_FILE')) {
diff --git a/civicrm/CRM/Activity/BAO/Activity.php b/civicrm/CRM/Activity/BAO/Activity.php
index dca36f40213e8c762eb00d00bbbe067e07163493..436104a617ddec588cacc4afff80b1e2019b1b97 100644
--- a/civicrm/CRM/Activity/BAO/Activity.php
+++ b/civicrm/CRM/Activity/BAO/Activity.php
@@ -723,12 +723,6 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
           }
         }
       }
-      // if deleted, wrap in <del>
-      if (!empty($activity['source_contact_id']) &&
-        CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $activity['source_contact_id'], 'is_deleted')
-      ) {
-        $activities[$id]['source_contact_name'] = sprintf("<del>%s<del>", htmlentities($activity['source_contact_name']));
-      }
       $activities[$id]['is_recurring_activity'] = CRM_Core_BAO_RecurringEntity::getParentFor($id, 'civicrm_activity');
     }
 
diff --git a/civicrm/CRM/Admin/Page/Job.php b/civicrm/CRM/Admin/Page/Job.php
index a6595c617abfbe4941d35097d19d494b19c0bbb2..9af42aee4f9ab279d977ffd678f4c3413f7334dc 100644
--- a/civicrm/CRM/Admin/Page/Job.php
+++ b/civicrm/CRM/Admin/Page/Job.php
@@ -162,9 +162,8 @@ class CRM_Admin_Page_Job extends CRM_Core_Page_Basic {
       }
     }
 
-    $sj = new CRM_Core_JobManager();
     $rows = [];
-    foreach ($sj->jobs as $job) {
+    foreach ($this->getJobs() as $job) {
       $action = array_sum(array_keys($this->links()));
 
       // update enable/disable links.
@@ -193,6 +192,29 @@ class CRM_Admin_Page_Job extends CRM_Core_Page_Basic {
     $this->assign('rows', $rows);
   }
 
+  /**
+   * Retrieves the list of jobs from the database,
+   * populates class param.
+   *
+   * @fixme: Copied from JobManager. We should replace with API
+   *
+   * @return array
+   *   ($id => CRM_Core_ScheduledJob)
+   */
+  private function getJobs(): array {
+    $jobs = [];
+    $dao = new CRM_Core_DAO_Job();
+    $dao->orderBy('name');
+    $dao->domain_id = CRM_Core_Config::domainID();
+    $dao->find();
+    while ($dao->fetch()) {
+      $temp = ['class' => NULL, 'parameters' => NULL, 'last_run' => NULL];
+      CRM_Core_DAO::storeValues($dao, $temp);
+      $jobs[$dao->id] = new CRM_Core_ScheduledJob($temp);
+    }
+    return $jobs;
+  }
+
   /**
    * Get name of edit form.
    *
diff --git a/civicrm/CRM/Batch/Form/Entry.php b/civicrm/CRM/Batch/Form/Entry.php
index 3326f428c54390a9c6b6d0c51431ed2d9b3119b9..5e528f8bf80f44dcb9b25afffbbeaf87a6a1ea25 100644
--- a/civicrm/CRM/Batch/Form/Entry.php
+++ b/civicrm/CRM/Batch/Form/Entry.php
@@ -248,7 +248,7 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form {
 
     foreach ($this->_fields as $name => $field) {
       //fix to reduce size as we are using this field in grid
-      if (is_array($field['attributes']) && $this->_fields[$name]['attributes']['size'] > 19) {
+      if (is_array($field['attributes']) && ($this->_fields[$name]['attributes']['size'] ?? 0) > 19) {
         //shrink class to "form-text-medium"
         $this->_fields[$name]['attributes']['size'] = 19;
       }
diff --git a/civicrm/CRM/Campaign/Form/Campaign.php b/civicrm/CRM/Campaign/Form/Campaign.php
index 4a154492bc83b9eaa5afb4560190ee99b0db1633..562f1f563a4d853843a064d607b9498c3a6dd440 100644
--- a/civicrm/CRM/Campaign/Form/Campaign.php
+++ b/civicrm/CRM/Campaign/Form/Campaign.php
@@ -124,9 +124,10 @@ class CRM_Campaign_Form_Campaign extends CRM_Core_Form {
       'title' => ['name' => 'title'],
       'description' => ['name' => 'description'],
       'start_date' => ['name' => 'start_date', 'default' => date('Y-m-d H:i:s')],
-      'end_date' => ['name' => 'start_date'],
+      'end_date' => ['name' => 'end_date'],
       'campaign_type_id' => ['name' => 'campaign_type_id'],
       'status_id' => ['name' => 'status_id'],
+      'parent_id' => ['name' => 'parent_id'],
       'goal_general' => ['name' => 'goal_general'],
       'goal_revenue' => ['name' => 'goal_revenue'],
       'external_identifier' => ['name' => 'external_identifier'],
diff --git a/civicrm/CRM/Campaign/Page/Petition/Confirm.php b/civicrm/CRM/Campaign/Page/Petition/Confirm.php
index 77d7d1d9c2d84d656078061f0f6f20fb2c4f8848..9c7e2a21c87ba0f17c2797442040cce5ffb56a0e 100644
--- a/civicrm/CRM/Campaign/Page/Petition/Confirm.php
+++ b/civicrm/CRM/Campaign/Page/Petition/Confirm.php
@@ -21,7 +21,7 @@ class CRM_Campaign_Page_Petition_Confirm extends CRM_Core_Page {
    * @throws Exception
    */
   public function run() {
-    CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
+    CRM_Utils_System::setNoRobotsFlag();
 
     $contact_id = CRM_Utils_Request::retrieve('cid', 'Integer');
     $subscribe_id = CRM_Utils_Request::retrieve('sid', 'Integer');
diff --git a/civicrm/CRM/Contact/BAO/Contact/Utils.php b/civicrm/CRM/Contact/BAO/Contact/Utils.php
index d845a1924993295b4987180122dbbfd170565c16..45200ff0acd8ebfcfdee5c7e456b1e3baedd475c 100644
--- a/civicrm/CRM/Contact/BAO/Contact/Utils.php
+++ b/civicrm/CRM/Contact/BAO/Contact/Utils.php
@@ -88,7 +88,7 @@ class CRM_Contact_BAO_Contact_Utils {
         "reset=1&gid={$summaryOverlayProfileId}&id={$contactId}&snippet=4&is_show_email_task=1"
       );
 
-      $imageInfo['summary-link'] = '<a href="' . $contactURL . '" data-tooltip-url="' . $profileURL . '" class="crm-summary-link">' . $imageInfo['image'] . '</a>';
+      $imageInfo['summary-link'] = '<a href="' . $contactURL . '" data-tooltip-url="' . $profileURL . '" class="crm-summary-link" aria-labelledby="crm-contactname-content">' . $imageInfo['image'] . '</a>';
     }
     else {
       $imageInfo['summary-link'] = $imageInfo['image'];
diff --git a/civicrm/CRM/Contact/BAO/Query.php b/civicrm/CRM/Contact/BAO/Query.php
index c02a15b4f62c52c9406af2af155abec13343f4a9..25e968a1278c53415f46dd2ab3106e841e576855 100644
--- a/civicrm/CRM/Contact/BAO/Query.php
+++ b/civicrm/CRM/Contact/BAO/Query.php
@@ -2829,7 +2829,7 @@ class CRM_Contact_BAO_Query {
     [$_, $_, $value, $grouping, $_] = $values;
     if ($value) {
       // *prepend* to the relevant grouping as this is quite an important factor
-      array_unshift($this->_qill[$grouping], ts('Search in Trash'));
+      array_unshift($this->_qill[$grouping], ts('Search Deleted Contacts'));
     }
   }
 
diff --git a/civicrm/CRM/Contact/Form/Contact.php b/civicrm/CRM/Contact/Form/Contact.php
index 7aba82999d087106ed6435d874fd9ea54d44304a..f227ccd82f0baf66cc021bdbfbc6c7ac5fc9b182 100644
--- a/civicrm/CRM/Contact/Form/Contact.php
+++ b/civicrm/CRM/Contact/Form/Contact.php
@@ -1122,9 +1122,11 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
     // here we replace the user context with the url to view this contact
     $buttonName = $this->controller->getButtonName();
     if ($buttonName == $this->getButtonName('upload', 'new')) {
-      $contactSubTypes = array_filter(explode(CRM_Core_DAO::VALUE_SEPARATOR, $this->_contactSubType));
       $resetStr = "reset=1&ct={$contact->contact_type}";
-      $resetStr .= (count($contactSubTypes) == 1) ? "&cst=" . array_pop($contactSubTypes) : '';
+      if (is_string($this->_contactSubType)) {
+        $contactSubTypes = array_filter(explode(CRM_Core_DAO::VALUE_SEPARATOR, $this->_contactSubType));
+        $resetStr .= (count($contactSubTypes) == 1) ? "&cst=" . array_pop($contactSubTypes) : '';
+      }
       $session->replaceUserContext(CRM_Utils_System::url('civicrm/contact/add', $resetStr));
     }
     else {
diff --git a/civicrm/CRM/Contact/Form/Edit/Individual.php b/civicrm/CRM/Contact/Form/Edit/Individual.php
index 30bb35f67dea7d685250f5306d7fd245d33ee32c..b2fdd7827e40ebd641e9f54b06ae252d138d6785 100644
--- a/civicrm/CRM/Contact/Form/Edit/Individual.php
+++ b/civicrm/CRM/Contact/Form/Edit/Individual.php
@@ -97,7 +97,7 @@ class CRM_Contact_Form_Edit_Individual {
    *   The uploaded files if any.
    * @param int $contactID
    *
-   * @return bool
+   * @return bool|array
    *   TRUE if no errors, else array of errors.
    */
   public static function formRule($fields, $files, $contactID = NULL) {
@@ -105,8 +105,8 @@ class CRM_Contact_Form_Edit_Individual {
     $primaryID = CRM_Contact_Form_Contact::formRule($fields, $errors, $contactID, 'Individual');
 
     // make sure that firstName and lastName or a primary OpenID is set
-    if (!$primaryID && (empty($fields['first_name']) || empty($fields['last_name']))) {
-      $errors['_qf_default'] = ts('First Name and Last Name OR an email OR an OpenID in the Primary Location should be set.');
+    if (!$primaryID && (empty($fields['first_name']) && empty($fields['last_name']))) {
+      $errors['_qf_default'] = ts('Please enter a First Name, Last Name or Email (Primary).');
     }
 
     return empty($errors) ? TRUE : $errors;
diff --git a/civicrm/CRM/Contact/Form/Search.php b/civicrm/CRM/Contact/Form/Search.php
index 1bdfcbac9e001931db27f6199b673cff17270416..182d9bc1f8f7367f67a1f076299b3611774c1450 100644
--- a/civicrm/CRM/Contact/Form/Search.php
+++ b/civicrm/CRM/Contact/Form/Search.php
@@ -766,7 +766,7 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
 
     //get the button name
     $buttonName = $this->controller->getButtonName();
-    $this->_formValues['uf_group_id'] ??= $this->get('uf_group_id');
+    $this->_formValues['uf_group_id'] ??= $this->get('uf_group_id') ?: CRM_Core_Config::singleton()->defaultSearchProfileID;
 
     if (isset($this->_componentMode) && empty($this->_formValues['component_mode'])) {
       $this->_formValues['component_mode'] = $this->_componentMode;
diff --git a/civicrm/CRM/Contact/Form/Search/Criteria.php b/civicrm/CRM/Contact/Form/Search/Criteria.php
index 29cd537fb4ac99a38b05fab72f868b104da4917e..7711c727e8389d1bb6e8c4659db3c18b9643117f 100644
--- a/civicrm/CRM/Contact/Form/Search/Criteria.php
+++ b/civicrm/CRM/Contact/Form/Search/Criteria.php
@@ -105,7 +105,7 @@ class CRM_Contact_Form_Search_Criteria {
     $form->addElement('text', 'external_identifier', ts('External ID'), CRM_Core_DAO::getAttribute('CRM_Contact_DAO_Contact', 'external_identifier'));
 
     if (CRM_Core_Permission::check('access deleted contacts') and Civi::settings()->get('contact_undelete')) {
-      $form->add('checkbox', 'deleted_contacts', ts('Search in Trash') . '<br />' . ts('(deleted contacts)'));
+      $form->add('checkbox', 'deleted_contacts', ts('Search Deleted Contacts'));
     }
 
     // add checkbox for cms users only
diff --git a/civicrm/CRM/Contact/Form/Task/Map/Event.php b/civicrm/CRM/Contact/Form/Task/Map/Event.php
index b42e897d929628a93b958e5594857cf944ae679e..e5b05d05405298b5e4c716cd4a45694fbec89340 100644
--- a/civicrm/CRM/Contact/Form/Task/Map/Event.php
+++ b/civicrm/CRM/Contact/Form/Task/Map/Event.php
@@ -38,7 +38,7 @@ class CRM_Contact_Form_Task_Map_Event extends CRM_Contact_Form_Task_Map {
     $this->assign('skipLocationType', TRUE);
     $is_public = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $ids, 'is_public');
     if ($is_public == 0) {
-      CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
+      CRM_Utils_System::setNoRobotsFlag();
     }
   }
 
diff --git a/civicrm/CRM/Contact/Page/View/Log.php b/civicrm/CRM/Contact/Page/View/Log.php
index 2d141e891f87c981a9d0f7ece3b24ad1f165eb7a..633cef49350ea495b2061af03b6c658865e0ec02 100644
--- a/civicrm/CRM/Contact/Page/View/Log.php
+++ b/civicrm/CRM/Contact/Page/View/Log.php
@@ -39,6 +39,7 @@ class CRM_Contact_Page_View_Log extends CRM_Core_Page {
     }
 
     $log = new CRM_Core_DAO_Log();
+    $modifiers = [];
 
     $log->entity_table = 'civicrm_contact';
     $log->entity_id = $this->_contactId;
@@ -47,11 +48,15 @@ class CRM_Contact_Page_View_Log extends CRM_Core_Page {
 
     $logEntries = [];
     while ($log->fetch()) {
-      [$displayName, $contactImage] = CRM_Contact_BAO_Contact::getDisplayAndImage($log->modified_id);
+      if ($log->modified_id && !isset($modifiers[$log->modified_id])) {
+        $displayInfo = CRM_Contact_BAO_Contact::getDisplayAndImage($log->modified_id);
+        $modifiers[$log->modified_id] = ['name' => $displayInfo[0] ?? '', 'image' => $displayInfo[1] ?? ''];
+      }
+
       $logEntries[] = [
         'id' => $log->modified_id,
-        'name' => $displayName,
-        'image' => $contactImage,
+        'name' => $modifiers[$log->modified_id]['name'] ?? '',
+        'image' => $modifiers[$log->modified_id]['image'] ?? '',
         'date' => $log->modified_date,
       ];
     }
diff --git a/civicrm/CRM/Contact/Page/View/Tag.php b/civicrm/CRM/Contact/Page/View/Tag.php
index ec3c02297066eb57e11042913d645115f9c83f0f..745b2fb07a246a3c17d5a224040f47388dde1d90 100644
--- a/civicrm/CRM/Contact/Page/View/Tag.php
+++ b/civicrm/CRM/Contact/Page/View/Tag.php
@@ -16,6 +16,12 @@
  */
 class CRM_Contact_Page_View_Tag extends CRM_Core_Page {
 
+  /**
+   * @var int
+   * @internal
+   */
+  public $_contactId;
+
   /**
    * Called when action is browse.
    */
diff --git a/civicrm/CRM/Contact/Page/View/Vcard.php b/civicrm/CRM/Contact/Page/View/Vcard.php
index b9f42e6260ad468150d67cf352af0f08cd64f17d..85d0b0bcef59a2817dfe624d244fe137725cdfc0 100644
--- a/civicrm/CRM/Contact/Page/View/Vcard.php
+++ b/civicrm/CRM/Contact/Page/View/Vcard.php
@@ -36,7 +36,7 @@ class CRM_Contact_Page_View_Vcard extends CRM_Contact_Page_View {
     $ids = [];
 
     $params['id'] = $params['contact_id'] = $this->_contactId;
-    $contact = CRM_Contact_BAO_Contact::retrieve($params, $defaults, $ids);
+    CRM_Contact_BAO_Contact::retrieve($params, $defaults, $ids);
 
     // now that we have the contact's data - let's build the vCard
     // TODO: non-US-ASCII support (requires changes to the Contact_Vcard_Build class)
diff --git a/civicrm/CRM/Contribute/BAO/Contribution.php b/civicrm/CRM/Contribute/BAO/Contribution.php
index c20f01e182db1185741759dc6bfd73c866d57f2b..023efc0c50ded121c9ab5e43cf18915257473ff8 100644
--- a/civicrm/CRM/Contribute/BAO/Contribution.php
+++ b/civicrm/CRM/Contribute/BAO/Contribution.php
@@ -19,6 +19,7 @@ use Civi\Api4\LineItem;
 use Civi\Api4\ContributionSoft;
 use Civi\Api4\MembershipLog;
 use Civi\Api4\PaymentProcessor;
+use Civi\Api4\UFJoin;
 use Civi\Core\Event\PostEvent;
 
 /**
@@ -2404,16 +2405,6 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       ];
       $values['location'] = CRM_Core_BAO_Location::getValues($locationParams);
 
-      $ufJoinParams = [
-        'entity_table' => 'civicrm_event',
-        'entity_id' => $eventID,
-        'module' => 'CiviEvent',
-      ];
-
-      [$custom_pre_id, $custom_post_ids] = CRM_Core_BAO_UFJoin::getUFGroupIds($ufJoinParams);
-
-      $values['custom_pre_id'] = $custom_pre_id;
-      $values['custom_post_id'] = $custom_post_ids;
       //for tasks 'Change Participant Status' and 'Update multiple Contributions' case
       //and cases involving status updation through ipn
       // whatever that means!
@@ -2657,7 +2648,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       if (!empty($values['id'])) {
         $values['honor'] = [
           'honor_profile_values' => [],
-          'honor_profile_id' => CRM_Core_DAO::getFieldValue('CRM_Core_DAO_UFJoin', $values['id'], 'uf_group_id', 'entity_id'),
+          'honor_profile_id' => UFJoin::get(FALSE)->addWhere('entity_id', '=', $values['id'])->addWhere('entity_table', '=', 'civicrm_contribution_page')->addWhere('module', '=', 'soft_credit')->execute()->first()['uf_group_id'] ?? 0,
           'honor_id' => $softRecord['soft_credit'][1]['contact_id'],
         ];
 
diff --git a/civicrm/CRM/Contribute/BAO/Product.php b/civicrm/CRM/Contribute/BAO/Product.php
index 24ba30d8aa211b9c678c6b6b045a44a2e1d19ec2..b992ad1a2740a3b69f74c25f0e342a05c99799ca 100644
--- a/civicrm/CRM/Contribute/BAO/Product.php
+++ b/civicrm/CRM/Contribute/BAO/Product.php
@@ -14,13 +14,7 @@
  * @package CRM
  * @copyright CiviCRM LLC https://civicrm.org/licensing
  */
-class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product {
-
-  /**
-   * Static holder for the default LT.
-   * @var int
-   */
-  public static $_defaultContributionType = NULL;
+class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product implements Civi\Core\HookInterface {
 
   /**
    * @deprecated
@@ -36,72 +30,35 @@ class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product {
     return $premium;
   }
 
-  /**
-   * @deprecated - this bypasses hooks.
-   * @param int $id
-   * @param bool $is_active
-   * @return bool
-   */
-  public static function setIsActive($id, $is_active) {
-    CRM_Core_Error::deprecatedFunctionWarning('writeRecord');
-    if (!$is_active) {
-      $dao = new CRM_Contribute_DAO_PremiumsProduct();
-      $dao->product_id = $id;
-      $dao->delete();
-    }
-    return CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Product', $id, 'is_active', $is_active);
-  }
-
   /**
    * Add a premium product to the database, and return it.
    *
+   * @deprecated
    * @param array $params
    *   Update parameters.
    *
    * @return CRM_Contribute_DAO_Product
    */
   public static function create($params) {
-    $id = $params['id'] ?? NULL;
-    $op = !empty($id) ? 'edit' : 'create';
-    if (empty($id)) {
-      $defaultParams = [
-        'id' => $id,
-        'image' => '',
-        'thumbnail' => '',
-        'is_active' => 0,
-        'is_deductible' => FALSE,
-        'currency' => CRM_Core_Config::singleton()->defaultCurrency,
-      ];
-      $params = array_merge($defaultParams, $params);
-    }
-    CRM_Utils_Hook::pre($op, 'Product', $id, $params);
-    // Modify the submitted values for 'image' and 'thumbnail' so that we use
-    // local URLs for these images when possible.
-    if (isset($params['image'])) {
-      $params['image'] = CRM_Utils_String::simplifyURL($params['image'], TRUE);
-    }
-    if (isset($params['thumbnail'])) {
-      $params['thumbnail'] = CRM_Utils_String::simplifyURL($params['thumbnail'], TRUE);
-    }
-
-    // Save and return
-    $premium = new CRM_Contribute_DAO_Product();
-    $premium->copyValues($params);
-    $premium->save();
-    CRM_Utils_Hook::post($op, 'Product', $id, $premium);
-    return $premium;
+    CRM_Core_Error::deprecatedFunctionWarning('writeRecord');
+    return self::writeRecord($params);
   }
 
   /**
-   * Delete premium Types.
-   *
-   * @param int $productID
-   * @deprecated
-   * @throws \CRM_Core_Exception
+   * Event fired before modifying a Product.
+   * @param \Civi\Core\Event\PreEvent $event
    */
-  public static function del($productID) {
-    CRM_Core_Error::deprecatedFunctionWarning('deleteRecord');
-    static::deleteRecord(['id' => $productID]);
+  public static function self_hook_civicrm_pre(\Civi\Core\Event\PreEvent $event) {
+    if (in_array($event->action, ['create', 'edit'])) {
+      // Modify the submitted values for 'image' and 'thumbnail' so that we use
+      // local URLs for these images when possible.
+      if (isset($event->params['image'])) {
+        $event->params['image'] = CRM_Utils_String::simplifyURL($event->params['image'], TRUE);
+      }
+      if (isset($event->params['thumbnail'])) {
+        $event->params['thumbnail'] = CRM_Utils_String::simplifyURL($event->params['thumbnail'], TRUE);
+      }
+    }
   }
 
 }
diff --git a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
index e5695e1ffb8fcc0afded239befd35de047907c56..0f60c1613648e3e53b162a5f5b330b98621566db 100644
--- a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
+++ b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
@@ -798,10 +798,12 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $result = $this->processFormSubmission($contactID);
     }
     catch (CRM_Core_Exception $e) {
+      \Civi::log()->error('CRM_Contribute_Form_Contribution_Confirm::PostProcess processFormSubmissionException: ' . $e->getMessage());
       $this->bounceOnError($e->getMessage());
     }
 
     if (is_array($result) && !empty($result['is_payment_failure'])) {
+      \Civi::log()->error('CRM_Contribute_Form_Contribution_Confirm::PostProcess is_payment_failure: ' . $result['error']->getMessage());
       $this->bounceOnError($result['error']->getMessage());
     }
     // Presumably this is for hooks to access? Not quite clear & perhaps not required.
@@ -2398,45 +2400,6 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     }
   }
 
-  /**
-   * Complete transaction if payment has been processed.
-   *
-   * Check the result for a success outcome & if paid then complete the transaction.
-   *
-   * Completing will trigger update of related entities and emails.
-   *
-   * @deprecated
-   *
-   * @param array $result
-   * @param int $contributionID
-   *
-   * @throws \CRM_Core_Exception
-   * @throws \Exception
-   */
-  protected function completeTransaction($result, $contributionID) {
-    CRM_Core_Error::deprecatedWarning('Use API3 Payment.create');
-    if (($result['payment_status_id'] ?? NULL) == 1) {
-      try {
-        civicrm_api3('contribution', 'completetransaction', [
-          'id' => $contributionID,
-          'trxn_id' => $result['trxn_id'] ?? NULL,
-          'payment_processor_id' => $result['payment_processor_id'] ?? $this->_paymentProcessor['id'],
-          'is_transactional' => FALSE,
-          'fee_amount' => $result['fee_amount'] ?? NULL,
-          'receive_date' => $result['receive_date'] ?? NULL,
-          'card_type_id' => $result['card_type_id'] ?? NULL,
-          'pan_truncation' => $result['pan_truncation'] ?? NULL,
-        ]);
-      }
-      catch (CRM_Core_Exception $e) {
-        if ($e->getErrorCode() != 'contribution_completed') {
-          \Civi::log()->error('CRM_Contribute_Form_Contribution_Confirm::completeTransaction CRM_Core_Exception: ' . $e->getMessage());
-          throw new CRM_Core_Exception('Failed to update contribution in database');
-        }
-      }
-    }
-  }
-
   /**
    * Bounce the user back to retry when an error occurs.
    *
@@ -2444,8 +2407,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
    */
   protected function bounceOnError($message): void {
     CRM_Core_Session::singleton()
-      ->setStatus(ts('Payment Processor Error message :') .
-        $message);
+      ->setStatus(ts('Payment Processor Error message') . ': ' . $message);
     CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/transact',
       '_qf_Main_display=true&qfKey=' . ($this->_params['qfKey'] ?? NULL)
     ));
@@ -2598,43 +2560,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $form->_values['contribution_page_id'] = $contribution->contribution_page_id;
 
       if (!empty($form->_paymentProcessor)) {
-        try {
-          $payment = Civi\Payment\System::singleton()->getByProcessor($form->_paymentProcessor);
-          if ($contribution->contribution_recur_id && $this->getPaymentProcessorObject()->supports('noReturnForRecurring')) {
-            // We want to get rid of this & make it generic - eg. by making payment processing the last thing
-            // and always calling it first.
-            $form->postProcessHook();
-          }
-          $paymentParams['currency'] = $this->getCurrency();
-          $result = $payment->doPayment($paymentParams);
-          $form->_params = array_merge($form->_params, $result);
-          $form->assign('trxn_id', $result['trxn_id'] ?? '');
-          $contribution->trxn_id = $result['trxn_id'] ?? $contribution->trxn_id ?? '';
-          $contribution->payment_status_id = $result['payment_status_id'];
-          $result['contribution'] = $contribution;
-          if ($result['payment_status_id'] == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending')
-            && $payment->isSendReceiptForPending()) {
-            CRM_Contribute_BAO_ContributionPage::sendMail($contactID,
-              $form->_values,
-              $contribution->is_test
-            );
-          }
-          return $result;
-        }
-        catch (\Civi\Payment\Exception\PaymentProcessorException $e) {
-          // Clean up DB as appropriate.
-          if (!empty($paymentParams['contributionID'])) {
-            CRM_Contribute_BAO_Contribution::failPayment($paymentParams['contributionID'],
-              $paymentParams['contactID'], $e->getMessage());
-          }
-          if (!empty($paymentParams['contributionRecurID'])) {
-            CRM_Contribute_BAO_ContributionRecur::deleteRecurContribution($paymentParams['contributionRecurID']);
-          }
-
-          $result['is_payment_failure'] = TRUE;
-          $result['error'] = $e;
-          return $result;
-        }
+        return $this->processConfirmPayment($contribution, $contactID, $paymentParams);
       }
     }
 
@@ -2655,6 +2581,57 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     throw new CRM_Core_Exception('code is unreachable, exception is for clarity for refactoring');
   }
 
+  /**
+   * This was extracted from processConfirm() as part of a refactoring process.
+   * Signature/params subject to change!
+   * This should probably throw the exception instead of catching it and putting it in an array
+   * @internal
+   *
+   * @param \CRM_Contribute_DAO_Contribution $contribution
+   * @param int $contactID
+   * @param array $paymentParams
+   *
+   * @return array
+   * @throws \CRM_Core_Exception
+   */
+  private function processConfirmPayment(\CRM_Contribute_DAO_Contribution $contribution, int $contactID, array $paymentParams): array {
+    $form = $this;
+    try {
+      $payment = Civi\Payment\System::singleton()->getByProcessor($form->_paymentProcessor);
+      if ($contribution->contribution_recur_id && $this->getPaymentProcessorObject()->supports('noReturnForRecurring')) {
+        // We want to get rid of this & make it generic - eg. by making payment processing the last thing
+        // and always calling it first.
+        $form->postProcessHook();
+      }
+      $paymentParams['currency'] = $this->getCurrency();
+      $result = $payment->doPayment($paymentParams);
+      $form->_params = array_merge($form->_params, $result);
+      $form->assign('trxn_id', $result['trxn_id'] ?? '');
+      $contribution->trxn_id = $result['trxn_id'] ?? $contribution->trxn_id ?? '';
+      $contribution->payment_status_id = $result['payment_status_id'];
+      $result['contribution'] = $contribution;
+      if ($result['payment_status_id'] == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending')
+        && $payment->isSendReceiptForPending()) {
+        CRM_Contribute_BAO_ContributionPage::sendMail($contactID, $form->_values, $contribution->is_test);
+      }
+      return $result;
+    }
+    catch (\Civi\Payment\Exception\PaymentProcessorException $e) {
+      // Clean up DB as appropriate.
+      if (!empty($paymentParams['contributionID'])) {
+        CRM_Contribute_BAO_Contribution::failPayment($paymentParams['contributionID'],
+          $paymentParams['contactID'], $e->getMessage());
+      }
+      if (!empty($paymentParams['contributionRecurID'])) {
+        CRM_Contribute_BAO_ContributionRecur::deleteRecurContribution($paymentParams['contributionRecurID']);
+      }
+
+      $result['is_payment_failure'] = TRUE;
+      $result['error'] = $e;
+      return $result;
+    }
+  }
+
   /**
    * Temporary function to allow unit tests to access function being refactored away.
    *
diff --git a/civicrm/CRM/Contribute/Form/ManagePremiums.php b/civicrm/CRM/Contribute/Form/ManagePremiums.php
index 85e25503d0e04cd32af1f2ad3ead4a4dfafe69a4..4273b2e9f4ce1d919dc64de87cb299b687ab29f3 100644
--- a/civicrm/CRM/Contribute/Form/ManagePremiums.php
+++ b/civicrm/CRM/Contribute/Form/ManagePremiums.php
@@ -21,6 +21,7 @@ use Civi\Api4\Product;
  * This class generates form components for Premiums.
  */
 class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
+  use CRM_Custom_Form_CustomDataTrait;
 
   /**
    * Classes extending CRM_Core_Form should implement this method.
@@ -37,7 +38,7 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
   public function setDefaultValues() {
     $defaults = parent::setDefaultValues();
     if ($this->_id) {
-      $tempDefaults = Product::get()->addWhere('id', '=', $this->_id)->execute()->first();
+      $tempDefaults = Product::get()->addSelect('*', 'custom.*')->addWhere('id', '=', $this->_id)->execute()->first();
       if (isset($tempDefaults['image']) && isset($tempDefaults['thumbnail'])) {
         $defaults['imageUrl'] = $tempDefaults['image'];
         $defaults['thumbnailUrl'] = $tempDefaults['thumbnail'];
@@ -55,11 +56,40 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
       if (isset($tempDefaults['period_type'])) {
         $this->assign('showSubscriptions', TRUE);
       }
+
+      // Convert api3 field names to custom_xx format
+      foreach ($tempDefaults as $name => $value) {
+        $short = CRM_Core_BAO_CustomField::getShortNameFromLongName($name);
+        if ($short) {
+          $tempDefaults[$short . '_' . $this->_id] = $value;
+          unset($tempDefaults[$name]);
+        }
+      }
     }
 
     return $defaults;
   }
 
+  /**
+   * Build the form object.
+   *
+   * @throws \CRM_Core_Exception
+   */
+  public function preProcess() {
+    parent::preProcess();
+
+    // when custom data is included in this page
+    if ($this->isSubmitted()) {
+      // The custom data fields are added to the form by an ajax form.
+      // However, if they are not present in the element index they will
+      // not be available from `$this->getSubmittedValue()` in post process.
+      // We do not have to set defaults or otherwise render - just add to the element index.
+      $this->addCustomDataFieldsToForm('Product', array_filter([
+        'id' => $this->_id,
+      ]));
+    }
+  }
+
   /**
    * Build the form object.
    *
@@ -103,7 +133,7 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
     $this->addElement('text', 'imageUrl', ts('Image URL'));
     $this->addElement('text', 'thumbnailUrl', ts('Thumbnail URL'));
 
-    $this->add('file', 'uploadFile', ts('Image File Name'), ['onChange' => 'select_option();']);
+    $this->add('file', 'uploadFile', ts('Image File Name'), ['onChange' => 'CRM.$("input[name=imageOption][value=image]").prop("checked", true);']);
 
     $this->add('text', 'price', ts('Market Value'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'price'), TRUE);
     $this->addRule('price', ts('Please enter the Market Value for this product.'), 'money');
@@ -288,6 +318,8 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
 
     $this->_processImages($params);
 
+    $params += $this->getSubmittedCustomFieldsForApi4();
+
     // Save the premium product to database
     $premium = Product::save()->addRecord($params)->execute()->first();
 
diff --git a/civicrm/CRM/Core/BAO/Address.php b/civicrm/CRM/Core/BAO/Address.php
index 68142c44a57bd900fbb9e3b3d2b518ef4dc0bf58..634ac3199d2fbd6c4f2c55b8fe81578a56a909e1 100644
--- a/civicrm/CRM/Core/BAO/Address.php
+++ b/civicrm/CRM/Core/BAO/Address.php
@@ -994,7 +994,7 @@ SELECT is_primary,
     }
 
     while ($downstreamDao->fetch()) {
-      // call the function to update the relationship
+      $params['master_id'] = $addressId;
       if ($masterId) {
         // If we have a master_id AND we have downstream addresses, this is
         // untenable. Ensure we overwrite the downstream addresses so they have
@@ -1002,6 +1002,7 @@ SELECT is_primary,
         $params['master_id'] = $masterId;
       }
       elseif ($createRelationship) {
+        // call the function to update the relationship
         self::processSharedAddressRelationship($addressId, $downstreamDao->contact_id);
       }
 
diff --git a/civicrm/CRM/Core/BAO/ConfigSetting.php b/civicrm/CRM/Core/BAO/ConfigSetting.php
index dfe5b8fe73ac0eaa5e1568cb13cbac3f677339b7..b06b235dfa8409d00a39621df5f6327e605488f0 100644
--- a/civicrm/CRM/Core/BAO/ConfigSetting.php
+++ b/civicrm/CRM/Core/BAO/ConfigSetting.php
@@ -289,12 +289,15 @@ class CRM_Core_BAO_ConfigSetting {
       FALSE,
       FALSE
     );
-    if ($config->userSystem->is_drupal &&
-      $resetSessionTable
-    ) {
+
+    if ($resetSessionTable && $config->userSystem->is_drupal) {
       db_query("DELETE FROM {sessions} WHERE 1");
       $moveStatus .= ts('Drupal session table cleared.') . '<br />';
     }
+    elseif (!$resetSessionTable && CIVICRM_UF === 'Standalone') {
+      // dont reset CRM sessions on Standalone unless explicitly requested
+      // as otherwise it will log you out
+    }
     else {
       $session = CRM_Core_Session::singleton();
       $session->reset(2);
diff --git a/civicrm/CRM/Core/BAO/CustomField.php b/civicrm/CRM/Core/BAO/CustomField.php
index 3c237347f1e3c33ca8c5d5bfe85add238caabbd4..4a5fde416f6124c1d78edf9402c4e16f40f8f62c 100644
--- a/civicrm/CRM/Core/BAO/CustomField.php
+++ b/civicrm/CRM/Core/BAO/CustomField.php
@@ -614,6 +614,9 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
    */
   public static function getShortNameFromLongName(string $longName): ?string {
     [$groupName, $fieldName] = explode('.', $longName);
+    if (empty($groupName) || empty($fieldName)) {
+      return NULL;
+    }
     foreach (CRM_Core_BAO_CustomGroup::getAll() as $customGroup) {
       if ($customGroup['name'] === $groupName) {
         foreach ($customGroup['fields'] as $id => $field) {
diff --git a/civicrm/CRM/Core/Config.php b/civicrm/CRM/Core/Config.php
index a8102b93af846e4f4e17149051463b5dc6ad0c1b..d97d65678407225f47b4a99abfebfd7a5f94205d 100644
--- a/civicrm/CRM/Core/Config.php
+++ b/civicrm/CRM/Core/Config.php
@@ -103,9 +103,6 @@ class CRM_Core_Config extends CRM_Core_Config_MagicMerge {
         ]);
         self::$_singleton->authenticate();
 
-        // Extreme backward compat: $config binds to active domain at moment of setup.
-        self::$_singleton->getSettings();
-
         self::$_singleton->handleFirstRun();
       }
     }
diff --git a/civicrm/CRM/Core/Error.php b/civicrm/CRM/Core/Error.php
index cb51fd3615128036b3cf86f7489a947a5b138db5..cafc523320f438a43a72a577035785762fe52309 100644
--- a/civicrm/CRM/Core/Error.php
+++ b/civicrm/CRM/Core/Error.php
@@ -123,7 +123,7 @@ class CRM_Core_Error extends PEAR_ErrorStack {
   public static function displaySessionError(&$error, $separator = '<br />') {
     $message = self::getMessages($error, $separator);
     if ($message) {
-      $status = ts("Payment Processor Error message") . "{$separator} $message";
+      $status = ts('Payment Processor Error message') . "{$separator} $message";
       $session = CRM_Core_Session::singleton();
       $session->setStatus($status);
     }
diff --git a/civicrm/CRM/Core/Form/Search.php b/civicrm/CRM/Core/Form/Search.php
index 09d9d68280ed0a72f1188987076e9bcec8f028fa..1327758025f377c1beb2d64394c90e966f13fd86 100644
--- a/civicrm/CRM/Core/Form/Search.php
+++ b/civicrm/CRM/Core/Form/Search.php
@@ -465,7 +465,7 @@ class CRM_Core_Form_Search extends CRM_Core_Form {
     $this->searchFieldMetadata['Contact']['contact_type'] = CRM_Contact_DAO_Contact::fields()['contact_type'];
 
     if (CRM_Core_Permission::check('access deleted contacts') && Civi::settings()->get('contact_undelete')) {
-      $this->addElement('checkbox', 'deleted_contacts', ts('Search in Trash') . '<br />' . ts('(deleted contacts)'));
+      $this->addElement('checkbox', 'deleted_contacts', ts('Search Deleted Contacts'));
       $this->searchFieldMetadata['Contact']['deleted_contacts'] = ['name' => 'deleted_contacts', 'type' => CRM_Utils_Type::T_INT, 'is_pseudofield' => TRUE, 'html' => ['type' => 'Checkbox']];
     }
 
diff --git a/civicrm/CRM/Core/JobManager.php b/civicrm/CRM/Core/JobManager.php
index af96550a589bb715ef82524b01383bd61b8f5af7..3d5ff0d8293987613faad876340794850434888a 100644
--- a/civicrm/CRM/Core/JobManager.php
+++ b/civicrm/CRM/Core/JobManager.php
@@ -9,6 +9,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\Job;
+
 /**
  * This interface defines methods that need to be implemented
  * by every scheduled job (cron task) in CiviCRM.
@@ -24,6 +26,7 @@ class CRM_Core_JobManager {
    * Format is ($id => CRM_Core_ScheduledJob).
    *
    * @var CRM_Core_ScheduledJob[]
+   * @deprecated
    */
   public $jobs = NULL;
 
@@ -46,13 +49,6 @@ class CRM_Core_JobManager {
    */
   public $_source = NULL;
 
-  /**
-   * Class constructor.
-   */
-  public function __construct() {
-    $this->jobs = $this->getJobs();
-  }
-
   /**
    * @param bool $auth
    */
@@ -67,13 +63,41 @@ class CRM_Core_JobManager {
 
     // it's not asynchronous at this stage
     CRM_Utils_Hook::cron($this);
-    foreach ($this->jobs as $job) {
-      if ($job->is_active) {
-        if ($job->needsRunning()) {
-          $this->executeJob($job);
-        }
+
+    // Get a list of the jobs that have completed previously
+    $successfulJobs = Job::get(FALSE)
+      ->addWhere('is_active', '=', TRUE)
+      ->addClause('OR', ['last_run', 'IS NULL'], ['last_run', '<=', 'last_run_end', TRUE])
+      ->addOrderBy('name', 'ASC')
+      ->execute()
+      ->indexBy('id')
+      ->getArrayCopy();
+
+    // Get a list of jobs that have not completed previously.
+    // This could be because they are a new job that has not yet run or a job that is fatally crashing (eg. OOM).
+    // If last_run is NULL the job has never run and will be selected above so exclude it here
+    // If last_run_end is NULL the job has never completed successfully.
+    // If last_run_end is < last_run job has completed successfully in the past but is now failing to complete.
+    $maybeUnsuccessfulJobs = Job::get(FALSE)
+      ->addWhere('is_active', '=', TRUE)
+      ->addWhere('last_run', 'IS NOT NULL')
+      ->addClause('OR', ['last_run_end', 'IS NULL'], ['last_run', '>', 'last_run_end', TRUE])
+      ->addOrderBy('name', 'ASC')
+      ->execute()
+      ->indexBy('id')
+      ->getArrayCopy();
+
+    $jobs = array_merge($successfulJobs, $maybeUnsuccessfulJobs);
+    foreach ($jobs as $job) {
+      $temp = ['class' => NULL, 'parameters' => NULL, 'last_run' => NULL];
+      $scheduledJobParams = array_merge($job, $temp);
+      $jobDAO = new CRM_Core_ScheduledJob($scheduledJobParams);
+
+      if ($jobDAO->needsRunning()) {
+        $this->executeJob($jobDAO);
       }
     }
+
     $this->logEntry('Finishing scheduled jobs execution.');
 
     // Set last cron date for the status check
@@ -146,27 +170,6 @@ class CRM_Core_JobManager {
     $job->saveLastRunEnd();
   }
 
-  /**
-   * Retrieves the list of jobs from the database,
-   * populates class param.
-   *
-   * @return array
-   *   ($id => CRM_Core_ScheduledJob)
-   */
-  private function getJobs(): array {
-    $jobs = [];
-    $dao = new CRM_Core_DAO_Job();
-    $dao->orderBy('name');
-    $dao->domain_id = CRM_Core_Config::domainID();
-    $dao->find();
-    while ($dao->fetch()) {
-      $temp = ['class' => NULL, 'parameters' => NULL, 'last_run' => NULL];
-      CRM_Core_DAO::storeValues($dao, $temp);
-      $jobs[$dao->id] = new CRM_Core_ScheduledJob($temp);
-    }
-    return $jobs;
-  }
-
   /**
    * Retrieves specific job from the database by id.
    * and creates ScheduledJob object.
diff --git a/civicrm/CRM/Core/Permission/Standalone.php b/civicrm/CRM/Core/Permission/Standalone.php
index abcf952c46a52c6b90a2d05ac828e01d14c3e1f9..86c3d1b98004e856bc5d62a9cec5569f18ad6bcc 100644
--- a/civicrm/CRM/Core/Permission/Standalone.php
+++ b/civicrm/CRM/Core/Permission/Standalone.php
@@ -52,15 +52,15 @@ class CRM_Core_Permission_Standalone extends CRM_Core_Permission_Base {
    * composite permissions (ORs etc), implied permission hierarchies,
    * and Contacts.
    *
-   * @param string $str
+   * @param string $permissionName
    *   The permission to check.
    * @param int $userId
    *
    * @return bool
    *   true if yes, else false
    */
-  public function check($str, $userId = NULL) {
-    return \Civi\Standalone\Security::singleton()->checkPermission($str, $userId);
+  public function check($permissionName, $userId = NULL) {
+    return \Civi\Standalone\Security::singleton()->checkPermission($permissionName, $userId);
   }
 
   /**
diff --git a/civicrm/CRM/Core/Resources.php b/civicrm/CRM/Core/Resources.php
index b5e438b0652fb0c89f1e1e49d0e84487e6acd88f..913d694da162821aa7302ba1044726bd99e585de 100644
--- a/civicrm/CRM/Core/Resources.php
+++ b/civicrm/CRM/Core/Resources.php
@@ -290,8 +290,8 @@ class CRM_Core_Resources implements CRM_Core_Resources_CollectionAdderInterface
     // TODO consider caching results
     $base = $this->paths->hasVariable($ext)
       ? $this->paths->getVariable($ext, 'url')
-      : ($this->extMapper->keyToUrl($ext) . '/');
-    return $base . $file;
+      : $this->extMapper->keyToUrl($ext);
+    return rtrim($base, '/') . "/$file";
   }
 
   /**
diff --git a/civicrm/CRM/Core/WorkflowMessage/ProfileTrait.php b/civicrm/CRM/Core/WorkflowMessage/ProfileTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a7367ba1e3e338b4749ecd3ebcd8524cbfa76cc
--- /dev/null
+++ b/civicrm/CRM/Core/WorkflowMessage/ProfileTrait.php
@@ -0,0 +1,214 @@
+<?php
+
+use Civi\Api4\UFGroup;
+use Civi\Api4\UFJoin;
+
+/**
+ * Trait for participant workflow classes.
+ *
+ * @method string getNote()
+ */
+trait CRM_Core_WorkflowMessage_ProfileTrait {
+
+  /**
+   * The profiles array is not currently assigned / used but might
+   * be saner than the ones that are.
+   *
+   * @var array
+   */
+  protected $profiles;
+
+  /**
+   * The note, if any, from the session.
+   *
+   * As multiple notes can be attached to a participant records we only want
+   * to render a note as part of the profile if the user entered it in the form submission.
+   *
+   * @var string
+   */
+  protected string $note = '';
+
+  /**
+   * @var array
+   *
+   * @scope tplParams as customPre
+   */
+  public $profilesPreForm;
+
+  /**
+   * @var array
+   *
+   * @scope tplParams as customPost
+   */
+  public $profilesPostForm;
+
+  /**
+   * @var array
+   *
+   * @scope tplParams as customPre_grouptitle
+   */
+  public $profileTitlesPreForm;
+
+  /**
+   * @var array
+   *
+   * @scope tplParams as customPost_grouptitle
+   */
+  public $profileTitlesPostForm;
+
+  /**
+   * @var array
+   *
+   * @scope tplParams as customProfile
+   */
+  public $profilesAdditionalParticipants;
+
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function getProfiles(): array {
+    if (!isset($this->profiles)) {
+      if ($this->getEventID()) {
+        $joins = (array) UFJoin::get(FALSE)
+          ->addWhere('entity_table', '=', 'civicrm_event')
+          ->addWhere('entity_id', '=', $this->getEventID())
+          ->addWhere('is_active', '=', TRUE)
+          ->addSelect('module', 'weight', 'uf_group_id')
+          ->addOrderBy('weight')
+          ->execute();
+        $profiles = UFGroup::get(FALSE)
+          ->addWhere('id', 'IN', CRM_Utils_Array::collect('uf_group_id', $joins))
+          ->execute()->indexBy('id');
+        foreach ($joins as $join) {
+          // The thing we want to order by is on the join not the profile
+          // hence we iterate the joins.
+          $profile = $profiles[$join['uf_group_id']];
+          $profile['placement'] = $join['weight'] === 1 ? 'pre' : 'post';
+          $profile['is_additional_participant'] = $join['module'] === 'CiviEvent_Additional';
+          if ($join['module'] === 'CiviEvent') {
+            $profile['participant_id'] = $this->getParticipantID();
+            try {
+              $fields = CRM_Event_BAO_Event::getProfileDisplay([$profile['id']],
+                $this->getParticipant()['contact_id'] ?? 0,
+                $this->getParticipantID(),
+                $this->getNote(),
+              );
+            }
+            catch (CRM_Core_Exception $e) {
+              // This could be false if the person does not have permission. This came up in
+              // the SelfSvcTransfer workflow via test testTransferAnonymous & it seems OK
+              // to not include profile data in this scenario ... probably.
+              $fields = [];
+            }
+            $profile['fields'] = $fields ? $fields[0] : [];
+          }
+          elseif ($profile['is_additional_participant']) {
+            foreach ($this->getParticipants() as $participant) {
+              // Only show the other participants for the primary participant.
+              if ($this->getIsPrimary() && !$participant['is_primary']) {
+                if (!isset($profile['fields'])) {
+                  $profile['fields'] = [];
+                }
+                try {
+                  $fields = CRM_Event_BAO_Event::getProfileDisplay([$profile['id']],
+                    $participant['contact']['id'],
+                    $participant['id'],
+                    $this->getNote()
+                  );
+                }
+                catch (CRM_Core_Exception $e) {
+                  // This could be false if the person does not have permission. This came up in
+                  // the SelfSvcTransfer workflow via test testTransferAnonymous & it seems OK
+                  // to not include profile data in this scenario ... probably.
+                  $fields = [];
+                }
+                $profile['fields'][] = $fields ? $fields[0] : [];
+
+              }
+            }
+          }
+
+          $this->profiles[] = $profile;
+        }
+      }
+    }
+    return $this->profiles;
+  }
+
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function getProfilesPreForm(): array {
+    $profiles = [];
+    foreach ($this->getProfilesByPlacement('pre') as $profile) {
+      $profiles[] = $profile['fields'];
+    }
+    return $profiles;
+  }
+
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function getProfileTitlesPreForm(): array {
+    $titles = [];
+    foreach ($this->getProfilesByPlacement('pre') as $profile) {
+      $titles[] = $profile['frontend_title'];
+    }
+    return $titles;
+  }
+
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function getProfileTitlesPostForm(): array {
+    $titles = [];
+    foreach ($this->getProfilesByPlacement('post') as $profile) {
+      $titles[] = $profile['frontend_title'];
+    }
+    return $titles;
+  }
+
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function getProfilesPostForm(): array {
+    $profiles = [];
+    foreach ($this->getProfilesByPlacement('post') as $profile) {
+      $profiles[] = $profile['fields'];
+    }
+    return $profiles;
+  }
+
+  public function getProfilesAdditionalParticipants(): array {
+    $profiles = [];
+    foreach ($this->getProfiles() as $profile) {
+      if ($profile['is_additional_participant'] && !empty($profile['fields'])) {
+        foreach ($profile['fields'] as $participantIndex => $fields) {
+          $profiles['profile'][$participantIndex][$profile['id']] = $profile['fields'][$participantIndex];
+        }
+        $profiles['title'][$profile['id']] = $profile['title'];
+      }
+    }
+    return $profiles;
+  }
+
+  /**
+   * @param string $placement
+   *   pre or post.
+   *
+   * @return array
+   * @throws \CRM_Core_Exception
+   */
+  private function getProfilesByPlacement(string $placement): array {
+    $profiles = [];
+    foreach ($this->getProfiles() as $profile) {
+      if (!empty($profile['participant_id']) && $profile['participant_id'] === $this->getParticipantID()) {
+        if ($profile['placement'] === $placement) {
+          $profiles[] = $profile;
+        }
+      }
+    }
+    return $profiles;
+  }
+
+}
diff --git a/civicrm/CRM/Custom/Form/CustomDataTrait.php b/civicrm/CRM/Custom/Form/CustomDataTrait.php
index 2d8838aeed28c5140e831030fbed02f653cd6a80..1ba74802b483a49fc6e067478ee9c5b0171c787c 100644
--- a/civicrm/CRM/Custom/Form/CustomDataTrait.php
+++ b/civicrm/CRM/Custom/Form/CustomDataTrait.php
@@ -168,8 +168,8 @@ trait CRM_Custom_Form_CustomDataTrait {
   /**
    * Get the submitted custom fields.
    *
-   * This is returned apiv3 style but in future could take
-   * api version as a parameter.
+   * This is returned apiv3 style.
+   * @see getSubmittedCustomFieldsForApi4()
    *
    * @return array
    */
@@ -183,4 +183,21 @@ trait CRM_Custom_Form_CustomDataTrait {
     return $fields;
   }
 
+  /**
+   * Get the submitted custom fields in Api4 format.
+   *
+   * @return array
+   */
+  protected function getSubmittedCustomFieldsForApi4(): array {
+    $fields = [];
+    foreach ($this->getSubmittedValues() as $label => $field) {
+      if (preg_match('/^custom_(\d+)_?(-?\d+)?$/', $label)) {
+        if ($new = CRM_Core_BAO_CustomField::getLongNameFromShortName($label)) {
+          $fields[$new] = $field;
+        }
+      }
+    }
+    return $fields;
+  }
+
 }
diff --git a/civicrm/CRM/Dedupe/Merger.php b/civicrm/CRM/Dedupe/Merger.php
index ae34a267293c368cb7daaa973c121c6baf2d3bcd..a02de39002bd1503bdc1d424fc00cff1868bcdec 100644
--- a/civicrm/CRM/Dedupe/Merger.php
+++ b/civicrm/CRM/Dedupe/Merger.php
@@ -885,18 +885,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
         }
       }
       else {
-        if (substr($key, 0, 4) === 'url-') {
-          CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal');
-          $websiteField = explode('-', $key);
-          $data['website'][$websiteField[1]]['website_type_id'] = $websiteField[1];
-          $data['website'][$websiteField[1]]['url'] = $value;
-        }
-        elseif (in_array($key, CRM_Contact_BAO_Contact::$_greetingTypes, TRUE)) {
-          CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal');
-          //save email/postal greeting and addressee values if any, CRM-4575
-          $data[$key . '_id'] = $value;
-        }
-        elseif (($customFieldId = CRM_Core_BAO_CustomField::getKeyID($key))) {
+        if (($customFieldId = CRM_Core_BAO_CustomField::getKeyID($key))) {
           // for autocomplete transfer hidden value instead of label
           if ($params[$key] && isset($params[$key . '_id'])) {
             $value = $params[$key . '_id'];
@@ -915,21 +904,6 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
           }
 
           $valueId = NULL;
-          if (!empty($params['customRecordValues'])) {
-            CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal');
-            if (is_array($params['customRecordValues']) && !empty($params['customRecordValues'])) {
-              foreach ($params['customRecordValues'] as $recId => $customFields) {
-                if (is_array($customFields) && !empty($customFields)) {
-                  foreach ($customFields as $customFieldName) {
-                    if ($customFieldName == $key) {
-                      $valueId = $recId;
-                      break;
-                    }
-                  }
-                }
-              }
-            }
-          }
 
           //CRM-13596 - check for contact_sub_type_hidden first
           $type = $data['contact_type'];
@@ -949,21 +923,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
             $includeViewOnly,
           );
         }
-        elseif ($key === 'edit') {
-          CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal');
-          continue;
-        }
         else {
-          if ($key === 'location') {
-            CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal');
-            foreach ($value as $locationTypeId => $field) {
-              foreach ($field as $block => $val) {
-                if ($block === 'address' && array_key_exists('address_name', $val)) {
-                  $value[$locationTypeId][$block]['name'] = $value[$locationTypeId][$block]['address_name'];
-                }
-              }
-            }
-          }
           $data[$key] = $value;
         }
       }
diff --git a/civicrm/CRM/Event/BAO/Event.php b/civicrm/CRM/Event/BAO/Event.php
index 64adbb03f7078f088edf382547bc7ea5b440e6cb..828ec08e03851027e489b325c51e00ecfe41e08e 100644
--- a/civicrm/CRM/Event/BAO/Event.php
+++ b/civicrm/CRM/Event/BAO/Event.php
@@ -1074,7 +1074,7 @@ WHERE civicrm_event.is_active = 1
     ];
 
     //get the params submitted by participant.
-    $participantParams = CRM_Utils_Array::value($participantId, $values['params'], []);
+    $participantParams = $values['params'][$participantId] ?? [];
 
     if (!$returnMessageText) {
       //send notification email if field values are set (CRM-1941)
@@ -1115,55 +1115,10 @@ WHERE civicrm_event.is_active = 1
       $notifyEmail = CRM_Utils_Array::valueByRegexKey('/^email-/', $participantParams) ?? $email;
       //send email only when email is present
       if (isset($notifyEmail) || $returnMessageText) {
-        $preProfileID = $values['custom_pre_id'] ?? NULL;
-        $postProfileID = $values['custom_post_id'] ?? NULL;
-
-        if (!empty($values['params']['additionalParticipant'])) {
-          $preProfileID = CRM_Utils_Array::value('additional_custom_pre_id', $values, $preProfileID);
-          $postProfileID = CRM_Utils_Array::value('additional_custom_post_id', $values, $postProfileID);
-        }
-
-        $profilePre = self::buildCustomDisplay($preProfileID,
-          'customPre',
-          $contactID,
-          $template,
-          $participantId,
-          $isTest,
-          TRUE,
-          $participantParams
-        );
-
-        $profilePost = self::buildCustomDisplay($postProfileID,
-          'customPost',
-          $contactID,
-          $template,
-          $participantId,
-          $isTest,
-          TRUE,
-          $participantParams
-        );
-
-        // @todo - the goal is that all params available to the message template are explicitly defined here rather than
-        // 'in a smattering of places'. Note that leakage can happen between mailings when not explicitly defined.
-        if ($postProfileID) {
-          $customPostTitles = empty($profilePost[1]) ? NULL : [];
-          foreach ($postProfileID as $offset => $id) {
-            $customPostTitles[$offset] = CRM_Core_BAO_UFGroup::getFrontEndTitle((int) $id);
-          }
-        }
-        else {
-          $customPostTitles = NULL;
-        }
         $tplParams = array_merge($values, $participantParams, [
           'email' => $notifyEmail,
           'confirm_email_text' => $values['event']['confirm_email_text'] ?? NULL,
           'isShowLocation' => $values['event']['is_show_location'] ?? NULL,
-          'customPre' => $profilePre[0],
-          'customPre_grouptitle' => empty($profilePre[1]) ? NULL : [CRM_Core_BAO_UFGroup::getFrontEndTitle((int) $preProfileID)],
-          'customPost' => $profilePost[0],
-          'customPost_grouptitle' => $customPostTitles,
-          'participantID' => $participantId,
-          'contactID' => $contactID,
           'credit_card_number' => CRM_Utils_System::mungeCreditCard(CRM_Utils_Array::value('credit_card_number', $participantParams)),
           'credit_card_exp_date' => CRM_Utils_Date::mysqlToIso(CRM_Utils_Date::format(CRM_Utils_Array::value('credit_card_exp_date', $participantParams))),
           'selfcancelxfer_time' => abs($values['event']['selfcancelxfer_time']),
@@ -1174,10 +1129,12 @@ WHERE civicrm_event.is_active = 1
         // CRM-13890 : NOTE wait list condition need to be given so that
         // wait list message is shown properly in email i.e. WRT online event registration template
         if (empty($tplParams['participant_status']) && empty($values['params']['isOnWaitlist'])) {
+          // @todo - this is no longer used in the core template - deprecate & remove
           $statusId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant', $participantId, 'status_id', 'id', TRUE);
           $tplParams['participant_status'] = CRM_Event_PseudoConstant::participantStatus($statusId, NULL, 'label');
         }
         //CRM-15754 - if participant_status contains status ID
+        // @todo - this is no longer used in the core template - deprecate & remove
         elseif (!empty($tplParams['participant_status']) && CRM_Utils_Rule::integer($tplParams['participant_status'])) {
           $tplParams['participant_status'] = CRM_Event_PseudoConstant::participantStatus($tplParams['participant_status'], NULL, 'label');
         }
@@ -1191,6 +1148,7 @@ WHERE civicrm_event.is_active = 1
             'participantID' => (int) $participantId,
             'eventID' => (int) $values['event']['id'],
             'contactID' => (int) $contactID,
+            'note' => $participantParams['note'] ?? '',
           ],
         ];
 
@@ -1293,7 +1251,7 @@ WHERE civicrm_event.is_active = 1
 
     $groups = $participantParams['group'] ?? NULL;
     $note = $participantParams['note'] ?? NULL;
-    $displayValues = self::getProfileDisplay($profileIds, $cid, $participantId, $isTest, $groups, $note);
+    $displayValues = self::getProfileDisplay($profileIds, $cid, $participantId, $note, $groups, $isTest);
 
     $groupTitles = UFGroup::get(FALSE)
       ->addWhere('id', 'IN', $profileIds)
@@ -2312,7 +2270,7 @@ WHERE  ce.loc_block_id = $locBlockId";
    * @throws \CRM_Core_Exception
    * @throws \Civi\Core\Exception\DBQueryException
    */
-  public static function getProfileDisplay(array $profileIds, int $cid, int $participantId, bool $isTest = FALSE, ?array $groups = NULL, ?string $note = NULL): ?array {
+  public static function getProfileDisplay(array $profileIds, int $cid, int $participantId, ?string $note = NULL, ?array $groups = NULL, bool $isTest = FALSE): ?array {
     foreach ($profileIds as $gid) {
       if (CRM_Core_BAO_UFGroup::filterUFGroups($gid, $cid)) {
         $values = [];
@@ -2391,8 +2349,8 @@ WHERE  ce.loc_block_id = $locBlockId";
         //dev/event#10
         //If the event profile includes a note field and the submitted value of
         //that field is "", then remove the old note returned by getValues.
-        if ($note === '') {
-          $noteKeyPos = array_search('note', array_keys($fields));
+        if ($note === '' && array_key_exists('note', $fields)) {
+          $noteKeyPos = array_search('note', array_keys($fields), TRUE);
           $valuesKeys = array_keys($values);
           $values[$valuesKeys[$noteKeyPos]] = "";
         }
diff --git a/civicrm/CRM/Event/Form/Registration.php b/civicrm/CRM/Event/Form/Registration.php
index df1f969fca47c04db98da1aa55d10abd8e2f58f2..66f055b6eaeb2f39100179c4a0788553ee33543a 100644
--- a/civicrm/CRM/Event/Form/Registration.php
+++ b/civicrm/CRM/Event/Form/Registration.php
@@ -485,6 +485,12 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       $this->_isBillingAddressRequiredForPayLater = $this->_values['event']['is_billing_required'] ?? NULL;
       $this->assign('isBillingAddressRequiredForPayLater', $this->_isBillingAddressRequiredForPayLater);
     }
+
+    // set the noindex metatag for non-public events
+    if (!$this->getEventValue('is_public')) {
+      CRM_Utils_System::setNoRobotsFlag();
+    }
+
   }
 
   /**
diff --git a/civicrm/CRM/Event/Page/EventInfo.php b/civicrm/CRM/Event/Page/EventInfo.php
index ec2c2a2649ec4f718ce2471621880287b7589767..afbe657605a433c574fe43bda4927fc1d7a69ea1 100644
--- a/civicrm/CRM/Event/Page/EventInfo.php
+++ b/civicrm/CRM/Event/Page/EventInfo.php
@@ -60,7 +60,7 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
     }
 
     if (!$values['event']['is_public']) {
-      CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
+      CRM_Utils_System::setNoRobotsFlag();
     }
 
     if (!empty($values['event']['is_template'])) {
diff --git a/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php b/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php
index 1fbec19de263b3561980458e55c895c18c782f69..278fdb4cd74ea0a9d884ef3f4ab3805f41a1c220 100644
--- a/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php
+++ b/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php
@@ -80,7 +80,7 @@ class CRM_Event_WorkflowMessage_EventOfflineReceipt extends GenericWorkflowMessa
    * @throws \CRM_Core_Exception
    */
   protected function getFieldsToLoadForParticipant(): array {
-    $fields = ['registered_by_id', 'role_id', 'event_id', 'event_id.event_type_id'];
+    $fields = ['registered_by_id', 'role_id', 'event_id', 'event_id.event_type_id', 'contact_id'];
     // Request the relevant custom fields. This list is
     // restricted by view-ability but we don't have the information
     // at this point to filter by the finer tuned entity extends information
diff --git a/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php b/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php
index be46e2c807621cc5c33951b4a47a32bc41841dd6..75b01dd41ef9aeccb4aadedc4f527086c3b6d98a 100644
--- a/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php
+++ b/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php
@@ -12,6 +12,8 @@ use Civi\Api4\Participant;
 trait CRM_Event_WorkflowMessage_ParticipantTrait {
 
   use CRM_Contribute_WorkflowMessage_ContributionTrait;
+  use CRM_Core_WorkflowMessage_ProfileTrait;
+
   /**
    * @var int
    *
@@ -247,7 +249,7 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait {
    * Get the participant fields we need to load.
    */
   protected function getFieldsToLoadForParticipant(): array {
-    return ['registered_by_id'];
+    return ['registered_by_id', 'contact_id'];
   }
 
   /**
@@ -278,15 +280,12 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait {
    */
   public function getParticipants(): array {
     if (!$this->participants) {
-      if (!$this->getLineItems()) {
-        return [];
-      }
       // Initiate with the current participant to ensure they are first.
       $participants = [$this->participantID => ['id' => $this->participantID, 'tax_rate_breakdown' => []]];
-      if ($this->isCiviContributeEnabled()) {
+      if ($this->getLineItems() && $this->isCiviContributeEnabled()) {
         foreach ($this->getLineItems() as $lineItem) {
           if ($lineItem['entity_table'] === 'civicrm_participant') {
-            $participantID = $lineItem['entity_id'];
+            $participantID = (int) $lineItem['entity_id'];
           }
           else {
             // It is not clear if this could ever be true - testing the CiviCRM event
@@ -314,10 +313,16 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait {
           $participants[$participantID]['tax_rate_breakdown'][$lineItem['tax_rate']]['amount'] += $lineItem['tax_amount'];
         }
       }
-
+      elseif ($this->getIsPrimary()) {
+        $participants += (array) Participant::get(FALSE)
+          ->setSelect(['id'])
+          ->addWhere('registered_by_id', '=', $this->getPrimaryParticipantID())
+          ->execute()->indexBy('id');
+      }
       $count = 1;
       foreach ($participants as $participantID => &$participant) {
         $participant['id'] = $participantID;
+        $participant['is_primary'] = $this->getParticipantID() === $participantID;
         $participant['index'] = $count;
         $participant['contact'] = $this->getParticipantContact($participantID);
         foreach ($participant['tax_rate_breakdown'] ?? [] as $rate => $details) {
@@ -325,10 +330,13 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait {
             unset($participant['tax_rate_breakdown'][$rate]);
           }
         }
-        if (array_keys($participant['tax_rate_breakdown']) === [0]) {
+        if (array_keys($participant['tax_rate_breakdown'] ?? []) === [0]) {
           // If the only tax rate charged is 0% then no tax breakdown is returned.
           $participant['tax_rate_breakdown'] = [];
         }
+        if (!isset($participant['line_items'])) {
+          $participant['line_items'] = [];
+        }
         $count++;
       }
       $this->participants = $participants;
diff --git a/civicrm/CRM/Export/Form/Select.php b/civicrm/CRM/Export/Form/Select.php
index 69cb9f477f5862e96626eff4fdf704f9a33bc814..81032b6d0af570f28ec148cae450616d2c3778b4 100644
--- a/civicrm/CRM/Export/Form/Select.php
+++ b/civicrm/CRM/Export/Form/Select.php
@@ -52,6 +52,24 @@ class CRM_Export_Form_Select extends CRM_Core_Form_Task {
 
   public $_componentTable;
 
+  /**
+   * @var bool
+   * @internal
+   */
+  public $_selectAll;
+
+  /**
+   * @var bool
+   * @internal
+   */
+  public $_matchingContacts;
+
+  /**
+   * @var array
+   * @internal
+   */
+  public $_greetingOptions;
+
   /**
    * Use the form name to create the tpl file name.
    *
diff --git a/civicrm/CRM/Extension/Container/Basic.php b/civicrm/CRM/Extension/Container/Basic.php
index b99e85512663c8bfe1b8ea779fcf87013cb9960d..20d070b29d6c7cbec934681d7b4970b97706fbf6 100644
--- a/civicrm/CRM/Extension/Container/Basic.php
+++ b/civicrm/CRM/Extension/Container/Basic.php
@@ -98,7 +98,7 @@ class CRM_Extension_Container_Basic implements CRM_Extension_Container_Interface
   public function __construct($baseDir, $baseUrl, ?CRM_Utils_Cache_Interface $cache = NULL, $cacheKey = NULL, ?int $maxDepth = NULL) {
     $this->cache = $cache;
     $this->cacheKey = $cacheKey;
-    $this->baseDir = rtrim($baseDir, '/');
+    $this->baseDir = rtrim($baseDir, '/' . DIRECTORY_SEPARATOR);
     $this->baseUrl = rtrim($baseUrl, '/');
     $this->maxDepth = $maxDepth;
   }
diff --git a/civicrm/CRM/Group/Form/Edit.php b/civicrm/CRM/Group/Form/Edit.php
index e6b4f97c66d393c1ef1eea68cb6c945bba80483c..e0d261362b0d1ba79938d2c582dd82c5da3ee46c 100644
--- a/civicrm/CRM/Group/Form/Edit.php
+++ b/civicrm/CRM/Group/Form/Edit.php
@@ -30,13 +30,6 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
    */
   protected $_group;
 
-  /**
-   * The title of the group being deleted
-   *
-   * @var string
-   */
-  protected $_title;
-
   /**
    * Store the group values
    *
@@ -107,7 +100,6 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
       $this->_groupValues = [];
       $params = ['id' => $this->_id];
       $this->_group = CRM_Contact_BAO_Group::retrieve($params, $this->_groupValues);
-      $this->_title = $this->_groupValues['title'];
     }
 
     $this->assign('action', $this->_action);
@@ -115,8 +107,8 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
 
     if ($this->_action == CRM_Core_Action::DELETE) {
       if (isset($this->_id)) {
-        $this->assign('title', $this->_title);
-        if (!($this->_groupValues['saved_search_id'])) {
+        $this->assign('title', $this->_groupValues['title']);
+        if (empty($this->_groupValues['saved_search_id'])) {
           try {
             $count = CRM_Contact_BAO_Group::memberCount($this->_id);
           }
@@ -139,7 +131,7 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
       if (isset($this->_id)) {
         $groupValues = [
           'id' => $this->_id,
-          'title' => $this->_title,
+          'title' => $this->_groupValues['title'],
           'saved_search_id' => $this->_groupValues['saved_search_id'] ?? '',
         ];
         $this->assign('editSmartGroupURL', isset($this->_groupValues['saved_search_id']) ? CRM_Contact_BAO_SavedSearch::getEditSearchUrl($this->_groupValues['saved_search_id']) : NULL);
@@ -148,7 +140,7 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
 
         $this->assign('group', $groupValues);
 
-        $this->setTitle(ts('Group Settings: %1', [1 => $this->_title]));
+        $this->setTitle(ts('Group Settings: %1', [1 => $this->_groupValues['title']]));
       }
       $session = CRM_Core_Session::singleton();
       $session->pushUserContext(CRM_Utils_System::url('civicrm/group', 'reset=1'));
@@ -302,7 +294,7 @@ WHERE  title = %1
     $updateNestingCache = FALSE;
     if ($this->_action & CRM_Core_Action::DELETE) {
       CRM_Contact_BAO_Group::discard($this->_id);
-      CRM_Core_Session::setStatus(ts("The Group '%1' has been deleted.", [1 => $this->_title]), ts('Group Deleted'), 'success');
+      CRM_Core_Session::setStatus(ts("The Group '%1' has been deleted.", [1 => $this->_groupValues['title']]), ts('Group Deleted'), 'success');
       $updateNestingCache = TRUE;
     }
     else {
diff --git a/civicrm/CRM/Mailing/BAO/Mailing.php b/civicrm/CRM/Mailing/BAO/Mailing.php
index 2051a4fb4bbcdd41bc1d82e9cb06bb2f58293152..eebc7b81d14a64f756cf351654773ee492e26bcc 100644
--- a/civicrm/CRM/Mailing/BAO/Mailing.php
+++ b/civicrm/CRM/Mailing/BAO/Mailing.php
@@ -1235,17 +1235,20 @@ ORDER BY   civicrm_email.is_bulkmail DESC
    *   The mailing id to report.
    * @param bool $skipDetails
    *   Whether return all detailed report.
-   *
    * @param bool $isSMS
+   *   Deprecated argument, will be removed.
    *
    * @return array
    *   Associative array of reporting data
    */
-  public static function &report($id, $skipDetails = FALSE, $isSMS = FALSE) {
+  public static function report($id, $skipDetails = FALSE, $isSMS = FALSE) {
     $mailing_id = CRM_Utils_Type::escape($id, 'Integer');
-
     $mailing = new CRM_Mailing_BAO_Mailing();
 
+    if ($isSMS) {
+      CRM_Core_Error::deprecatedFunctionWarning("isSMS param is deprecated");
+    }
+
     $t = [
       'mailing' => self::getTableName(),
       'mailing_group' => CRM_Mailing_DAO_MailingGroup::getTableName(),
@@ -1264,31 +1267,21 @@ ORDER BY   civicrm_email.is_bulkmail DESC
       'spool' => CRM_Mailing_BAO_Spool::getTableName(),
     ];
 
-    $report = [];
-    $additionalWhereClause = " AND ";
-    if (!$isSMS) {
-      $additionalWhereClause .= " {$t['mailing']}.sms_provider_id IS NULL ";
-    }
-    else {
-      $additionalWhereClause .= " {$t['mailing']}.sms_provider_id IS NOT NULL ";
-    }
-
-    /* Get the mailing info */
-
+    // Get the mailing info
     $mailing->query("
             SELECT          {$t['mailing']}.*
             FROM            {$t['mailing']}
-            WHERE           {$t['mailing']}.id = $mailing_id {$additionalWhereClause}");
-
+            WHERE           {$t['mailing']}.id = $mailing_id");
     $mailing->fetch();
 
+    $report = [];
     $report['mailing'] = [];
     foreach (array_keys(self::fields()) as $field) {
       $field = self::fields()[$field]['name'];
       $report['mailing'][$field] = $mailing->$field;
     }
 
-    //get the campaign
+    // Get the campaign
     $campaignId = $report['mailing']['campaign_id'] ?? NULL;
     if ($campaignId) {
       $campaigns = CRM_Campaign_BAO_Campaign::getCampaigns($campaignId);
@@ -1301,8 +1294,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
       return $report;
     }
 
-    /* Get the component info */
-
+    // Get the component info
     $query = [];
 
     $components = [
@@ -1335,8 +1327,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
       ];
     }
 
-    /* Get the recipient group info */
-
+    // Get the recipient group info
     $mailing->query("
             SELECT          {$t['mailing_group']}.group_type as group_type,
                             {$t['group']}.id as group_id,
@@ -1377,8 +1368,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
         );
       }
 
-      /* Rename hidden groups */
-
+      // Rename hidden groups
       if ($mailing->group_hidden == 1) {
         $row['name'] = "Search Results";
       }
@@ -1394,8 +1384,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
       }
     }
 
-    /* Get the event totals, grouped by job (retries) */
-
+    // Get the event totals, grouped by job (retries)
     $mailing->query("
             SELECT          {$t['job']}.*,
                             COUNT(DISTINCT {$t['queue']}.id) as queue,
@@ -1534,8 +1523,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
       $report['event_totals']['clickthrough_rate'] = 0;
     }
 
-    /* Get the click-through totals, grouped by URL */
-
+    // Get the click-through totals, grouped by URL
     $mailing->query("
             SELECT      {$t['url']}.url,
                         {$t['url']}.id,
diff --git a/civicrm/CRM/Mailing/Form/Optout.php b/civicrm/CRM/Mailing/Form/Optout.php
index de8855b0bc356defc5b980bf59b6fda4f35658ea..b54df1298ce7c247263aee5b41c89a60e7a53fc8 100644
--- a/civicrm/CRM/Mailing/Form/Optout.php
+++ b/civicrm/CRM/Mailing/Form/Optout.php
@@ -63,7 +63,7 @@ class CRM_Mailing_Form_Optout extends CRM_Core_Form {
       );
     }
 
-    list($displayName, $email) = CRM_Mailing_Event_BAO_MailingEventQueue::getContactInfo($queue_id);
+    [$displayName, $email] = CRM_Mailing_Event_BAO_MailingEventQueue::getContactInfo($queue_id);
     $this->assign('display_name', $displayName);
     $emailMasked = CRM_Utils_String::maskEmail($email);
     $this->assign('email_masked', $emailMasked);
@@ -72,7 +72,7 @@ class CRM_Mailing_Form_Optout extends CRM_Core_Form {
   }
 
   public function buildQuickForm() {
-    CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
+    CRM_Utils_System::setNoRobotsFlag();
     $this->setTitle(ts('Opt Out Confirmation'));
 
     $buttons = [
diff --git a/civicrm/CRM/Mailing/Form/Unsubscribe.php b/civicrm/CRM/Mailing/Form/Unsubscribe.php
index bfb2215ca0a0b8f54db33e6e66ca098ca929c201..09031ffb2e71cec72c0e114c16fc06334e2bbc27 100644
--- a/civicrm/CRM/Mailing/Form/Unsubscribe.php
+++ b/civicrm/CRM/Mailing/Form/Unsubscribe.php
@@ -95,7 +95,7 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
   }
 
   public function buildQuickForm() {
-    CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
+    CRM_Utils_System::setNoRobotsFlag();
     $this->setTitle(ts('Unsubscribe Confirmation'));
 
     $buttons = [
diff --git a/civicrm/CRM/Mailing/Page/Confirm.php b/civicrm/CRM/Mailing/Page/Confirm.php
index ced43f2e2687b46d11e9da9ee924515ff9c2ad93..dfa24b4c7f1eb7e3e78e27f4893f6b54c168cb11 100644
--- a/civicrm/CRM/Mailing/Page/Confirm.php
+++ b/civicrm/CRM/Mailing/Page/Confirm.php
@@ -21,7 +21,7 @@ class CRM_Mailing_Page_Confirm extends CRM_Core_Page {
    * @throws Exception
    */
   public function run() {
-    CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
+    CRM_Utils_System::setNoRobotsFlag();
 
     $contact_id = CRM_Utils_Request::retrieve('cid', 'Integer');
     $subscribe_id = CRM_Utils_Request::retrieve('sid', 'Integer');
diff --git a/civicrm/CRM/Mailing/Selector/Browse.php b/civicrm/CRM/Mailing/Selector/Browse.php
index dd649d7543adf892c8fcb11163797620d397aae3..4d73a73b0a702efa7c613890f9d718cec3329492 100644
--- a/civicrm/CRM/Mailing/Selector/Browse.php
+++ b/civicrm/CRM/Mailing/Selector/Browse.php
@@ -371,7 +371,7 @@ LEFT JOIN  civicrm_contact scheduledContact ON ( $mailing.scheduled_id = schedul
           $actionLinks[CRM_Core_Action::UPDATE]['title'] = ts('Copy SMS');
           $actionLinks[CRM_Core_Action::VIEW]['title'] = ts('View SMS Report');
         }
-        if (!($row['status'] === 'Not scheduled') && !$row['sms_provider_id']) {
+        if ($row['status'] !== 'Not scheduled') {
           if ($allAccess || $showCreateLinks) {
             $actionMask = CRM_Core_Action::VIEW;
           }
diff --git a/civicrm/CRM/Member/BAO/MembershipType.php b/civicrm/CRM/Member/BAO/MembershipType.php
index b0d351b00aa20ba45318b04ce20d1abbb8437d95..15946e44897eefef410df3e84cebd578c19147d6 100644
--- a/civicrm/CRM/Member/BAO/MembershipType.php
+++ b/civicrm/CRM/Member/BAO/MembershipType.php
@@ -162,7 +162,7 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType implem
         if (in_array('Membership', $status)) {
           $findMembersURL = CRM_Utils_System::url('civicrm/member/search', 'reset=1');
           $deleteURL = CRM_Utils_System::url('civicrm/contact/search/advanced', 'reset=1');
-          $message .= '<br/>' . ts('%3. There are some contacts who have this membership type assigned to them. Search for contacts with this membership type from <a href=\'%1\'>Find Members</a>. If you are still getting this message after deleting these memberships, there may be contacts in the Trash (deleted) with this membership type. Try using <a href="%2">Advanced Search</a> and checking "Search in Trash".', [
+          $message .= '<br/>' . ts('%3. There are some contacts who have this membership type assigned to them. Search for contacts with this membership type from <a href=\'%1\'>Find Members</a>. If you are still getting this message after deleting these memberships, there may be contacts in the Trash (deleted) with this membership type. Try using <a href="%2">Advanced Search</a> and checking "Search Deleted Contacts".', [
             1 => $findMembersURL,
             2 => $deleteURL,
             3 => $cnt,
diff --git a/civicrm/CRM/Member/Page/UserDashboard.php b/civicrm/CRM/Member/Page/UserDashboard.php
index 5e427c40bec8059c0d6115d20640690249c00923..5646d9371306763cc588405c5d39f58087ae4430 100644
--- a/civicrm/CRM/Member/Page/UserDashboard.php
+++ b/civicrm/CRM/Member/Page/UserDashboard.php
@@ -65,8 +65,54 @@ class CRM_Member_Page_UserDashboard extends CRM_Contact_Page_View_UserDashBoard
     $activeMembers = CRM_Member_BAO_Membership::activeMembers($membership);
     $inActiveMembers = CRM_Member_BAO_Membership::activeMembers($membership, 'inactive');
 
+    // Add Recurring Links (if allowed)
+    $this->buildMemberLinks($activeMembers);
+    $this->buildMemberLinks($inActiveMembers);
+
     $this->assign('activeMembers', $activeMembers);
     $this->assign('inActiveMembers', $inActiveMembers);
+
+  }
+
+  /**
+   * Helper function to build appropriate Member links
+   */
+  public function buildMemberLinks(&$members) {
+    if (!empty($members)) {
+      foreach ($members as $id => &$member) {
+        if (empty($member['contribution_recur_id'])) {
+          continue;
+        }
+
+        $paymentProcessor = NULL;
+        try {
+          $contributionRecur = \Civi\Api4\ContributionRecur::get(FALSE)
+            ->addSelect('payment_processor_id')
+            ->addWhere('id', '=', $member['contribution_recur_id'])
+            ->execute()
+            ->first();
+
+          if (!empty($contributionRecur['payment_processor_id'])) {
+            $paymentProcessor = \Civi\Api4\PaymentProcessor::get(FALSE)
+              ->addWhere('id', '=', $contributionRecur['payment_processor_id'])
+              ->execute()
+              ->first();
+          }
+        }
+        catch (Exception $e) {
+          Civi::log()->warning('Member/UserDashboard: Unable to retrieve recur information ' . $e->getMessage());
+          continue;
+        }
+
+        if (!empty($paymentProcessor)) {
+          $paymentObject = Civi\Payment\System::singleton()->getByProcessor($paymentProcessor);
+          $member['cancelSubscriptionUrl'] = $paymentObject->subscriptionURL($member['membership_id'], 'membership', 'cancel');
+          $member['updateSubscriptionBillingUrl'] = $paymentObject->subscriptionURL($member['membership_id'], 'membership', 'billing');
+          $member['updateSubscriptionUrl'] = $paymentObject->subscriptionURL($member['membership_id'], 'membership', 'update');
+        }
+      }
+    }
+
   }
 
   /**
diff --git a/civicrm/CRM/Price/Form/Field.php b/civicrm/CRM/Price/Form/Field.php
index ea82196dcf50179d470146d7879751aeb2e4c0b6..ec6f1f7975e592b9514ab88aff2c675e5048ea92 100644
--- a/civicrm/CRM/Price/Form/Field.php
+++ b/civicrm/CRM/Price/Form/Field.php
@@ -215,12 +215,12 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
       $this->assign('useForEvent', FALSE);
     }
 
-    $sel = $this->add('select', 'html_type', ts('Input Field Type'),
+    $sel = $this->add('select', 'html_type', ts('Field Type'),
       $htmlTypes, TRUE, $javascript
     );
 
     // price (for text inputs)
-    $this->add('text', 'price', ts('Price'));
+    $this->add('text', 'price', ts('Unit Price'));
     $this->registerRule('price', 'callback', 'money', 'CRM_Utils_Rule');
     $this->addRule('price', ts('must be a monetary value'), 'money');
 
diff --git a/civicrm/CRM/Report/Form.php b/civicrm/CRM/Report/Form.php
index 823f874d9241bc58095d2c2c969d3cc1fe0d2ffd..5c48a1bd9e1f8529cd29a87b3c6be0db06b4586a 100644
--- a/civicrm/CRM/Report/Form.php
+++ b/civicrm/CRM/Report/Form.php
@@ -1478,7 +1478,7 @@ class CRM_Report_Form extends CRM_Core_Form {
           default:
             // default type is string
             $this->addElement('select', "{$fieldName}_op", ts('Operator:'), $operations,
-              ['onchange' => "return showHideMaxMinVal( '$fieldName', this.value );"]
+              ['onchange' => "return showHideMaxMinVal( '$fieldName', this.value );", 'title' => ts('%1 Filter Operator', [1 => $field['title']])]
             );
             // we need text box for value input
             $this->add('text', "{$fieldName}_value", NULL, ['class' => 'huge']);
@@ -1695,8 +1695,8 @@ class CRM_Report_Form extends CRM_Core_Form {
           'ASC' => ts('Ascending'),
           'DESC' => ts('Descending'),
         ]);
-        $this->addElement('checkbox', "order_bys[{$i}][section]", ts('Order by Section'), FALSE, ['id' => "order_by_section_$i"]);
-        $this->addElement('checkbox', "order_bys[{$i}][pageBreak]", ts('Page Break'), FALSE, ['id' => "order_by_pagebreak_$i"]);
+        $this->addElement('checkbox', "order_bys[{$i}][section]", ts('Order by Section'), FALSE, ['id' => "order_by_section_$i", 'title' => ts('Order by Section %1', [1 => $i])]);
+        $this->addElement('checkbox', "order_bys[{$i}][pageBreak]", ts('Page Break'), FALSE, ['id' => "order_by_pagebreak_$i", 'title' => ts('Page Break %1', [1 => $i])]);
       }
     }
   }
@@ -1723,7 +1723,7 @@ class CRM_Report_Form extends CRM_Core_Form {
       $this->addElement('select', 'groups', ts('Group'),
         ['' => ts('Add Contacts to Group')] +
         CRM_Core_PseudoConstant::nestedGroup(),
-        ['class' => 'crm-select2 crm-action-menu fa-plus huge']
+        ['class' => 'crm-select2 crm-action-menu fa-plus huge', 'title' => ts('Add Contacts to Group')]
       );
       $this->assign('group', TRUE);
     }
diff --git a/civicrm/CRM/Report/Form/Instance.php b/civicrm/CRM/Report/Form/Instance.php
index 4230e15063dbdb50c1865f9200234be0c59e8287..e46bf73c4f385f675c917fbd55e6b8809344fb93 100644
--- a/civicrm/CRM/Report/Form/Instance.php
+++ b/civicrm/CRM/Report/Form/Instance.php
@@ -125,6 +125,7 @@ class CRM_Report_Form_Instance {
           'size' => 5,
           'style' => 'width:240px',
           'class' => 'advmultiselect',
+          'title' => ts('ACL Group/Role'),
         ]
       );
       $grouprole->setButtonAttributes('add', ['value' => ts('Add >>')]);
diff --git a/civicrm/CRM/Upgrade/Incremental/Base.php b/civicrm/CRM/Upgrade/Incremental/Base.php
index 5b410418f6221acfe2e6b455c4cda2edce1670fd..87ae6c5ed3147f185f0506478a08adb04679098f 100644
--- a/civicrm/CRM/Upgrade/Incremental/Base.php
+++ b/civicrm/CRM/Upgrade/Incremental/Base.php
@@ -390,6 +390,30 @@ class CRM_Upgrade_Incremental_Base {
     return CRM_Core_BAO_SchemaHandler::checkFKExists($table_name, $constraint_name);
   }
 
+  /**
+   * Task to add or change a column definition, based on the php schema spec.
+   *
+   * @param $ctx
+   * @param string $entityName
+   * @param string $fieldName
+   * @param array $fieldSpec
+   *   As definied in the .entityType.php file for $entityName
+   * @return bool
+   * @throws CRM_Core_Exception
+   */
+  public static function alterSchemaField($ctx, string $entityName, string $fieldName, array $fieldSpec): bool {
+    $tableName = Civi::entity($entityName)->getMeta('table');
+    global $civicrm_root;
+    $sqlGenerator = require "$civicrm_root/mixin/lib/civimix-schema/src/SqlGenerator.php";
+    $fieldSql = $sqlGenerator::generateFieldSql($fieldSpec);
+    if (CRM_Core_BAO_SchemaHandler::checkIfFieldExists($tableName, $fieldName, FALSE)) {
+      return self::alterColumn($ctx, $tableName, $fieldName, $fieldSql, !empty($fieldSpec['localizable']));
+    }
+    else {
+      return self::addColumn($ctx, $tableName, $fieldName, $fieldSql, !empty($fieldSpec['localizable']));
+    }
+  }
+
   /**
    * Add a column to a table if it doesn't already exist
    *
diff --git a/civicrm/CRM/Upgrade/Incremental/php/FiveEighty.php b/civicrm/CRM/Upgrade/Incremental/php/FiveEighty.php
new file mode 100644
index 0000000000000000000000000000000000000000..136b57b2dd1066438154d28835a4e1adf66fc729
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/php/FiveEighty.php
@@ -0,0 +1,62 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Upgrade logic for the 5.80.x series.
+ *
+ * Each minor version in the series is handled by either a `5.80.x.mysql.tpl` file,
+ * or a function in this class named `upgrade_5_80_x`.
+ * If only a .tpl file exists for a version, it will be run automatically.
+ * If the function exists, it must explicitly add the 'runSql' task if there is a corresponding .mysql.tpl.
+ *
+ * This class may also implement `setPreUpgradeMessage()` and `setPostUpgradeMessage()` functions.
+ */
+class CRM_Upgrade_Incremental_php_FiveEighty extends CRM_Upgrade_Incremental_Base {
+
+  /**
+   * Upgrade step; adds tasks including 'runSql'.
+   *
+   * @param string $rev
+   *   The version number matching this function name
+   */
+  public function upgrade_5_80_alpha1($rev): void {
+    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+    $this->addTask('Increase length of Website.url field', 'alterSchemaField', 'Website', 'url', [
+      'title' => ts('Website'),
+      'sql_type' => 'varchar(2048)',
+      'input_type' => 'Text',
+      'description' => ts('Website'),
+      'add' => '3.2',
+      'usage' => [
+        'import',
+        'export',
+        'duplicate_matching',
+      ],
+      'input_attrs' => [
+        'size' => '45',
+      ],
+    ]);
+    $this->addTask('Increase length of Activity.location field', 'alterSchemaField', 'Activity', 'location', [
+      'title' => ts('Location'),
+      'sql_type' => 'varchar(2048)',
+      'input_type' => 'Text',
+      'description' => ts('Location of the activity (optional, open text).'),
+      'add' => '1.1',
+      'unique_name' => 'activity_location',
+      'usage' => [
+        'import',
+        'export',
+        'duplicate_matching',
+      ],
+    ]);
+  }
+
+}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.80.alpha1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.80.alpha1.mysql.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..a913d871c6ad96c994d1f93f0ae424f70052dcf4
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.80.alpha1.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.80.alpha1 during upgrade *}
diff --git a/civicrm/CRM/Utils/EnglishNumber.php b/civicrm/CRM/Utils/EnglishNumber.php
index 37a8663ccef99eed366f413ca84b3474397e55d4..c3a7777c9585c2cb138452842c9dd623eaa78592 100644
--- a/civicrm/CRM/Utils/EnglishNumber.php
+++ b/civicrm/CRM/Utils/EnglishNumber.php
@@ -65,18 +65,32 @@ class CRM_Utils_EnglishNumber {
    *   Ex: 'Twelve' or 'FiftyFour'.
    */
   public static function toCamelCase($num, $default = NULL) {
+    $hundreds = (int) ($num / 100);
+    $num = ($num % 100);
+    $tens = (int) ($num / 10);
+    $last = $num % 10;
+
+    $prefix = '';
+    if ($hundreds > 0) {
+      $prefix = static::toCamelCase($hundreds);
+      if ($tens === 0 && $last === 0) {
+        return $prefix . 'Hundred';
+      }
+      elseif ($tens === 0) {
+        $prefix .= 'Oh';
+      }
+    }
+
     if (isset(self::$lowNumbers[$num])) {
-      return self::$lowNumbers[$num];
+      return $prefix . self::$lowNumbers[$num];
     }
 
-    $tens = (int) ($num / 10);
-    $last = $num % 10;
     if (isset(self::$intervalsOfTen[$tens])) {
       if ($last == 0) {
-        return self::$intervalsOfTen[$tens];
+        return $prefix . self::$intervalsOfTen[$tens];
       }
       else {
-        return self::$intervalsOfTen[$tens] . self::$lowNumbers[$last];
+        return $prefix . self::$intervalsOfTen[$tens] . self::$lowNumbers[$last];
       }
     }
 
@@ -99,27 +113,8 @@ class CRM_Utils_EnglishNumber {
    *   Ex: 'twelve' or 'fifty-four'.
    */
   public static function toHyphen($num, $default = NULL) {
-    if (isset(self::$lowNumbers[$num])) {
-      return strtolower(self::$lowNumbers[$num]);
-    }
-
-    $tens = (int) ($num / 10);
-    $last = $num % 10;
-    if (isset(self::$intervalsOfTen[$tens])) {
-      if ($last == 0) {
-        return strtolower(self::$intervalsOfTen[$tens]);
-      }
-      else {
-        return strtolower(self::$intervalsOfTen[$tens]) . '-' . strtolower(self::$lowNumbers[$last]);
-      }
-    }
-
-    if ($default === NULL) {
-      throw new \RuntimeException("Cannot convert number to English: " . (int) $num);
-    }
-    else {
-      return $default;
-    }
+    $camel = static::toCamelCase($num, $default);
+    return strtolower(preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $camel));
   }
 
   /**
diff --git a/civicrm/CRM/Utils/Mail.php b/civicrm/CRM/Utils/Mail.php
index 6329e553aacaf58a68b29f5c08a57452a0dc79ef..8ea727400b8191ece00bab685cb199745b593da3 100644
--- a/civicrm/CRM/Utils/Mail.php
+++ b/civicrm/CRM/Utils/Mail.php
@@ -311,7 +311,7 @@ class CRM_Utils_Mail {
       if ($logCount < 3) {
         // Only record the first 3 times since there might be different messages but after 3 chances are
         // it's just bulk run of the same..
-        CRM_Core_Error::deprecatedWarning('email output affected by undefined php properties:' . (CRM_Utils_Constant::value('CIVICRM_UF') === 'UnitTests' ? CRM_Utils_String::purifyHTML($htmlMessage) : ''));
+        CRM_Core_Error::deprecatedWarning('email output affected by undefined php properties:' . (CRM_Utils_Constant::value('CIVICRM_UF') === 'UnitTests' ? CRM_Utils_String::purifyHTML($htmlMessage) . CRM_Utils_String::purifyHTML($textMessage) : ''));
         $logCount++;
         \Civi::$statics[__CLASS__][__FUNCTION__]['count'] = $logCount;
       }
diff --git a/civicrm/CRM/Utils/System.php b/civicrm/CRM/Utils/System.php
index 1dcd408a3065828c66d33d612fba96c48fc12474..404401d70ddd8b1beb7a73013d6363ff78183868 100644
--- a/civicrm/CRM/Utils/System.php
+++ b/civicrm/CRM/Utils/System.php
@@ -1196,6 +1196,15 @@ class CRM_Utils_System {
     return preg_match("/^(\d{1,2}\.){2,3}(\d{1,2}|(alpha|beta)\d{1,2})(\.upgrade)?$/", $version);
   }
 
+  /**
+   * Set the html header to direct robots not to index the page.
+   *
+   * @return void
+   */
+  public static function setNoRobotsFlag(): void {
+    CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
+  }
+
   /**
    * Wraps or emulates PHP's getallheaders() function.
    */
@@ -1552,9 +1561,7 @@ class CRM_Utils_System {
     }
     $config = CRM_Core_Config::singleton();
     $result = $config->userSystem->loadBootStrap($params, $loadUser, $throwError, $realPath);
-    if (is_callable([$config->userSystem, 'setMySQLTimeZone'])) {
-      $config->userSystem->setMySQLTimeZone();
-    }
+    $config->userSystem->setTimeZone();
     return $result;
   }
 
diff --git a/civicrm/CRM/Utils/System/Base.php b/civicrm/CRM/Utils/System/Base.php
index fd7171be47a81ece920b6c7d02ec6cfe60f5b851..bec7f8aed0a79494839fcf5c1c2bcb3525649b65 100644
--- a/civicrm/CRM/Utils/System/Base.php
+++ b/civicrm/CRM/Utils/System/Base.php
@@ -749,10 +749,14 @@ abstract class CRM_Utils_System_Base {
   }
 
   /**
-   * Set timezone in mysql so that timestamp fields show the correct time.
+   * Set MySQL timezone so that timestamp fields show the correct time.
+   *
+   * @param ?string $timeZone
+   *    Timezone string - if none provided will be fetched from system
    */
-  public function setMySQLTimeZone() {
-    $timeZoneOffset = $this->getTimeZoneOffset();
+  public function setMySQLTimeZone(?string $timeZone = NULL) {
+    $timeZone = $timeZone ?? $this->getTimeZoneString();
+    $timeZoneOffset = \CRM_Utils_Time::getTimeZoneOffsetFromString($timeZone);
     if ($timeZoneOffset) {
       $sql = "SET time_zone = '$timeZoneOffset'";
       CRM_Core_DAO::executeQuery($sql);
@@ -760,42 +764,29 @@ abstract class CRM_Utils_System_Base {
   }
 
   /**
-   * Get timezone from CMS.
+   * Set PHP timezone
    *
-   * @return string|false|null
+   * @param ?string $timeZone
+   *    Timezone string - default value will be fetched
+   *    using getTimeZoneString if not provided or falsey
    */
-  public function getTimeZoneOffset() {
-    $timezone = $this->getTimeZoneString();
-    if ($timezone) {
-      if ($timezone == 'UTC' || $timezone == 'Etc/UTC') {
-        // CRM-17072 Let's short-circuit all the zero handling & return it here!
-        return '+00:00';
-      }
-      $tzObj = new DateTimeZone($timezone);
-      $dateTime = new DateTime("now", $tzObj);
-      $tz = $tzObj->getOffset($dateTime);
-
-      if ($tz === 0) {
-        // CRM-21422
-        return '+00:00';
-      }
-
-      if (empty($tz)) {
-        return FALSE;
-      }
-
-      $timeZoneOffset = sprintf("%02d:%02d", $tz / 3600, abs(($tz / 60) % 60));
-
-      if ($timeZoneOffset > 0) {
-        $timeZoneOffset = '+' . $timeZoneOffset;
-      }
-      return $timeZoneOffset;
-    }
-    return NULL;
+  public function setPhpTimeZone(?string $timeZone = NULL) {
+    $timeZone = $timeZone ?: $this->getTimeZoneString();
+    date_default_timezone_set($timeZone);
   }
 
   /**
-   * Get timezone as a string.
+   * Set system timezone (both PHP + MySQL)
+   */
+  public function setTimeZone(?string $timeZone = NULL) {
+    $timeZone = $timeZone ?? $this->getTimeZoneString();
+
+    $this->setPhpTimeZone($timeZone);
+    $this->setMySQLTimeZone($timeZone);
+  }
+
+  /**
+   * Get timezone from CMS as a string.
    * @return string
    *   Timezone string e.g. 'America/Los_Angeles'
    */
@@ -803,6 +794,15 @@ abstract class CRM_Utils_System_Base {
     return date_default_timezone_get();
   }
 
+  /**
+   * Get timezone offset from CMS
+   *
+   * @return string|false|null
+   */
+  public function getTimeZoneOffset() {
+    return \CRM_Utils_Time::getTimeZoneOffsetFromString($this->getTimeZoneString());
+  }
+
   /**
    * Get Unique Identifier from UserFramework system (CMS).
    *
diff --git a/civicrm/CRM/Utils/System/Joomla.php b/civicrm/CRM/Utils/System/Joomla.php
index a191e73f87df0793394476cc8055833f3678c618..fd2dcee4d17910c5876a3f89622053f01150ca8f 100644
--- a/civicrm/CRM/Utils/System/Joomla.php
+++ b/civicrm/CRM/Utils/System/Joomla.php
@@ -651,8 +651,7 @@ class CRM_Utils_System_Joomla extends CRM_Utils_System_Base {
     $config = JFactory::getConfig();
     $timezone = $config->get('offset');
     if ($timezone) {
-      date_default_timezone_set($timezone);
-      CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone();
+      $this->setTimeZone($timezone);
     }
     if (version_compare(JVERSION, '4.0', '>=')) {
       // Boot the DI container
diff --git a/civicrm/CRM/Utils/System/Standalone.php b/civicrm/CRM/Utils/System/Standalone.php
index 10d41aaedad655bc17118a4911a58ce231009a64..1d3e7c1be686644009411d83a9cd655afad532b3 100644
--- a/civicrm/CRM/Utils/System/Standalone.php
+++ b/civicrm/CRM/Utils/System/Standalone.php
@@ -15,7 +15,6 @@
  * @copyright CiviCRM LLC https://civicrm.org/licensing
  */
 
-use Civi\Standalone\Security;
 use Civi\Standalone\SessionHandler;
 
 /**
@@ -24,8 +23,52 @@ use Civi\Standalone\SessionHandler;
 class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
 
   /**
-   * @internal
+   * Standalone uses a CiviCRM Extension, Standaloneusers, to provide user
+   * functionality
+   *
+   * This is great for modularity - but does mean that there are points in
+   * bootstrap / install / failure where the extension isn't available
+   * and we need to provide fallback/failsafe behaviours
+   *
+   * This function provides a general check for whether we are in such a
+   * scenario
+   *
+   * (In the future, alternative user-providing extensions may be available - in
+   * which case this check might need generalising. One possibility could be
+   * to use the Api4 User interface as a spec for what any extension must provide
+   *
+   * Then maybe the check could be if (class_exists(\Civi\Api4\User::class))?
+   *
    * @return bool
+   *   Whether user extension is available
+   */
+  protected function isUserExtensionAvailable(): bool {
+    if (!class_exists(\Civi\Api4\User::class)) {
+      return FALSE;
+    }
+    // TODO: the following would be be a better check, as sometimes during
+    // upgrade the User class can exist but the entity is not actually loaded
+    //
+    // HOWEVER: it currently causes a crash during the install phase.
+    // https://github.com/civicrm/civicrm-core/pull/31198 may help.
+    //
+    // if (!\Civi\Api4\Utils\CoreUtil::entityExists('User')) {
+    //   return FALSE;
+    // }
+
+    // authx function is required for standalone user system
+    if (!function_exists('_authx_uf')) {
+      return FALSE;
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * @inheritdoc
+   *
+   * In Standalone the UF is CiviCRM, so we're never
+   * running without it
    */
   public function isLoaded(): bool {
     return TRUE;
@@ -36,37 +79,41 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    */
   public function getDefaultFileStorage() {
     return [
-      'url' => 'upload',
-      // @todo Not sure if this is wise - what about CLI invocation?
-      'path' => $_SERVER['DOCUMENT_ROOT'],
+      'path' => \Civi::paths()->getPath('[cms.root]/public'),
+      'url' => \Civi::paths()->getUrl('[cms.root]/public'),
     ];
   }
 
   /**
    * @inheritDoc
-   *
-   * Create a user in the CMS.
-   *
-   * @param array $params keys:
-   *    - 'cms_name'
-   *    - 'cms_pass' plaintext password
-   *    - 'notify' boolean
-   * @param string $mailParam
-   *   Name of the param which contains the email address.
-   *   Because. Right. OK. That's what it is.
-   *
-   * @return int|bool
-   *   uid if user was created, false otherwise
    */
-  public function createUser(&$params, $mailParam) {
-    return Security::singleton()->createUser($params, $mailParam);
+  public function createUser(&$params, $emailParam) {
+    try {
+      $email = $params[$emailParam];
+      $userID = \Civi\Api4\User::create(FALSE)
+        ->addValue('username', $params['cms_name'])
+        ->addValue('uf_name', $email)
+        ->addValue('password', $params['cms_pass'])
+        ->addValue('contact_id', $params['contact_id'] ?? NULL)
+        // ->addValue('uf_id', 0) // does not work without this.
+        ->execute()->single()['id'];
+    }
+    catch (\Exception $e) {
+      \Civi::log()->warning("Failed to create user '$email': " . $e->getMessage());
+      return FALSE;
+    }
+
+    return (int) $userID;
   }
 
   /**
    * @inheritDoc
    */
   public function updateCMSName($ufID, $email) {
-    return Security::singleton()->updateCMSName($ufID, $email);
+    \Civi\Api4\User::update(FALSE)
+      ->addWhere('id', '=', $ufID)
+      ->addValue('uf_name', $email)
+      ->execute();
   }
 
   /**
@@ -181,13 +228,16 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
     $frontend = FALSE,
     $forceBackend = FALSE
   ) {
-    $fragment = $fragment ? ('#' . $fragment) : '';
-    if ($absolute) {
-      return Civi::paths()->getUrl("[cms.root]/{$path}?{$query}$fragment", 'absolute');
+    // TODO: Add type hints
+    $query = (string) $query;
+    if (strlen($query)) {
+      $query = "?$query";
     }
-    else {
-      return Civi::paths()->getUrl("[cms.root]/{$path}?{$query}$fragment");
+    $fragment = (string) $fragment;
+    if (strlen($fragment)) {
+      $fragment = "#$fragment";
     }
+    return Civi::paths()->getUrl("[cms.root]/$path$query$fragment", $absolute ? 'absolute' : 'relative');
   }
 
   /**
@@ -206,21 +256,28 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    * @inheritDoc
    * Authenticate the user against the CMS db.
    *
+   * I think this is only used by CLI so setting the session
+   * doesn't make sense
+   *
    * @param string $name
    *   The user name.
    * @param string $password
    *   The password for the above user.
    * @param bool $loadCMSBootstrap
-   *   Load cms bootstrap?.
+   *   Not used in Standalone context
    * @param string $realPath
-   *   Filename of script
+   *   Not used in Standalone context
    *
    * @return array|bool
    *   [contactID, ufID, unique string] else false if no auth
    * @throws \CRM_Core_Exception.
    */
   public function authenticate($name, $password, $loadCMSBootstrap = FALSE, $realPath = NULL) {
-    return Security::singleton()->authenticate($name, $password, $loadCMSBootstrap, $realPath);
+    $authxLogin = authx_login(['flow' => 'login', 'cred' => 'Basic ' . base64_encode("{$name}:{$password}")]);
+
+    // Note: random_int is more appropriate for cryptographical use than mt_rand
+    // The long number is the max 32 bit value.
+    return [$authxLogin['contactId'], $authxLogin['userId'], random_int(0, 2147483647)];
   }
 
   /**
@@ -232,17 +289,23 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    * @return int|null
    */
   public function getUfId($username) {
-    return Security::singleton()->getUserIDFromUsername($username);
+    if (!$this->isUserExtensionAvailable()) {
+      return NULL;
+    }
+    return \Civi\Api4\User::get(FALSE)
+      ->addWhere('username', '=', $username)
+      ->execute()
+      ->first()['id'] ?? NULL;
   }
 
   /**
-   * Immediately stop script execution, log out the user and redirect to the home page.
-   *
-   * @deprecated
-   *   This function should be removed in favor of linking to the CMS's logout page
+   * Immediately stop script execution and log out the user
    */
   public function logout() {
-    return Security::singleton()->logoutUser();
+    _authx_uf()->logoutSession();
+    // redirect to the home page?
+    // breaks tests in standaloneusers-e2e
+    // \CRM_Utils_System::redirect('/civicrm/login');
   }
 
   /**
@@ -280,7 +343,17 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
   /**
    * Bootstrap Standalone.
    *
+   * In CRM_Utils_System context, this function is used by cv/civix/? to bootstrap
+   * the CMS *after* CiviCRM is already loaded (as compared to normal web requests,
+   * which load the CMS then CiviCRM)
+   *
+   * For Standalone there shouldn't be anything additional to load at this
+   * stage in terms of system services.
+   *
+   *
    * This is used by cv and civix, but not I (artfulrobot) think, in the main http requests.
+   * External scripts may assume loading a users requires the CMS bootstrap
+   * - so we keep support for logging in a user now
    *
    * @param array $params
    *   Either uid, or name & pass.
@@ -288,7 +361,8 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    *   Boolean Require CMS user load.
    * @param bool $throwError
    *   If true, print error on failure and exit.
-   * @param bool|string $realPath path to script
+   * @param bool|string $realPath
+   *   Not used in Standalone context
    *
    * @return bool
    * @Todo Handle setting cleanurls configuration for CiviCRM?
@@ -296,96 +370,96 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
   public function loadBootStrap($params = [], $loadUser = TRUE, $throwError = TRUE, $realPath = NULL) {
     static $runOnce;
 
-    if (!isset($runOnce)) {
-      $runOnce = TRUE;
-    }
-    else {
+    if (isset($runOnce)) {
+      // we've already run
       return TRUE;
     }
 
-    global $civicrm_paths;
-    require_once $civicrm_paths['civicrm.vendor']['path'] . '/autoload.php';
-
-    // seems like we've bootstrapped drupal
-    $config = CRM_Core_Config::singleton();
-    $config->cleanURL = 1;
-
-    // I don't *think* this applies to Standalone:
-    //
-    // we need to call the config hook again, since we now know
-    // all the modules that are listening on it, does not apply
-    // to J! and WP as yet
-    // CRM-8655
-    // CRM_Utils_Hook::config($config);
+    // dont run again
+    $runOnce = TRUE;
 
     if (!$loadUser) {
       return TRUE;
     }
 
-    $security = \Civi\Standalone\Security::singleton();
-    if (!empty($params['uid'])) {
-      $user = $security->loadUserByID($params['uid']);
+    try {
+      if (!empty($params['uid'])) {
+        _authx_uf()->loginStateless($params['uid']);
+        return TRUE;
+      }
+      elseif (!empty($params['name'] && !empty($params['pass']))) {
+        // It seems from looking at the Drupal implementation, that
+        // if given username we expect a correct password.
+
+        /**
+         * @throws CRM_Core_Exception if login unsuccessful
+         */
+        $this->authenticate($params['name'], $params['pass']);
+        return TRUE;
+      }
+      else {
+        return FALSE;
+      }
     }
-    elseif (!empty($params['name'] && !empty($params['pass']))) {
-      // It seems from looking at the Drupal implementation, that
-      // if given username we expect a correct password.
-      $user = $security->loadUserByName($params['name']);
-      if ($user) {
-        if (!$security->checkPassword($params['pass'], $user['hashed_password'] ?? '')) {
-          return FALSE;
-        }
+    catch (\CRM_Core_Exception $e) {
+      // swallow any errors if $throwError is false
+      // (presume the expectation is these are login errors
+      // - though that isn't guaranteed?)
+      if (!$throwError) {
+        return FALSE;
       }
+      throw $e;
     }
-    if (!$user) {
+  }
+
+  /**
+   * @inheritdoc
+   */
+  public function loadUser($username) {
+    $userID = $this->getUfId($username) ?? NULL;
+    if (!$userID) {
       return FALSE;
     }
-
-    $security->loginAuthenticatedUserRecord($user, FALSE);
-
+    _authx_uf()->loginSession($userID);
     return TRUE;
   }
 
-  public function loadUser($username) {
-    $security = \Civi\Standalone\Security::singleton();
-    $user = $security->loadUserByName($username);
-    if ($user) {
-      $security->loginAuthenticatedUserRecord($user, TRUE);
-      return TRUE;
-    }
-    else {
+  /**
+   * Load an active user by internal user ID.
+   *
+   * @return array|bool FALSE if not found.
+   */
+  public function getUserById(int $userID) {
+    if (!$this->isUserExtensionAvailable()) {
       return FALSE;
     }
+    return \Civi\Api4\User::get(FALSE)
+      ->addWhere('id', '=', $userID)
+      ->addWhere('is_active', '=', TRUE)
+      ->execute()
+      ->first() ?: FALSE;
   }
 
   /**
    * @inheritdoc
    */
   public function getCiviSourceStorage(): array {
-    global $civicrm_root;
-
-    if (!defined('CIVICRM_UF_BASEURL')) {
-      throw new RuntimeException('Undefined constant: CIVICRM_UF_BASEURL');
-    }
-
     return [
-      'url' => CRM_Utils_File::addTrailingSlash(CIVICRM_UF_BASEURL, '/') . 'core/',
-      'path' => CRM_Utils_File::addTrailingSlash($civicrm_root),
+      'path' => Civi::paths()->getPath('[cms.root]/core'),
+      'url' => Civi::paths()->getUrl('[cms.root]/core'),
     ];
   }
 
   /**
-   * Determine the location of the CMS root.
+   * In Standalone, this returns the app root
    *
-   * @param string $path
+   * The $appRootPath global is set in civicrm.standalone.php
    *
    * @return NULL|string
    */
-  public function cmsRootPath($path = NULL) {
-    global $civicrm_paths;
-    if (!empty($civicrm_paths['cms.root']['path'])) {
-      return $civicrm_paths['cms.root']['path'];
-    }
-    throw new \RuntimeException("Standalone requires the path is set for now. Set \$civicrm_paths['cms.root']['path'] in civicrm.settings.php to the webroot.");
+  public function cmsRootPath() {
+    global $appRootPath;
+    return $appRootPath;
   }
 
   public function isFrontEndPage() {
@@ -396,7 +470,7 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    * @inheritDoc
    */
   public function isUserLoggedIn() {
-    return Security::singleton()->isUserLoggedIn();
+    return !empty($this->getLoggedInUfID());
   }
 
   /**
@@ -425,9 +499,15 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
 
   /**
    * @inheritDoc
+   *
+   * If the User extension isn't available
+   * then no one is logged in
    */
   public function getLoggedInUfID() {
-    return Security::singleton()->getLoggedInUfID();
+    if (!$this->isUserExtensionAvailable()) {
+      return NULL;
+    }
+    return _authx_uf()->getCurrentUserId();
   }
 
   /**
@@ -457,52 +537,6 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
     CRM_Core_Session::setStatus('', $message, 'info');
   }
 
-  /**
-   * I don't know why this needs to be here? Does it even?
-   *
-   * Helper function to extract path, query and route name from Civicrm URLs.
-   *
-   * For example, 'civicrm/contact/view?reset=1&cid=66' will be returned as:
-   *
-   * ```
-   * array(
-   *   'path' => 'civicrm/contact/view',
-   *   'route' => 'civicrm.civicrm_contact_view',
-   *   'query' => array('reset' => '1', 'cid' => '66'),
-   * );
-   * ```
-   *
-   * @param string $url
-   *   The url to parse.
-   *
-   * @return string[]
-   *   The parsed url parts, containing 'path', 'route' and 'query'.
-   */
-  public function parseUrl($url) {
-    $processed = ['path' => '', 'route_name' => '', 'query' => []];
-
-    // Remove leading '/' if it exists.
-    $url = ltrim($url, '/');
-
-    // Separate out the url into its path and query components.
-    $url = parse_url($url);
-    if (empty($url['path'])) {
-      return $processed;
-    }
-    $processed['path'] = $url['path'];
-
-    // Create a route name by replacing the forward slashes in the path with
-    // underscores, civicrm/contact/search => civicrm.civicrm_contact_search.
-    $processed['route_name'] = 'civicrm.' . implode('_', explode('/', $url['path']));
-
-    // Turn the query string (if it exists) into an associative array.
-    if (!empty($url['query'])) {
-      parse_str($url['query'], $processed['query']);
-    }
-
-    return $processed;
-  }
-
   /**
    * Append any Standalone js to coreResourcesList.
    *
@@ -515,9 +549,9 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    * @inheritDoc
    */
   public function getTimeZoneString() {
-    $userId = Security::singleton()->getLoggedInUfID();
+    $userId = $this->getLoggedInUfID();
     if ($userId) {
-      $user = Security::singleton()->loadUserByID($userId);
+      $user = $this->getUserById($userId);
       if ($user && !empty($user['timezone'])) {
         return $user['timezone'];
       }
@@ -527,19 +561,10 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
 
   /**
    * @inheritDoc
+   * @todo implement language negotiation for Standalone?
    */
   public function languageNegotiationURL($url, $addLanguagePart = TRUE, $removeLanguagePart = FALSE) {
-    if (empty($url)) {
-      return $url;
-    }
-
-    // This method is called early in the boot process.
-    // Check if the extensions are available yet as our implementation requires Standaloneusers.
-    // Debugging note: calling Civi::log() methods here creates a nasty crash.
-    if (!class_exists(\Civi\Standalone\Security::class)) {
-      return $url;
-    }
-    return Security::singleton()->languageNegotiationURL($url, $addLanguagePart = TRUE, $removeLanguagePart = FALSE);
+    return $url;
   }
 
   /**
@@ -547,7 +572,7 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    * @return array
    */
   public function getCMSPermissionsUrlParams() {
-    return Security::singleton()->getCMSPermissionsUrlParams();
+    return ['ufAccessURL' => '/civicrm/admin/roles'];
   }
 
   /**
@@ -560,16 +585,15 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
    * - For unauthenticated users, it shows login screen with an error blurb.
    */
   public function permissionDenied() {
+    // If not logged in, they need to.
     $session = CRM_Core_Session::singleton();
-    $isAuthenticated = (bool) $session->get('ufID');
     $useSession = ($session->get('authx')['useSession'] ?? TRUE);
-
-    if ($isAuthenticated && $useSession) {
+    if ($this->isUserLoggedIn() && $useSession) {
       // They are logged in; they're just not allowed this page.
       CRM_Core_Error::statusBounce(ts("Access denied"), CRM_Utils_System::url('civicrm'));
       return;
     }
-    elseif ($isAuthenticated && !$useSession) {
+    elseif ($this->isUserLoggedIn() && !$useSession) {
       return (new CRM_Standaloneusers_Page_PermissionDenied())->run();
     }
     else {
@@ -582,20 +606,22 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
         return $loginPage->run();
       }
 
-      throw new CRM_Core_Exception('Access denied. Standaloneusers extension not found');
+      throw new CRM_Core_Exception('Access denied. Standaloneusers login page not found');
     }
   }
 
   /**
    * Start a new session.
+   *
+   * Generally this uses the SessionHander provided by Standaloneusers
+   * extension - but we fallback to a default PHP session to:
+   * a) allow the installer to work (early in the Standalone install, we dont have Standaloneusers yet)
+   * b) avoid unhelpfully hard crash if the ExtensionSystem goes down (without the fallback, the crash
+   * here swallows whatever error is actually causing the crash)
    */
   public function sessionStart() {
-    if (defined('CIVI_SETUP')) {
-      // during installation we can't use the session
-      // handler from the extension yet so we just
-      // use a default php session
-      // use a different cookie name to avoid any nasty clash
-      $session_cookie_name = 'SESSCIVISOINSTALL';
+    if (!$this->isUserExtensionAvailable()) {
+      $session_cookie_name = 'SESSCIVISOFALLBACK';
     }
     else {
       $session_handler = new SessionHandler();
@@ -617,6 +643,38 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
     ]);
   }
 
+  public function initialize() {
+    parent::initialize();
+    $this->registerDefaultPaths();
+  }
+
+  /**
+   * Specify the default computation for various paths/URLs.
+   */
+  protected function registerDefaultPaths(): void {
+    \Civi::paths()
+      ->register('civicrm.private', function () {
+          return [
+            'path' => \Civi::paths()->getPath('[cms.root]/private'),
+          ];
+      })
+      ->register('civicrm.compile', function () {
+        return [
+          'path' => \Civi::paths()->getPath('[civicrm.private]/cache'),
+        ];
+      })
+      ->register('civicrm.log', function () {
+        return [
+          'path' => \Civi::paths()->getPath('[civicrm.private]/log'),
+        ];
+      })
+      ->register('civicrm.l10n', function () {
+        return [
+          'path' => \Civi::paths()->getPath('[civicrm.private]/l10n'),
+        ];
+      });
+  }
+
   /**
    * Standalone's session cannot be initialized until CiviCRM is booted,
    * since it is defined in an extension,
@@ -627,19 +685,7 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base {
     $sess = \CRM_Core_Session::singleton();
     $sess->initialize();
 
-    // We want to apply timezone for this session
-    // However - our implementation relies on checks against standaloneusers
-    // so we need a guard if this is called in install
-    //
-    // Doesn't the session handler started above also need standalonusers?
-    // Yes it does - but we put in some guards further into those functions
-    // to use a fake session instead for this install bit.
-    // Maybe they could get moved up here
-    if (class_exists(\Civi\Standalone\Security::class)) {
-      $sessionTime = $this->getTimeZoneString();
-      date_default_timezone_set($sessionTime);
-      $this->setMySQLTimeZone();
-    }
+    $this->setTimeZone();
   }
 
 }
diff --git a/civicrm/CRM/Utils/System/WordPress.php b/civicrm/CRM/Utils/System/WordPress.php
index a74e338c86d5a7fe0da9e24e891bf4d11a9bc106..1e09f2e0b68df890214ef8d409a4cb389395b28e 100644
--- a/civicrm/CRM/Utils/System/WordPress.php
+++ b/civicrm/CRM/Utils/System/WordPress.php
@@ -728,8 +728,7 @@ class CRM_Utils_System_WordPress extends CRM_Utils_System_Base {
     // Match CiviCRM timezone to WordPress site timezone.
     $wpSiteTimezone = $this->getTimeZoneString();
     if ($wpSiteTimezone) {
-      date_default_timezone_set($wpSiteTimezone);
-      CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone();
+      $this->setTimeZone($wpSiteTimezone);
     }
 
     // Make sure pluggable WordPress functions are available.
diff --git a/civicrm/CRM/Utils/Time.php b/civicrm/CRM/Utils/Time.php
index 419664fbfbf709421f369b835e3dcf7e362d4a1e..4870bafee75b7f0219e75e9ca025d3d358c19274 100644
--- a/civicrm/CRM/Utils/Time.php
+++ b/civicrm/CRM/Utils/Time.php
@@ -200,4 +200,38 @@ class CRM_Utils_Time {
     return (abs($diff) <= $threshold);
   }
 
+  /**
+   * Get timezone offset from a timezone string
+   *
+   * @return string|false|null
+   */
+  public static function getTimeZoneOffsetFromString(string $timezone) {
+    if ($timezone) {
+      if ($timezone == 'UTC' || $timezone == 'Etc/UTC') {
+        // CRM-17072 Let's short-circuit all the zero handling & return it here!
+        return '+00:00';
+      }
+      $tzObj = new DateTimeZone($timezone);
+      $dateTime = new DateTime("now", $tzObj);
+      $tz = $tzObj->getOffset($dateTime);
+
+      if ($tz === 0) {
+        // CRM-21422
+        return '+00:00';
+      }
+
+      if (empty($tz)) {
+        return FALSE;
+      }
+
+      $timeZoneOffset = sprintf("%02d:%02d", $tz / 3600, abs(($tz / 60) % 60));
+
+      if ($timeZoneOffset > 0) {
+        $timeZoneOffset = '+' . $timeZoneOffset;
+      }
+      return $timeZoneOffset;
+    }
+    return NULL;
+  }
+
 }
diff --git a/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php b/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php
index 04359efcf738fce380189dfaa6f38238b30983b9..adc8e9dfdbcb388aa8ac7bb829fe51cd1dc77e19 100644
--- a/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php
+++ b/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php
@@ -48,7 +48,7 @@ trait LocBlockSaveTrait {
         $entityId = $params[$joinField] ?? $locBlock[$joinField] ?? NULL;
         if ($item) {
           $labelField = CoreUtil::getInfoItem($joinEntity, 'label_field');
-          // If NULL was given for the main field (e.g. `email`) then delete the record IF it's not in use
+          // If NULL was given for the required field (e.g. `email`) then delete the record IF it's not in use
           if (!empty($params['id']) && $entityId && $labelField && array_key_exists($labelField, $item) && ($item[$labelField] === NULL || $item[$labelField] === '')) {
             $referenceCount = CoreUtil::getRefCountTotal($joinEntity, $entityId);
             if ($referenceCount <= 1) {
@@ -60,7 +60,8 @@ trait LocBlockSaveTrait {
               ]);
             }
           }
-          else {
+          // Otherwise save if the required field (e.g. `email`) has a value (or no fields are required)
+          elseif (!array_key_exists($labelField, $item) || (isset($item[$labelField]) &&  $item[$labelField] !== '')) {
             $item['contact_id'] = '';
             if ($entityId) {
               $item['id'] = $entityId;
diff --git a/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php b/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php
index adaf6d8ef85cb8ddd6e23168a69c4cd9804850db..7100395f464b4bf3040768764292004c8ec16526 100644
--- a/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php
+++ b/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php
@@ -85,13 +85,14 @@ class HierarchicalEntitySubscriber extends AutoService implements EventSubscribe
       $childCount = count($children) + 1;
       // Maintaining other sort criteria, move children under their parents
       while ($children && $childCount > count($children)) {
-        // This guards against a loop getting "stuck" - if there's no progress after an iteration, abandon the orphaned children
+        // Guard loop against getting "stuck" - if there's no progress after an iteration, abandon the orphaned children
         $childCount = count($children);
         foreach (array_reverse($children, TRUE) as $index => $child) {
           // If the child has more than one parent (Groups entity), just pick the 1st valid one
           foreach ((array) $child[$parentName] as $parentId) {
             if (isset($records[$parentId])) {
-              $child['_depth'] = $records[$parentId]['_depth'] + 1;
+              self::propagateDescendents($records, $parentId, $parentName);
+              $child['_depth'] = ($records[$parentId]['_depth'] ?? 0) + 1;
               $records = self::array_insert_after($records, $parentId, [$child[$idName] => $child]);
               unset($children[$index]);
               break;
@@ -109,12 +110,36 @@ class HierarchicalEntitySubscriber extends AutoService implements EventSubscribe
     }
   }
 
+  /**
+   * Recursively propagates the count of descendents to the parents and parents-of-parents.
+   *
+   * @param array $records
+   *   Reference to the collection of records where propagation is done
+   * @param mixed $parentId
+   *   Identifier of the parent record
+   * @param string $parentName
+   *   Name of the 'parent_id' field
+   *
+   * @return void
+   */
+  private static function propagateDescendents(array &$records, $parentId, $parentName) {
+    $records[$parentId]['_descendents'] ??= 0;
+    $records[$parentId]['_descendents'] += 1;
+    // If the child has more than one parent (Groups entity), just pick the 1st valid one
+    foreach ((array) $records[$parentId][$parentName] as $parentId) {
+      if (isset($records[$parentId])) {
+        self::propagateDescendents($records, $parentId, $parentName);
+        return;
+      }
+    }
+  }
+
   private function applies(Event $event): bool {
     $apiRequest = $event->getApiRequest();
     return $apiRequest['version'] == 4 &&
       is_a($apiRequest, 'Civi\Api4\Generic\AbstractGetAction') &&
       CoreUtil::isType($apiRequest->getEntityName(), 'HierarchicalEntity') &&
-      in_array('_depth', $apiRequest->getSelect(), TRUE);
+      array_intersect(['_depth', '_descendents'], $apiRequest->getSelect());
   }
 
   private function getParentField(string $entityName): array {
diff --git a/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php b/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php
index 9699e2cced3765c341c22427999d60abbdc517aa..90fe7c6864b2056a2903f4fec2f2f5cbb0823c15 100644
--- a/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php
+++ b/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php
@@ -43,11 +43,18 @@ class DAOGetFieldsAction extends BasicGetFieldsAction {
     if ($this->loadOptions) {
       $this->loadFieldOptions($fields, $fieldsToGet ?: array_keys($fields));
     }
+    // Add fields across implicit FK joins
     foreach ($fieldsToGet ?? [] as $fieldName) {
       if (empty($fields[$fieldName]) && str_contains($fieldName, '.')) {
         $fkField = $this->getFkFieldSpec($fieldName, $fields);
         if ($fkField) {
+          $fieldPrefix = substr($fieldName, 0, 0 - strlen($fkField['name']));
           $fkField['name'] = $fieldName;
+          // Control field should get the same prefix as it belongs to the new entity now
+          if (!empty($fkField['input_attrs']['control_field'])) {
+            $fkField['input_attrs']['control_field'] = $fieldPrefix . $fkField['input_attrs']['control_field'];
+          }
+          $fkField['required'] = FALSE;
           $fields[] = $fkField;
         }
       }
@@ -69,7 +76,7 @@ class DAOGetFieldsAction extends BasicGetFieldsAction {
    * @return array|null
    * @throws \CRM_Core_Exception
    */
-  private function getFkFieldSpec($fieldName, $fields) {
+  private function getFkFieldSpec(string $fieldName, array $fields): ?array {
     $fieldPath = explode('.', $fieldName);
     // Search for the first segment alone plus the first and second
     // No field in the schema contains more than one dot in its name.
@@ -81,9 +88,11 @@ class DAOGetFieldsAction extends BasicGetFieldsAction {
         'checkPermissions' => $this->checkPermissions,
         'where' => [['name', '=', $newFieldName]],
         'loadOptions' => $this->loadOptions,
+        'values' => FormattingUtil::filterByPath($this->values, $fieldName, $newFieldName),
         'action' => $this->action,
       ])->first();
     }
+    return NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php b/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php
index dedfa9d54a08a4ebbe7008c90257f0fd690cba93..b44649e9b4ed2961fc4796934cddec5955db0ddb 100644
--- a/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php
+++ b/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php
@@ -229,6 +229,16 @@ trait SavedSearchInspectorTrait {
       return FALSE;
     }
 
+    // If this is an implicit join, use the parent field
+    if (str_ends_with($fieldPath, '.' . $field['name'])) {
+      $baseFieldPath = substr($fieldPath, 0, -strlen('.' . $field['name']));
+      $baseField = $this->getField($baseFieldPath);
+      if ($baseField) {
+        $fieldPath = $baseFieldPath;
+        $field = $baseField;
+      }
+    }
+
     // If the entity this column belongs to is being grouped by id, then also no
     $idField = substr($fieldPath, 0, 0 - strlen($field['name'])) . CoreUtil::getIdFieldName($field['entity']);
     return !in_array($idField, $apiParams['groupBy']);
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php
index 2ed009b107a3fefda60dd048a3dcf78f8e35b95c..6257be507230bca01c16ce81dfeec214a9823a90 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php
@@ -14,6 +14,7 @@ namespace Civi\Api4\Service\Spec\Provider;
 
 use Civi\Api4\Service\Spec\FieldSpec;
 use Civi\Api4\Service\Spec\RequestSpec;
+use Civi\Api4\Service\Spec\SpecFormatter;
 use Civi\Api4\Utils\CoreUtil;
 use Civi\Api4\Utils\FormattingUtil;
 use Civi\Test\Invasive;
@@ -163,8 +164,8 @@ class DAOFieldsCallbackAdapterSpecProvider extends \Civi\Core\Service\AutoServic
     if (in_array($inputType, ['Select', 'EntityRef'], TRUE) && !empty($data['serialize'])) {
       $inputAttrs['multiple'] = TRUE;
     }
-    if ($inputType == 'Date' && !empty($inputAttrs['formatType'])) {
-      self::setLegacyDateFormat($inputAttrs);
+    if ($inputType == 'Date' && !empty($inputAttrs['format_type'])) {
+      SpecFormatter::setLegacyDateFormat($inputAttrs);
     }
     // Number input for numeric fields
     if ($inputType === 'Text' && in_array($dataTypeName, ['Integer', 'Float'], TRUE)) {
@@ -197,23 +198,6 @@ class DAOFieldsCallbackAdapterSpecProvider extends \Civi\Core\Service\AutoServic
       ->setInputAttrs($inputAttrs);
   }
 
-  /**
-   * @param array $inputAttrs
-   */
-  private static function setLegacyDateFormat(&$inputAttrs) {
-    if (empty(\Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']])) {
-      \Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']] = [];
-      $params = ['name' => $inputAttrs['formatType']];
-      \CRM_Core_DAO::commonRetrieve('CRM_Core_DAO_PreferencesDate', $params, \Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']]);
-    }
-    $dateFormat = \Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']];
-    unset($inputAttrs['formatType']);
-    $inputAttrs['time'] = !empty($dateFormat['time_format']);
-    $inputAttrs['date'] = TRUE;
-    $inputAttrs['start_date_years'] = (int) $dateFormat['start'];
-    $inputAttrs['end_date_years'] = (int) $dateFormat['end'];
-  }
-
   /**
    * @inheritDoc
    */
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php
index 2ea8712b2eaa38fe2f709ddd858adc6ec24f2d36..e56a2b3d66eae2230334fbaedf9fa593542086f8 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php
@@ -22,8 +22,7 @@ use Civi\Api4\Utils\CoreUtil;
 class HierarchicalEntitySpecProvider extends \Civi\Core\Service\AutoService implements Generic\SpecProviderInterface {
 
   /**
-   * Generic create spec function applies to all SortableEntity types.
-   * Disables required 'weight' field because that's auto-managed.
+   * Generic create spec function applies to all HierarchicalEntity types.
    *
    * @param \Civi\Api4\Service\Spec\RequestSpec $spec
    */
@@ -36,7 +35,18 @@ class HierarchicalEntitySpecProvider extends \Civi\Core\Service\AutoService impl
       ->setDescription(ts('Depth in the nested hierarchy'))
       ->setType('Extra')
       ->setReadonly(TRUE)
-      ->setSqlRenderer([__CLASS__, 'getDepth']);
+      ->setSqlRenderer([__CLASS__, 'getZero']);
+    $spec->addFieldSpec($field);
+
+    $field = new FieldSpec('_descendents', $spec->getEntity(), 'Integer');
+    $field->setLabel(ts('Descendents'))
+      ->setTitle(ts('Descendents'))
+      ->setColumnName('id')
+      ->setInputType('Number')
+      ->setDescription(ts('Number of descendents in the nested hierarchy'))
+      ->setType('Extra')
+      ->setReadonly(TRUE)
+      ->setSqlRenderer([__CLASS__, 'getZero']);
     $spec->addFieldSpec($field);
   }
 
@@ -48,11 +58,11 @@ class HierarchicalEntitySpecProvider extends \Civi\Core\Service\AutoService impl
   }
 
   /**
-   * Generate SQL for _depth field
+   * Generate SQL for default value of _depth & _descendents fields
    * @param array $field
    * @return string
    */
-  public static function getDepth(array $field): string {
+  public static function getZero(array $field): string {
     return "0";
   }
 
diff --git a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
index f2dbbb533f25dca7bfb32ec6a067dd7d43a80de1..a9e31fc4b8f5b93b92783d6925ef2e55827117ec 100644
--- a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
+++ b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
@@ -168,7 +168,7 @@ class SpecFormatter {
   /**
    * @param array $inputAttrs
    */
-  private static function setLegacyDateFormat(&$inputAttrs) {
+  public static function setLegacyDateFormat(&$inputAttrs) {
     if (empty(\Civi::$statics['legacyDatePrefs'][$inputAttrs['format_type']])) {
       \Civi::$statics['legacyDatePrefs'][$inputAttrs['format_type']] = [];
       $params = ['name' => $inputAttrs['format_type']];
diff --git a/civicrm/Civi/Api4/Utils/FormattingUtil.php b/civicrm/Civi/Api4/Utils/FormattingUtil.php
index d469f524cd0ef8edb4732665e0421eb38aa5202e..3ae8535cac4dccb4fb9d8b4493ea0953d8d64ba0 100644
--- a/civicrm/Civi/Api4/Utils/FormattingUtil.php
+++ b/civicrm/Civi/Api4/Utils/FormattingUtil.php
@@ -128,7 +128,19 @@ class FormattingUtil {
 
     switch ($fieldSpec['data_type'] ?? NULL) {
       case 'Timestamp':
-        $value = self::formatDateValue('YmdHis', $value, $operator, $index);
+        $format = 'YmdHis';
+        // Using `=` with a Y-m-d timestamp means we really want `BETWEEN` midnight and 11:59:59pm.
+        if ($operator && is_string($value) && !array_key_exists($value, \CRM_Core_OptionGroup::values('relative_date_filters'))) {
+          $isYmd = (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value));
+          if ($isYmd && in_array($operator, ['=', '!=', '<>'])) {
+            $operator = $operator === '=' ? 'BETWEEN' : 'NOT BETWEEN';
+            $dateFrom = self::formatDateValue($format, "$value 00:00:00");
+            $dateTo = self::formatDateValue($format, "$value 23:59:59");
+            $value = [self::formatDateValue($format, $dateFrom), self::formatDateValue($format, $dateTo)];
+            break;
+          }
+        }
+        $value = self::formatDateValue($format, $value, $operator, $index);
         break;
 
       case 'Date':
@@ -278,7 +290,7 @@ class FormattingUtil {
    * @return void
    * @throws \CRM_Core_Exception
    */
-  public static function getFieldOptions(array &$field, array $values = [], bool $includeDisabled = FALSE, bool $checkPermissions = FALSE, ?int $userId = NULL): ?array {
+  public static function getFieldOptions(array $field, array $values = [], bool $includeDisabled = FALSE, bool $checkPermissions = FALSE, ?int $userId = NULL): ?array {
     $fieldName = $field['name'];
     $entityName = $field['entity'];
     $customGroupName = CoreUtil::getCustomGroupName($entityName);
diff --git a/civicrm/Civi/Core/SettingsManager.php b/civicrm/Civi/Core/SettingsManager.php
index 3b186624d744b3f220ef65090d40e4f5e0fbd23b..47d028b73b4ead53fccfc412d5df669ff7a71c1c 100644
--- a/civicrm/Civi/Core/SettingsManager.php
+++ b/civicrm/Civi/Core/SettingsManager.php
@@ -461,9 +461,11 @@ class SettingsManager {
     // file in order to:
     // a) ensure the env values take precedence over define('CIVICRM_DSN'...) in the settings file
     // b) provide the right source value for CIVICRM_LOGGING_DSN (set from CIVICRM_DSN in the settings file template)
-    $composedDsn = $bootSettingsManager->getBagByDomain(NULL)->get('civicrm_db_dsn');
-    if ($composedDsn) {
-      define('CIVICRM_DSN', $composedDsn);
+    if (!defined('CIVICRM_DSN')) {
+      $composedDsn = $bootSettingsManager->getBagByDomain(NULL)->get('civicrm_db_dsn');
+      if ($composedDsn) {
+        define('CIVICRM_DSN', $composedDsn);
+      }
     }
 
     if (file_exists($settingsPath)) {
@@ -485,6 +487,13 @@ class SettingsManager {
       // TODO: should we complain here if there are inconsistent defines
       // from elsewhere?
     }
+
+    // if in doubt, the root of civicrm-core is 3 steps
+    // up from this file
+    global $civicrm_root;
+    if (!$civicrm_root) {
+      $civicrm_root = dirname(__FILE__, 3) . DIRECTORY_SEPARATOR;
+    }
   }
 
 }
diff --git a/civicrm/Civi/Schema/LegacySqlEntityMetadata.php b/civicrm/Civi/Schema/LegacySqlEntityMetadata.php
index dce317fab0c53cc226384496a2efa1d815a33595..de55264879f28f8e0d503428abb051201c91f306 100644
--- a/civicrm/Civi/Schema/LegacySqlEntityMetadata.php
+++ b/civicrm/Civi/Schema/LegacySqlEntityMetadata.php
@@ -170,6 +170,9 @@ class LegacySqlEntityMetadata extends EntityMetadataBase {
       case \CRM_Utils_Type::T_DATE + \CRM_Utils_Type::T_TIME:
         return 'datetime';
 
+      case \CRM_Utils_Type::T_TIME:
+        return 'time';
+
       default:
         throw new \CRM_Core_Exception('Unknown field type for ' . $legacyField['name']);
     }
diff --git a/civicrm/Civi/Test/Api4TestTrait.php b/civicrm/Civi/Test/Api4TestTrait.php
index 4e210b5f87dcd9389e272262e64ed84556fc2946..17a9adbefb269e5536519494a88e8c930dd7a7aa 100644
--- a/civicrm/Civi/Test/Api4TestTrait.php
+++ b/civicrm/Civi/Test/Api4TestTrait.php
@@ -47,6 +47,25 @@ trait Api4TestTrait {
     return $this->saveTestRecords($entityName, ['records' => [$values]])->single();
   }
 
+  /**
+   * @param string $entityName
+   * @param array|string|int $idOrFilters
+   *   Either the entity id or filters like ['name' => 'foo']
+   * @return array
+   * @throws \CRM_Core_Exception
+   */
+  public function getTestRecord(string $entityName, $idOrFilters): array {
+    if (!is_array($idOrFilters)) {
+      $idField = CoreUtil::getIdFieldName($entityName);
+      $idOrFilters = [$idField => $idOrFilters];
+    }
+    $where = [];
+    foreach ($idOrFilters as $key => $value) {
+      $where[] = [$key, '=', $value];
+    }
+    return civicrm_api4($entityName, 'get', ['where' => $where])->single();
+  }
+
   /**
    * Saves one or more test records, supplying default values.
    *
diff --git a/civicrm/Civi/Test/EventTestTrait.php b/civicrm/Civi/Test/EventTestTrait.php
index 439cd5488718569a994de567d126888a90bc11a6..0ba3b94a2459e86f12aa50110fd8d575e26442b5 100644
--- a/civicrm/Civi/Test/EventTestTrait.php
+++ b/civicrm/Civi/Test/EventTestTrait.php
@@ -115,6 +115,23 @@ trait EventTestTrait {
     return $this->eventCreate($eventParameters, $identifier);
   }
 
+  /**
+   * Update an event.
+   *
+   * @param array $eventParameters
+   *   Values to
+   *
+   * @param string $identifier
+   *   Index for storing event ID in ids array.
+   *
+   */
+  protected function updateEvent(array $eventParameters = [], string $identifier = 'event'): void {
+    Event::update(FALSE)
+      ->addWhere('id', '=', $this->getEventID($identifier))
+      ->setValues($eventParameters)
+      ->execute();
+  }
+
   /**
    * Get the event id of the event created in set up.
    *
@@ -243,7 +260,6 @@ trait EventTestTrait {
     $profiles = [
       ['name' => '_pre', 'title' => 'Event Pre Profile', 'weight' => 1, 'fields' => ['email']],
       ['name' => '_post', 'title' => 'Event Post Profile', 'weight' => 2, 'fields' => ['first_name', 'last_name']],
-      ['name' => '_post_post', 'title' => 'Event Post Post Profile', 'weight' => 3, 'fields' => ['job_title']],
     ];
     foreach ($profiles as $profile) {
       $this->createEventProfile($profile, $identifier);
@@ -251,6 +267,21 @@ trait EventTestTrait {
         $this->createEventProfile($profile, $identifier, TRUE);
       }
     }
+    $sharedProfile = ['name' => '_post_post', 'title' => 'Event Post Post Profile', 'weight' => 3, 'fields' => ['job_title']];
+    $this->createEventProfile($sharedProfile, $identifier);
+    if ($this->getEventValue('is_multiple_registrations', $identifier)) {
+      // For this one use the same profile but 2 UFJoins - to provide variation.
+      // e.g. we hit a bug where behaviour was different if the profiles for
+      // additional were the same uf group or different ones.
+      $profileName = $identifier . '_post_post';
+      $this->setTestEntity('UFJoin', UFJoin::create(FALSE)->setValues([
+        'module' => 'CiviEvent_Additional',
+        'entity_table' => 'civicrm_event',
+        'uf_group_id:name' => $profileName,
+        'weight' => $profile['weight'],
+        'entity_id' => $this->getEventID($identifier),
+      ])->execute()->first(), $profileName . '_' . $identifier);
+    }
   }
 
   /**
diff --git a/civicrm/Civi/Test/MinkBase.php b/civicrm/Civi/Test/MinkBase.php
index c5d3a391edfafbb2116daaaf9005e9cfb65904c6..e988bc40861cbef1f180c5e673b223a715590d7d 100644
--- a/civicrm/Civi/Test/MinkBase.php
+++ b/civicrm/Civi/Test/MinkBase.php
@@ -44,7 +44,8 @@ abstract class MinkBase extends \CiviEndToEndTestCase {
       'sub' => 'cid:' . $this->getUserId($user),
       'scope' => 'authx',
     ]);
-    $loginUrl = Civi::url('backend://civicrm/authx/login')->addQuery([
+    // The use of frontend:// or backend:// is abstract on some env's. For WP, only 'frontend' supports auth
+    $loginUrl = Civi::url('frontend://civicrm/authx/login')->addQuery([
       '_authx' => 'Bearer ' . $tok,
       '_authxSes' => 1,
     ]);
diff --git a/civicrm/Civi/Token/TokenRow.php b/civicrm/Civi/Token/TokenRow.php
index 7c22f92f34929fc2fa9496e8eb386b3416188b9d..bdeaa13a726bd6424a80f3e53fe49555be0d90e7 100644
--- a/civicrm/Civi/Token/TokenRow.php
+++ b/civicrm/Civi/Token/TokenRow.php
@@ -144,31 +144,35 @@ class TokenRow {
   /**
    * Update the value of a token.
    *
-   * If you are reading this it probably means you can't follow this function.
+   * Eileen said: If you are reading this it probably means you can't follow this function.
    * Don't worry - I've stared at it & all I see is a bunch of letters. However,
    * the answer to your problem is almost certainly that you are passing in null
    * rather than an empty string for 'c'.
+   * MJW said: I've renamed the bunch of letters so they might be a bit more meaningful.
+   * Also, I don't think this function should ever be called without $tokenField being set
+   * but tests do call it like that.
+   *
+   * @param string|array $tokenEntity
+   * @param string|array $tokenField
+   * @param string|array $tokenValue
    *
-   * @param string|array $a
-   * @param string|array $b
-   * @param mixed $c
    * @return TokenRow
    */
-  public function tokens($a = NULL, $b = NULL, $c = NULL) {
-    if (is_array($a)) {
-      \CRM_Utils_Array::extend($this->tokens, $a);
+  public function tokens($tokenEntity, $tokenField = NULL, $tokenValue = NULL): TokenRow {
+    if (is_array($tokenEntity)) {
+      \CRM_Utils_Array::extend($this->tokens, $tokenEntity);
     }
-    elseif (is_array($b)) {
-      \CRM_Utils_Array::extend($this->tokens[$a], $b);
+    elseif (is_array($tokenField)) {
+      \CRM_Utils_Array::extend($this->tokens[$tokenEntity], $tokenField);
     }
-    elseif (is_array($c)) {
-      \CRM_Utils_Array::extend($this->tokens[$a][$b], $c);
+    elseif (is_array($tokenValue)) {
+      \CRM_Utils_Array::extend($this->tokens[$tokenEntity][$tokenField], $tokenValue);
     }
-    elseif ($c === NULL) {
-      $this->tokens[$a] = $b;
+    elseif ($tokenValue === NULL) {
+      $this->tokens[$tokenEntity] = $tokenField;
     }
     else {
-      $this->tokens[$a][$b] = $c;
+      $this->tokens[$tokenEntity][$tokenField] = $tokenValue;
     }
     return $this;
   }
diff --git a/civicrm/ang/api4Explorer/Explorer.js b/civicrm/ang/api4Explorer/Explorer.js
index 46f5fabd0a5376cf41d392561ddead7b2b8c75dc..c82ca1094759706d463e4930c74cd990cd3d0df7 100644
--- a/civicrm/ang/api4Explorer/Explorer.js
+++ b/civicrm/ang/api4Explorer/Explorer.js
@@ -1065,6 +1065,7 @@
 
     // Format string to be cli-input-safe
     function cliFormat(str) {
+      str = str.replace(/\b(true|false)\b/g, match => match === "true" ? '1' : '0');
       if (!_.includes(str, ' ') && !_.includes(str, '"') && !_.includes(str, "'")) {
         return str;
       }
diff --git a/civicrm/api/api.php b/civicrm/api/api.php
index 64b9caad7166ea2fb33190063236bbff1cfe3a67..3356885f8cc3fa8ae82150f36ee4ad588f62ebba 100644
--- a/civicrm/api/api.php
+++ b/civicrm/api/api.php
@@ -54,13 +54,24 @@ function civicrm_api(string $entity, string $action, array $params) {
  *   automatically reformat the array, depending on the variable type passed:
  *   - **Integer:** return a single result array;
  *     e.g. `$index = 0` will return the first result, 1 will return the second, and -1 will return the last.
+ *
+ *     For APIv4 Explorer, use e.g. `0` in the Index box.
+ *
  *   - **String:** index the results by a field value;
  *     e.g. `$index = "name"` will return an associative array with the field 'name' as keys.
+ *
+ *     For APIv4 Explorer, use e.g. `name` in the Index box.
+ *
  *   - **Non-associative array:** return a single value from each result;
  *     e.g. `$index = ['title']` will return a non-associative array of strings - the 'title' field from each result.
+ *
+ *     For APIv4 Explorer, use e.g. `[title]` in the Index box.
+ *
  *   - **Associative array:** a combination of the previous two modes;
  *     e.g. `$index = ['name' => 'title']` will return an array of strings - the 'title' field keyed by the 'name' field.
  *
+ *     For APIv4 Explorer, use e.g. `{name: title}` in the Index box.
+ *
  * @return \Civi\Api4\Generic\Result
  * @throws \CRM_Core_Exception
  * @throws \Civi\API\Exception\NotImplementedException
diff --git a/civicrm/api/v3/Setting.php b/civicrm/api/v3/Setting.php
index 605ae2734df879eb82a1058b3b60dd1ca9353432..341adc7f510abcbe32d6e36e1b5fc6d6b898106b 100644
--- a/civicrm/api/v3/Setting.php
+++ b/civicrm/api/v3/Setting.php
@@ -152,20 +152,32 @@ function civicrm_api3_setting_getoptions($params) {
  */
 function civicrm_api3_setting_revert($params) {
   $defaults = civicrm_api('Setting', 'getdefaults', $params);
-  $fields = civicrm_api('Setting', 'getfields', $params);
-  $fields = $fields['values'];
+  $allSettings = civicrm_api('Setting', 'getfields', $params)['values'] ?? [];
+  // constant settings can't be set through the API, so can't be reverted
+  // so we must filter them out here
+  $revertable = array_filter($allSettings, function ($settingMeta) {
+    return !($settingMeta['is_constant'] ?? FALSE);
+  });
   $domains = _civicrm_api3_setting_getDomainArray($params);
   $result = [];
+  $isError = FALSE;
   foreach ($domains as $domainID) {
-    $valuesToRevert = array_intersect_key($defaults['values'][$domainID], $fields);
+    $valuesToRevert = array_intersect_key($defaults['values'][$domainID], $revertable);
     if (!empty($valuesToRevert)) {
       $valuesToRevert['version'] = $params['version'];
       $valuesToRevert['domain_id'] = $domainID;
       // note that I haven't looked at how the result would appear with multiple domains in play
       $result = array_merge($result, civicrm_api('Setting', 'create', $valuesToRevert));
+      if ($result['is_error'] ?? FALSE) {
+        $isError = TRUE;
+      }
     }
   }
 
+  if ($isError) {
+    return civicrm_api3_create_error('Error reverting settings');
+  }
+
   return civicrm_api3_create_success($result, $params, 'Setting', 'revert');
 }
 
diff --git a/civicrm/civicrm-version.php b/civicrm/civicrm-version.php
index 0896fab4bb0d457f6e7f07348f32c09cb26fb28d..9f44a15f2eb17e6287402b074be743eebfed13f7 100644
--- a/civicrm/civicrm-version.php
+++ b/civicrm/civicrm-version.php
@@ -1,7 +1,7 @@
 <?php
 /** @deprecated */
 function civicrmVersion( ) {
-  return array( 'version'  => '5.79.1',
+  return array( 'version'  => '5.80.0',
                 'cms'      => 'Wordpress',
                 'revision' => '' );
 }
diff --git a/civicrm/composer.json b/civicrm/composer.json
index d603c5f049a08eb44581621c0daf81cae3d620bd..76d368c35a2a0509bfe281b7ae333ae98e921551 100644
--- a/civicrm/composer.json
+++ b/civicrm/composer.json
@@ -99,7 +99,7 @@
     "civicrm/composer-compile-lib": "~0.6 || ~1.0",
     "ext-json": "*",
     "ezyang/htmlpurifier": "^4.13",
-    "phpoffice/phpspreadsheet": "^1.18",
+    "phpoffice/phpspreadsheet": "^1.18 || ^2",
     "symfony/polyfill-php80": "^1.0",
     "symfony/polyfill-php81": "^1.0",
     "symfony/polyfill-php82": "^1.0",
diff --git a/civicrm/composer.lock b/civicrm/composer.lock
index be7b1ffa2495c7cf8b1ca1fa62f83c58c865fdb4..cbbeed882e99b2b21fd9bb02b2ddb4ac2cc484c0 100644
--- a/civicrm/composer.lock
+++ b/civicrm/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "21b4d53ec38067948395139db45d6d6b",
+    "content-hash": "f73f8f713bb0cba7736793e45c0bdb2c",
     "packages": [
         {
             "name": "adrienrn/php-mimetyper",
@@ -2718,16 +2718,16 @@
         },
         {
             "name": "phpoffice/phpspreadsheet",
-            "version": "1.29.2",
+            "version": "1.29.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
-                "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f"
+                "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f",
-                "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/7ca7e325dca3adb6a598385aab81f527b8d6c75d",
+                "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d",
                 "shasum": ""
             },
             "require": {
@@ -2817,9 +2817,9 @@
             ],
             "support": {
                 "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
-                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.2"
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.4"
             },
-            "time": "2024-09-29T07:04:47+00:00"
+            "time": "2024-11-10T16:26:22+00:00"
         },
         {
             "name": "phpoffice/phpword",
diff --git a/civicrm/css/civicrm.css b/civicrm/css/civicrm.css
index c6d6b7f657621efe6bdf8839e406f78272e52159..89dd5a720c7e80d3c8960d4bc992a28a91dbe89d 100644
--- a/civicrm/css/civicrm.css
+++ b/civicrm/css/civicrm.css
@@ -2290,6 +2290,14 @@ div.crm-master-accordion-header a.helpicon {
   display: none;
 }
 
+/* Ex: Advanced Search (but not limited to) */
+.crm-container details.crm-accordion-settings summary {
+  text-align: right;
+}
+.crm-container details.crm-accordion-settings summary::before {
+  content: '\f013';
+}
+
 .crm-container details details {
   padding: 0 0.25rem; /* adds padding for nested accordions */
 }
@@ -2311,7 +2319,7 @@ div.crm-master-accordion-header a.helpicon {
 .crm-container details > summary:before {
   font-family: "FontAwesome";
   display: inline-block;
-  width: 1em;
+  padding-right: 0.5rem;
   content: "\f0da";
   font-size: 13px;
 }
diff --git a/civicrm/css/searchForm.css b/civicrm/css/searchForm.css
index 8beb3a631b9454769335ac1485cca72313788770..0d319e79ea69f0ce6387115de29529c61617e04e 100644
--- a/civicrm/css/searchForm.css
+++ b/civicrm/css/searchForm.css
@@ -63,10 +63,13 @@
   font-weight: bold;
 }
 
-.advanced-search-fields {
-  display: grid;
-  grid-template-columns: [col] repeat(3, calc(100% / 3 - 10px));
-  width: 100%;
+@media (min-width: 480px) {
+  .advanced-search-fields {
+    display: grid;
+    grid-template-columns: [col] repeat(3, 1fr);
+    gap: 10px;
+    width: 100%;
+  }
 }
 
 .advanced-search-fields .search-field {
diff --git a/civicrm/deleted-files-list.json b/civicrm/deleted-files-list.json
index 50dac0db10253cda50571248c29a3c2a017342b9..c436bf69e6ceac0aa3d6c0169a6715b5f9c25685 100644
--- a/civicrm/deleted-files-list.json
+++ b/civicrm/deleted-files-list.json
@@ -208,7 +208,8 @@
     "CRM/Upgrade/4.7.14.msg_template/*",
     "CRM/Upgrade/4.7.19.msg_template/*",
     "CRM/Upgrade/4.7.22.msg_template/*",
-    "CRM/Upgrade/4.7.23.msg_template/*",
+    "CRM/Upgrade/4.7.23.msg_template/civicrm_msg_template.tpl",
+    "CRM/Upgrade/4.7.23.msg_template/message_templates/*",
     "CRM/Upgrade/4.7.4.msg_template/*",
     "CRM/Upgrade/4.7.5.msg_template/*",
     "CRM/Upgrade/4.7.alpha1.msg_template/*",
@@ -665,7 +666,14 @@
     "css/menu-leaf.png",
     "css/navigation.css",
     "distmaker/core-ext.txt",
+    "distmaker/dists/backdrop_php5.sh",
     "distmaker/dists/drupal6_php5.sh",
+    "distmaker/dists/drupal7_dir_php5.sh",
+    "distmaker/dists/drupal_php5.sh",
+    "distmaker/dists/drupal_sk_php5.sh",
+    "distmaker/dists/joomla5_php.sh",
+    "distmaker/dists/joomla_php5.sh",
+    "distmaker/dists/wordpress_php5.sh",
     "docs/*",
     "ext/afform/CRM/*",
     "ext/afform/Civi/*",
@@ -953,6 +961,22 @@
     "ext/oembed/templates/oembed-basic-page.tpl",
     "ext/payflowpro/images/*",
     "ext/recaptcha/xml/*",
+    "ext/riverlea/core/css/_bootstrap3.css",
+    "ext/riverlea/core/org.civicrm.afform_core-ang/*",
+    "ext/riverlea/fa/*",
+    "ext/riverlea/fonts/InterDisplay-Italic.woff2",
+    "ext/riverlea/fonts/InterDisplay-Regular.woff2",
+    "ext/riverlea/fonts/InterDisplay-SemiBold.woff2",
+    "ext/riverlea/js/*",
+    "ext/riverlea/streams/empty/css/civicrm.css",
+    "ext/riverlea/streams/hackneybrook/css/civicrm.css",
+    "ext/riverlea/streams/minetta/css/civicrm.css",
+    "ext/riverlea/streams/thames/README.md",
+    "ext/riverlea/streams/thames/css/aah",
+    "ext/riverlea/streams/thames/fonts/*",
+    "ext/riverlea/streams/walbrook/css/_fonts.css",
+    "ext/riverlea/streams/walbrook/fonts/*",
+    "ext/riverlea/streams/wellow/*",
     "ext/search/*",
     "ext/search_kit/CRM/Search/Upgrader/*",
     "ext/search_kit/Civi/Api4/Action/SearchDisplay/SavedSearchInspectorTrait.php",
@@ -974,6 +998,7 @@
     "ext/search_kit/ang/crmSearchTasks/crmSearchTaskProcess.html",
     "ext/search_kit/ang/crmSearchTasks/crmSearchTasks.component.js",
     "ext/search_kit/ang/crmSearchTasks/crmSearchTasks.html",
+    "ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html",
     "ext/search_kit/css/crmSearchActions.css",
     "ext/search_kit/sql/*",
     "ext/search_kit/xml/schema/*",
@@ -1205,6 +1230,7 @@
     "schema/Mailing/Event/*",
     "settings/Directory.setting.php",
     "settings/Extension.setting.php",
+    "settings/System.boot.setting.php",
     "settings/Url.setting.php",
     "setup/res/civicrm.config.php.standalone.txt",
     "setup/res/error.html",
@@ -1271,6 +1297,7 @@
     "templates/CRM/Case/Form/Task/SearchTaskHookSample.tpl",
     "templates/CRM/Contact/Form/Edit/Address/CustomField.tpl",
     "templates/CRM/Contact/Form/ProfileContact.tpl",
+    "templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl",
     "templates/CRM/Contact/Form/Search/Criteria/Recurringcontribution.tpl",
     "templates/CRM/Contact/Form/Search/Custom.tpl",
     "templates/CRM/Contact/Form/Search/Custom/*",
diff --git a/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js b/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js
index 58759986a149f618115180ce7976689a6a9484bf..c3be348d0f310671aeb54047875a733bcf4ebfb2 100644
--- a/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js
+++ b/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js
@@ -6,17 +6,21 @@
     templateUrl: '~/afGuiEditor/afGuiEditOptions.html',
     require: {field: '^^afGuiField'},
     controller: function($scope) {
-      var ts = $scope.ts = CRM.ts('org.civicrm.afform_admin'),
-        ctrl = this;
+      const ts = $scope.ts = CRM.ts('org.civicrm.afform_admin');
+      const ctrl = this;
 
       this.$onInit = function() {
+        // Currently defined field options (either customized or original)
         $scope.options = JSON.parse(angular.toJson(ctrl.field.getOptions()));
-        var optionKeys = _.map($scope.options, 'id');
-        $scope.deletedOptions = _.filter(JSON.parse(angular.toJson(ctrl.field.getDefn().options || [])), function (item) {
-          return !_.contains(optionKeys, item.id);
-        });
-        $scope.originalLabels = _.transform(ctrl.field.getDefn().options || [], function (originalLabels, item) {
+        const optionKeys = $scope.options.map(option => option.id);
+        // Original options
+        const originalOptions = JSON.parse(angular.toJson(ctrl.field.getDefn().options || []));
+        // Original options that are not in the current set (if customized)
+        $scope.deletedOptions = originalOptions.filter(item => !optionKeys.includes(item.id));
+        // Deleted options have no label so fetch original
+        $scope.originalLabels = (ctrl.field.getDefn().options || []).reduce((originalLabels, item) => {
           originalLabels[item.id] = item.label;
+          return originalLabels;
         }, {});
       };
 
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php
index a18619fa6fce7f6bcfa7e73508112cb702b02bda..417ace07086258307ebb54a084a8e8a9b89b229e 100644
--- a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php
@@ -593,11 +593,12 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction {
     $entityValues = [];
     foreach ($this->_formDataModel->getEntities() as $entityName => $entity) {
       $entityValues[$entityName] = [];
-      $fileFields = $this->getFileFields($entity['type'], $entity['fields']);
       // Gather submitted field values from $values['fields'] and sub-entities from $values['joins']
+      $submittableFields = $this->getSubmittableFields($entity['fields']);
+      $fileFields = $this->getFileFields($entity['type'], $submittableFields);
       foreach ($submittedValues[$entityName] ?? [] as $values) {
         // Only accept values from fields on the form
-        $values['fields'] = array_intersect_key($values['fields'] ?? [], $entity['fields']);
+        $values['fields'] = array_intersect_key($values['fields'] ?? [], $submittableFields);
         // Unset prefilled file fields
         foreach ($fileFields as $fileFieldName) {
           if (isset($values['fields'][$fileFieldName]) && is_array($values['fields'][$fileFieldName])) {
@@ -616,7 +617,7 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction {
         foreach ($values['joins'] as $joinEntity => &$joinValues) {
           // Only accept values from join fields on the form
           $idField = CoreUtil::getIdFieldName($joinEntity);
-          $allowedFields = $entity['joins'][$joinEntity]['fields'] ?? [];
+          $allowedFields = $this->getSubmittableFields($entity['joins'][$joinEntity]['fields'] ?? []);
           $allowedFields[$idField] = TRUE;
           $fileFields = $this->getFileFields($joinEntity, $allowedFields);
           // Enforce the limit set by join[max]
@@ -662,6 +663,13 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction {
     return $entityValues;
   }
 
+  protected function getSubmittableFields(array $fields): array {
+    return array_filter($fields, function ($field) {
+      $inputType = $field['defn']['input_type'] ?? NULL;
+      return $inputType !== 'DisplayOnly';
+    });
+  }
+
   /**
    * Process form data
    */
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php
index 11fee493392ebbfba8e5b2f5323901834807d46e..4315e35d5e4cf0de0a44346f43bb724a24eb170f 100644
--- a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php
@@ -460,8 +460,8 @@ class Submit extends AbstractProcessor {
       // Forward FK e.g. Event.loc_block_id => LocBlock
       $forwardFkField = self::getFkField($mainEntity['type'], $joinEntityName);
       if ($forwardFkField && $values) {
-        // Add id to values for update op
-        if ($whereClause) {
+        // Add id to values for update op, but only if id is not already on the form
+        if ($whereClause && empty($mainEntity['joins'][$joinEntityName]['fields'][$joinIdField])) {
           $values[0][$joinIdField] = $whereClause[0][2];
         }
         $result = civicrm_api4($joinEntityName, 'save', [
diff --git a/civicrm/ext/afform/core/ang/af/afButton.directive.js b/civicrm/ext/afform/core/ang/af/afButton.directive.js
new file mode 100644
index 0000000000000000000000000000000000000000..03f487fa70202b6adbca28587365b31e663ac75e
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/afButton.directive.js
@@ -0,0 +1,38 @@
+(function(angular, $, _) {
+  "use strict";
+  angular.module('af').directive('afButton', function() {
+    return {
+      restrict: 'C',
+      bindToController: {
+        type: '@'
+      },
+      require: {
+        afForm: '?^^afForm',
+      },
+      controller: function($scope, $element) {
+        const ctrl = this;
+
+        this.$onInit = function () {
+          const type = $element.attr('type');
+
+          // Pass off handling of reset button to appropriate controllers
+          if (type === 'reset') {
+            $element.on('click', function(e) {
+              e.preventDefault();
+              $scope.$apply(function() {
+                // Reset submission form
+                if (ctrl.afForm) {
+                  ctrl.afForm.resetForm();
+                }
+                // Reset search form
+                else {
+                  $scope.$parent.$broadcast('afFormReset');
+                }
+              });
+            });
+          }
+        };
+      }
+    };
+  });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/afField.component.js b/civicrm/ext/afform/core/ang/af/afField.component.js
index 0bd1820170c63e25cdbd70c7aeb3d6b60d31af31..8093740b870f7d36f9e6699c379ac0bd5c5060c7 100644
--- a/civicrm/ext/afform/core/ang/af/afField.component.js
+++ b/civicrm/ext/afform/core/ang/af/afField.component.js
@@ -30,6 +30,10 @@
 
         $element.addClass('af-field-type-' + _.kebabCase(ctrl.defn.input_type));
 
+        if (this.defn.input_attrs && this.defn.input_attrs.multiple) {
+          $element.addClass('af-field-type-multiple');
+        }
+
         if (this.defn.name !== this.fieldName) {
           namePrefix = this.fieldName.substr(0, this.fieldName.length - this.defn.name.length);
         }
@@ -113,6 +117,10 @@
 
         // Wait for parent controllers to initialize
         $timeout(function() {
+          initializeValue(true);
+        });
+
+        function initializeValue(firstLoad) {
           // Unique field name = entity_name index . join . field_name
           var entityName = ctrl.afFieldset.getName(),
             joinEntity = ctrl.afJoin ? ctrl.afJoin.entity : null,
@@ -130,7 +138,7 @@
           else if (urlArgs && (ctrl.fieldName in urlArgs)) {
             setValue(urlArgs[ctrl.fieldName]);
           }
-          else if (ctrl.afFieldset.getStoredValue(ctrl.fieldName) !== undefined) {
+          else if (firstLoad && ctrl.afFieldset.getStoredValue(ctrl.fieldName) !== undefined) {
             setValue(ctrl.afFieldset.getStoredValue(ctrl.fieldName));
           }
           // Set default value based on field defn
@@ -157,6 +165,12 @@
               }
             }
           }
+        }
+
+        // Reinitialize value when resetting form
+        $scope.$on('afFormReset', function() {
+          delete $scope.dataProvider.getFieldData()[ctrl.fieldName];
+          initializeValue(false);
         });
       };
 
@@ -208,7 +222,7 @@
         }
 
         if (ctrl.defn.input_type === 'Date' && typeof value === 'string' && value.startsWith('now')) {
-          value = getRelativeDate(value);
+          value = getRelativeDate(value, ctrl.defn.input_attrs.time);
         }
         if (ctrl.defn.input_type === 'Number' && ctrl.defn.search_range) {
           if (!_.isPlainObject(value)) {
@@ -244,7 +258,7 @@
       };
 
       ctrl.isReadonly = function() {
-        if (ctrl.defn.input_attrs && ctrl.defn.input_attrs.autofill) {
+        if (ctrl.defn.input_attrs && ctrl.defn.input_attrs.autofill && !ctrl.afJoin) {
           return ctrl.afFieldset.getEntity().actions[ctrl.defn.input_attrs.autofill] === false;
         }
         // TODO: Not actually used, but could be used if we wanted to render displayOnly
@@ -374,7 +388,7 @@
         return currentVal;
       };
 
-      function getRelativeDate(dateString) {
+      function getRelativeDate(dateString, includeTime) {
         const parts = dateString.split(' ');
         const baseDate = new Date();
         let unit = parts[2] || 'day';
@@ -389,7 +403,11 @@
             offset *= 365;
         }
         let newDate = new Date(baseDate.getTime() + offset * 24 * 60 * 60 * 1000);
-        return newDate.toISOString().split('T')[0];
+        let defaultDate = newDate.toISOString().split('T')[0];
+        if (includeTime) {
+          defaultDate += ' ' + newDate.toTimeString().slice(0,8);
+        }
+        return defaultDate;
       }
 
     }
diff --git a/civicrm/ext/afform/core/ang/af/afForm.component.js b/civicrm/ext/afform/core/ang/af/afForm.component.js
index b7df25e76491e5c619f2891f9cc898061e471561..50a8ccffb7c1f66f06404652c92b1abc87237658 100644
--- a/civicrm/ext/afform/core/ang/af/afForm.component.js
+++ b/civicrm/ext/afform/core/ang/af/afForm.component.js
@@ -42,6 +42,11 @@
       this.getFormMeta = function getFormMeta() {
         return $scope.$parent.meta;
       };
+      this.resetForm = function() {
+        this.ngForm.$setPristine();
+        $scope.$parent.$broadcast('afFormReset');
+        this.loadData();
+      };
       // With no arguments this will prefill the entire form based on url args
       // and also check if the form is open for submissions.
       // With selectedEntity, selectedIndex & selectedId provided this will prefill a single entity
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php
index 75149a9ef6e5b816d1275aece3a335350618a40e..2160ef3cc6fc837ee196d1cd6a3589709745cdc2 100644
--- a/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php
@@ -2,13 +2,15 @@
 namespace api\v4\Afform;
 
 use Civi\Api4\Afform;
+use Civi\Api4\Event;
+use Civi\Test\TransactionalInterface;
 
 /**
  * Test case for Afform.prefill and Afform.submit with Event records.
  *
  * @group headless
  */
-class AfformEventUsageTest extends AfformUsageTestCase {
+class AfformEventUsageTest extends AfformUsageTestCase implements TransactionalInterface {
   use \Civi\Test\Api4TestTrait;
 
   /**
@@ -75,4 +77,123 @@ EOHTML;
     $this->assertSame('2234567', $prefill['values'][0]['joins']['LocBlock'][0]['phone_id.phone']);
   }
 
+  /**
+   * Test saving & updating
+   */
+  public function testEventLocationUpdate(): void {
+    $layout = <<<EOHTML
+<af-form ctrl="afform">
+  <af-entity actions="{create: true, update: true}" type="Event" name="Event1" label="Event 1" security="FBAC" />
+  <fieldset af-fieldset="Event1" class="af-container" af-title="Event 1">
+    <af-field name="id" />
+    <af-field name="title" />
+    <af-field name="start_date" />
+    <af-field name="end_date" defn="{input_type: 'DisplayOnly'}" />
+    <af-field name="event_type_id" />
+    <div af-join="LocBlock">
+      <af-field name="id" />
+      <af-field name="email_id.email" />
+      <af-field name="address_id.street_address" />
+    </div>
+  </fieldset>
+  <button class="af-button btn btn-primary" crm-icon="fa-check" ng-click="afform.submit()">Submit</button>
+</af-form>
+EOHTML;
+
+    $this->useValues([
+      'layout' => $layout,
+      'permission' => \CRM_Core_Permission::ALWAYS_ALLOW_PERMISSION,
+    ]);
+
+    // Create a new event with a new location
+    $submit = Afform::submit()
+      ->setName($this->formName)
+      ->setValues([
+        'Event1' => [
+          [
+            'fields' => [
+              'title' => 'Event Title 1',
+              'start_date' => '2021-01-01 00:00:00',
+              'end_date' => '2021-01-02 00:00:00',
+              'event_type_id' => 1,
+            ],
+            'joins' => [
+              'LocBlock' => [
+                [
+                  'email_id.email' => 'test1@te.st',
+                  'address_id.street_address' => '12345',
+                ],
+              ],
+            ],
+          ],
+        ],
+      ])->execute();
+
+    $event1 = $submit[0]['Event1'][0]['id'];
+    $loc1 = $submit[0]['Event1'][0]['joins']['LocBlock'][0]['id'];
+
+    // End date is readonly so should not have been saved.
+    $event1Values = $this->getTestRecord('Event', $event1);
+    $this->assertNull($event1Values['end_date']);
+    Event::update(FALSE)
+      ->addWhere('id', '=', $event1)
+      ->addValue('end_date', '2021-01-03 00:00:00')
+      ->execute();
+
+    // Create a 2nd new event with a new location
+    $submit = Afform::submit()
+      ->setName($this->formName)
+      ->setValues([
+        'Event1' => [
+          [
+            'fields' => [
+              'title' => 'Event Title 2',
+              'start_date' => '2022-01-01 00:00:00',
+              'event_type_id' => 1,
+            ],
+            'joins' => [
+              'LocBlock' => [
+                [
+                  'id' => $loc1,
+                ],
+              ],
+            ],
+          ],
+        ],
+      ])->execute();
+
+    $event2 = $submit[0]['Event1'][0]['id'];
+    $this->assertGreaterThan($event1, $event2);
+    $this->assertSame($loc1, $submit[0]['Event1'][0]['joins']['LocBlock'][0]['id']);
+
+    // Update event 1 with a new location
+    $submit = Afform::submit()
+      ->setName($this->formName)
+      ->setValues([
+        'Event1' => [
+          [
+            'fields' => [
+              'id' => $event1,
+              'title' => 'Event Title 1 Updated',
+            ],
+            'joins' => [
+              'LocBlock' => [
+                [
+                  'id' => NULL,
+                  'address_id.street_address' => '12345',
+                ],
+              ],
+            ],
+          ],
+        ],
+      ])->execute();
+
+    $this->assertSame($event1, $submit[0]['Event1'][0]['id']);
+    $this->assertGreaterThan($loc1, $submit[0]['Event1'][0]['joins']['LocBlock'][0]['id']);
+
+    // End date is readonly so should not have been modified.
+    $event1Values = $this->getTestRecord('Event', $event1);
+    $this->assertSame('2021-01-03 00:00:00', $event1Values['end_date']);
+  }
+
 }
diff --git a/civicrm/ext/authx/authx.php b/civicrm/ext/authx/authx.php
index 0a5ad8f9a8e040da88e2a055d474924da4ab5903..f1e43e8b8f52d4326b2ee2f66c2cdf220114670c 100644
--- a/civicrm/ext/authx/authx.php
+++ b/civicrm/ext/authx/authx.php
@@ -124,14 +124,18 @@ function authx_civicrm_enable() {
 function authx_civicrm_permission(&$permissions) {
   $permissions['authenticate with password'] = [
     'label' => E::ts('AuthX: Authenticate to services with password'),
+    'description' => E::ts('AuthX: Authenticate to services with password'),
   ];
   $permissions['authenticate with api key'] = [
     'label' => E::ts('AuthX: Authenticate to services with API key'),
+    'description' => E::ts('AuthX: Authenticate to services with API key'),
   ];
   $permissions['generate any authx credential'] = [
     'label' => E::ts('Authx: Generate new JWT credentials for other users via the API'),
+    'description' => E::ts('Authx: Generate new JWT credentials for other users via the API'),
   ];
   $permissions['validate any authx credential'] = [
     'label' => E::ts('Authx: Validate credentials for other users via the API'),
+    'description' => E::ts('Authx: Validate credentials for other users via the API'),
   ];
 }
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php
index 83559710f6c4b467cb2d3184d3e9a671815af709..b433f31f3ab98f4744431010334dbb1c219ba084 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php
@@ -162,6 +162,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'cssRules' => [
             [
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php
index f9e34490d61d2640bd8610ce429060f10bb96178..82fb498610922ac76d7dd9f71de78eb480db2cf3 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php
@@ -74,6 +74,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php
index 351d79b8c52fe9a76fcf4d48ba1d5dac29f2ef94..fd96dcda192be2216dfa5f4457bd46dc2943c015 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php
@@ -54,6 +54,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php
index 80fd556254077f556c79ceec9206cee26e0b9070..1b129a2c21e295a6ea845a8ebf7ddcd6c7f0d3be 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php
@@ -60,6 +60,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php
index 58c874742238388bd3f8ca9d89237a25df3ffefc..dc3f58b1767e94f2bff6435d4c0563afa82d875c 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php
@@ -74,6 +74,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php
index 417004cec12b05625ae9d320d19f09c8832ee903..7fede0d57d76eeaded4290d899ba4f0851b65371 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php
@@ -66,6 +66,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php
index 5c935f9e6b6e371476e2af1ce0314742255f8040..8c03f869c12ef0d61d2919dc453771fc4eff7a81 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php
@@ -82,6 +82,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php
index 6c849d75249b4d2cebf2a06e97a60c49c20cb059..2955f3e2650bcee61eface8a54c34a655f4e70f9 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php
@@ -59,6 +59,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php
index ebe669d0f6d63a49a2f2d2a61af92efa4f155d9f..1bc1f1e525849575237626c77eeddec1e32a4a36 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php
@@ -248,6 +248,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'toolbar' => [
             [
@@ -268,6 +269,7 @@ return [
             ],
           ],
           'hierarchical' => TRUE,
+          'collapsible' => 'closed',
         ],
         'acl_bypass' => FALSE,
       ],
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php
index d1a3f718ec176e6c92bc1f295aef95a752149e9e..7c9da854eaeb4ab43c6aa47885969d494e531507 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php
@@ -89,6 +89,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php
index ac0385ef2cc30e8f37030e5bcc7be6cdcef347ba..8a87101b89f9e9d48de8430687a5f1e85707e9ba 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php
@@ -60,6 +60,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php
index d9653a79cbe9545d8e6f33d2f2c73bf50feb82b1..8b52f78b67eaea86bed48c8d0031d57240bb1428 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php
@@ -73,6 +73,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php
index 79892ddc9930ae9e51b599d2323b167fd9879fa0..83e2cc555bd6b243185dc97aa69c3bbf8aa57f20 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php
@@ -57,6 +57,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php
index 6ad01ad24131e0925b064ab3b44255f7decd2a34..db1fe7d1cfbe3aa963954bbbee4d7e38cf734231 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php
@@ -172,6 +172,7 @@ return [
           'classes' => [
             'table-striped',
             'table',
+            'crm-sticky-header',
           ],
           'toolbar' => [
             [
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php
index 88eea065fe59685d561c35c94fc3948557d7ad89..522d0a3be185a028e4d75d33267edee394b76475 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php
@@ -137,6 +137,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
         ],
       ],
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php
index dc2ee01d3513e1baa6a582a9a6e8b3a8f8916477..d334e50a604c7a1f97b00539283a934c47e3e061 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php
@@ -159,6 +159,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'draggable' => 'weight',
           'toolbar' => [
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php
index d041b2153e23957d3f0ee9704be96d45d62d9f79..77d8b013840a93f08c12cfb137ae03d10ec0c6d6 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php
@@ -61,6 +61,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'pager' => [
             'show_count' => TRUE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php
index 9d89dfbdc75db817a4a8e63c63d1525e4bfa272b..a74ee99f9f6fbb168e9665b0a55fd376ea7872a7 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php
@@ -191,6 +191,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'toolbar' => [
             [
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php
index 74acbef6d6de433fc5b32dcde30fd9af51f1a290..a90e729a3ab635f42007c89a5881caca49b15685 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php
@@ -195,6 +195,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'cssRules' => [
             [
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php
index 03f602eae561f1f27a130e9ab58f8af12bac5c9e..55e8b522789ca01b416b4f5e247fe121ee59c691 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php
@@ -242,6 +242,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
         ],
         'acl_bypass' => FALSE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php
index e6d88c56b707c8828e80ef16eebe1ad31a51faf1..3c1b1f6dcfaff87032a941b333bf3baf25f93d3d 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php
@@ -146,6 +146,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'draggable' => 'weight',
           'toolbar' => [
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php
index f0b1cc758998e80a75a604951e21f4e272b71ef6..fc7b1f22ff06e9fd99db718fcf92780f12ff9d42 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php
@@ -88,6 +88,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
         ],
       ],
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php
index 94231165b5b105a699e99a27d0b9e2fdde494a59..18bb7f0f678c4847c4c86353839f7b578173e785 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php
@@ -151,6 +151,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
           'toolbar' => [
             [
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php
index 655a7d160111c29c55f477b4f52b8e7f96f146e7..c3bb9ef7f0577ef5b08824d05c80b607cf11dadb 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php
@@ -92,6 +92,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
         ],
         'acl_bypass' => FALSE,
diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php
index 5b4bb413b1d72f2811d4c3db4f37e41378e22ee4..c7bb6c900ca2b32f169395123465807a71cb91ca 100644
--- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php
+++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php
@@ -118,6 +118,7 @@ return [
           'classes' => [
             'table',
             'table-striped',
+            'crm-sticky-header',
           ],
         ],
       ],
diff --git a/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html b/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html
index d9ada15c74b2cb2aadfbf17aefb4deff6d38dd91..b7954934c2ca984f8829674bf4e79e25ad2666a2 100644
--- a/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html
+++ b/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html
@@ -5,7 +5,7 @@
     <af-field name="Contribution_Contact_contact_id_01.tags" defn="{input_attrs: {multiple: true}}" />
     <af-field name="Contribution_Contact_contact_id_01.groups" defn="{input_attrs: {multiple: true}}" />
     <af-field name="Contribution_Contact_contact_id_01.contact_type" defn="{input_attrs: {multiple: true}}" />
-    <af-field name="Contribution_Contact_contact_id_01.is_deleted" defn="{required: false, label: 'Search in Trash (deleted contacts)'}" />
+    <af-field name="Contribution_Contact_contact_id_01.is_deleted" defn="{required: false, label: 'Search Deleted Contacts'}" />
   </details>
   <details class="af-container af-layout-inline" open af-title="Common Filters">
     <af-field name="receive_date" defn="{input_type: 'Select', search_range: true, options: [{id: '{}', label: 'Choose Date Range'}, {id: 'this.day', label: 'Today'}, {id: 'this.week', label: 'This week'}, {id: 'this.month', label: 'This calendar month'}, {id: 'this.quarter', label: 'This quarter'}, {id: 'this.fiscal_year', label: 'This fiscal year'}, {id: 'this.year', label: 'This calendar year'}, {id: 'previous.day', label: 'Yesterday'}, {id: 'previous.week', label: 'Previous week'}, {id: 'previous.month', label: 'Previous calendar month'}, {id: 'previous.quarter', label: 'Previous quarter'}, {id: 'previous.fiscal_year', label: 'Previous fiscal year'}, {id: 'previous.year', label: 'Previous calendar year'}, {id: 'ending.week', label: 'Last 7 days including today'}, {id: 'ending_30.day', label: 'Last 30 days including today'}, {id: 'ending_60.day', label: 'Last 60 days including today'}, {id: 'ending_90.day', label: 'Last 90 days including today'}, {id: 'ending.year', label: 'Last 12 months including today'}, {id: 'ending_2.year', label: 'Last 2 years including today'}, {id: 'ending_3.year', label: 'Last 3 years including today'}, {id: 'starting.day', label: 'Tomorrow'}, {id: 'next.week', label: 'Next week'}, {id: 'next.month', label: 'Next calendar month'}, {id: 'next.quarter', label: 'Next quarter'}, {id: 'next.fiscal_year', label: 'Next fiscal year'}, {id: 'next.year', label: 'Next calendar year'}, {id: 'starting.week', label: 'Next 7 days including today'}, {id: 'starting.month', label: 'Next 30 days including today'}, {id: 'starting_2.month', label: 'Next 60 days including today'}, {id: 'starting.quarter', label: 'Next 90 days including today'}, {id: 'starting.year', label: 'Next 12 months including today'}, {id: 'current.week', label: 'Current week to-date'}, {id: 'current.month', label: 'Current calendar month to-date'}, {id: 'current.quarter', label: 'Current quarter to-date'}, {id: 'current.year', label: 'Current calendar year to-date'}, {id: 'earlier.day', label: 'To end of yesterday'}, {id: 'earlier.week', label: 'To end of previous week'}, {id: 'earlier.month', label: 'To end of previous calendar month'}, {id: 'earlier.quarter', label: 'To end of previous quarter'}, {id: 'earlier.year', label: 'To end of previous calendar year'}, {id: 'greater.day', label: 'From start of current day'}, {id: 'greater.week', label: 'From start of current week'}, {id: 'greater.month', label: 'From start of current calendar month'}, {id: 'greater.quarter', label: 'From start of current quarter'}, {id: 'greater.year', label: 'From start of current calendar year'}, {id: 'less.week', label: 'To end of current week'}, {id: 'less.month', label: 'To end of current calendar month'}, {id: 'less.quarter', label: 'To end of current quarter'}, {id: 'less.year', label: 'To end of current calendar year'}, {id: 'previous_2.day', label: 'Previous 2 days'}, {id: 'previous_2.week', label: 'Previous 2 weeks'}, {id: 'previous_2.month', label: 'Previous 2 calendar months'}, {id: 'previous_2.quarter', label: 'Previous 2 quarters'}, {id: 'previous_2.year', label: 'Previous 2 calendar years'}, {id: 'previous_2.fiscal_year', label: 'Previous 2 fiscal years'}, {id: 'previous_before.day', label: 'Day prior to yesterday'}, {id: 'previous_before.week', label: 'Week prior to previous week'}, {id: 'previous_before.month', label: 'Month prior to previous calendar month'}, {id: 'previous_before.quarter', label: 'Quarter prior to previous quarter'}, {id: 'previous_before.year', label: 'Year prior to previous calendar year'}, {id: 'previous_before.fiscal_year', label: 'Fiscal year prior to previous fiscal year'}, {id: 'greater_previous.week', label: 'From end of previous week'}, {id: 'greater_previous.month', label: 'From end of previous calendar month'}, {id: 'greater_previous.quarter', label: 'From end of previous quarter'}, {id: 'greater_previous.year', label: 'From end of previous calendar year'}], input_attrs: {}}" />
diff --git a/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html b/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html
index 8604ba98baa183b4ee0a81b8a7fd431903b98a79..dad6e9a436fa9698baf70b3fbb0faffe63e82728 100644
--- a/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html
+++ b/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html
@@ -4,7 +4,7 @@
     <af-field name="Membership_Contact_contact_id_01.tags" defn="{input_attrs: {multiple: true}}" />
     <af-field name="Membership_Contact_contact_id_01.groups" defn="{input_attrs: {multiple: true}}" />
     <af-field name="Membership_Contact_contact_id_01.contact_type" defn="{input_attrs: {multiple: true}}" />
-    <af-field name="Membership_Contact_contact_id_01.is_deleted" defn="{label: 'Search in Trash (deleted contacts)'}" />
+    <af-field name="Membership_Contact_contact_id_01.is_deleted" defn="{label: 'Search Deleted Contacts'}" />
   </details>
   <details class="af-container af-layout-inline" af-title="Membership Filters" open="">
     <af-field name="membership_type_id" defn="{input_attrs: {multiple: true}, required: false}" />
diff --git a/civicrm/ext/greenwich/dist/bootstrap3.css b/civicrm/ext/greenwich/dist/bootstrap3.css
index f172d468fa53b2f8e07197fd0b5d97da039ebf8b..f72ffede1f55c87168a2376ddb39e5fdf6628ebd 100644
--- a/civicrm/ext/greenwich/dist/bootstrap3.css
+++ b/civicrm/ext/greenwich/dist/bootstrap3.css
@@ -7298,6 +7298,12 @@
 	display: list-item;
 }
 
+#bootstrap-theme legend {
+	position: initial;
+	text-transform: inherit;
+	float: none;
+}
+
 #bootstrap-theme .form-control .select2-choice {
 	border: 0;
 	border-radius: 2px;
diff --git a/civicrm/ext/greenwich/dist/bootstrap3.min.css b/civicrm/ext/greenwich/dist/bootstrap3.min.css
index 8a86720830ae1c9fed25d83597b03a3e064e1072..4c2092e5eaa20c38cc75289e8c75bf30f8993ccc 100644
--- a/civicrm/ext/greenwich/dist/bootstrap3.min.css
+++ b/civicrm/ext/greenwich/dist/bootstrap3.min.css
@@ -1 +1 @@
-@charset "UTF-8";#bootstrap-theme html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}#bootstrap-theme body{margin:0}#bootstrap-theme article,#bootstrap-theme aside,#bootstrap-theme details,#bootstrap-theme figcaption,#bootstrap-theme figure,#bootstrap-theme footer,#bootstrap-theme header,#bootstrap-theme hgroup,#bootstrap-theme main,#bootstrap-theme menu,#bootstrap-theme nav,#bootstrap-theme section,#bootstrap-theme summary{display:block}#bootstrap-theme audio,#bootstrap-theme canvas,#bootstrap-theme progress,#bootstrap-theme video{display:inline-block;vertical-align:baseline}#bootstrap-theme audio:not([controls]){display:none;height:0}#bootstrap-theme [hidden],#bootstrap-theme template{display:none}#bootstrap-theme a{background-color:transparent}#bootstrap-theme a:active,#bootstrap-theme a:hover{outline:0}#bootstrap-theme abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}#bootstrap-theme b,#bootstrap-theme strong{font-weight:700}#bootstrap-theme dfn{font-style:italic}#bootstrap-theme h1{font-size:2em;margin:.67em 0}#bootstrap-theme mark{background:#ff0;color:#000}#bootstrap-theme small{font-size:80%}#bootstrap-theme sub,#bootstrap-theme sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}#bootstrap-theme sup{top:-.5em}#bootstrap-theme sub{bottom:-.25em}#bootstrap-theme img{border:0}#bootstrap-theme svg:not(:root){overflow:hidden}#bootstrap-theme figure{margin:1em 40px}#bootstrap-theme hr{box-sizing:content-box;height:0}#bootstrap-theme pre{overflow:auto}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:monospace,monospace;font-size:1em}#bootstrap-theme button,#bootstrap-theme input,#bootstrap-theme optgroup,#bootstrap-theme select,#bootstrap-theme textarea{color:inherit;font:inherit;margin:0}#bootstrap-theme button{overflow:visible}#bootstrap-theme button,#bootstrap-theme select{text-transform:none}#bootstrap-theme button,#bootstrap-theme html input[type=button],#bootstrap-theme input[type=reset],#bootstrap-theme input[type=submit]{-webkit-appearance:button;cursor:pointer}#bootstrap-theme button[disabled],#bootstrap-theme html input[disabled]{cursor:default}#bootstrap-theme button::-moz-focus-inner,#bootstrap-theme input::-moz-focus-inner{border:0;padding:0}#bootstrap-theme input{line-height:normal}#bootstrap-theme input[type=checkbox],#bootstrap-theme input[type=radio]{box-sizing:border-box;padding:0}#bootstrap-theme input[type=number]::-webkit-inner-spin-button,#bootstrap-theme input[type=number]::-webkit-outer-spin-button{height:auto}#bootstrap-theme input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}#bootstrap-theme input[type=search]::-webkit-search-cancel-button,#bootstrap-theme input[type=search]::-webkit-search-decoration{-webkit-appearance:none}#bootstrap-theme fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}#bootstrap-theme legend{border:0;padding:0}#bootstrap-theme textarea{overflow:auto}#bootstrap-theme optgroup{font-weight:700}#bootstrap-theme table{border-collapse:collapse;border-spacing:0}#bootstrap-theme td,#bootstrap-theme th{padding:0}@media print{#bootstrap-theme *,#bootstrap-theme *:before,#bootstrap-theme *:after{color:#000 !important;text-shadow:none !important;background:0 0 !important;box-shadow:none !important}#bootstrap-theme a,#bootstrap-theme a:visited{text-decoration:underline}#bootstrap-theme a[href]:after{content:" (" attr(href) ")"}#bootstrap-theme abbr[title]:after{content:" (" attr(title) ")"}#bootstrap-theme a[href^="#"]:after,#bootstrap-theme a[href^="javascript:"]:after{content:""}#bootstrap-theme pre,#bootstrap-theme blockquote{border:1px solid #999;page-break-inside:avoid}#bootstrap-theme thead{display:table-header-group}#bootstrap-theme tr,#bootstrap-theme img{page-break-inside:avoid}#bootstrap-theme img{max-width:100% !important}#bootstrap-theme p,#bootstrap-theme h2,#bootstrap-theme h3{orphans:3;widows:3}#bootstrap-theme h2,#bootstrap-theme h3{page-break-after:avoid}#bootstrap-theme .navbar{display:none}#bootstrap-theme .btn>.caret,#bootstrap-theme .dropup>.btn>.caret{border-top-color:#000 !important}#bootstrap-theme .label{border:1px solid #000}#bootstrap-theme .table{border-collapse:collapse !important}#bootstrap-theme .table td,#bootstrap-theme .table th{background-color:#fff !important}#bootstrap-theme .table-bordered th,#bootstrap-theme .table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:"Glyphicons Halflings";src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot");src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff2") format("woff2"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff") format("woff"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}#bootstrap-theme .glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#bootstrap-theme .glyphicon-asterisk:before{content:"*"}#bootstrap-theme .glyphicon-plus:before{content:"+"}#bootstrap-theme .glyphicon-euro:before,#bootstrap-theme .glyphicon-eur:before{content:"€"}#bootstrap-theme .glyphicon-minus:before{content:"−"}#bootstrap-theme .glyphicon-cloud:before{content:"☁"}#bootstrap-theme .glyphicon-envelope:before{content:"✉"}#bootstrap-theme .glyphicon-pencil:before{content:"✏"}#bootstrap-theme .glyphicon-glass:before{content:""}#bootstrap-theme .glyphicon-music:before{content:""}#bootstrap-theme .glyphicon-search:before{content:""}#bootstrap-theme .glyphicon-heart:before{content:""}#bootstrap-theme .glyphicon-star:before{content:""}#bootstrap-theme .glyphicon-star-empty:before{content:""}#bootstrap-theme .glyphicon-user:before{content:""}#bootstrap-theme .glyphicon-film:before{content:""}#bootstrap-theme .glyphicon-th-large:before{content:""}#bootstrap-theme .glyphicon-th:before{content:""}#bootstrap-theme .glyphicon-th-list:before{content:""}#bootstrap-theme .glyphicon-ok:before{content:""}#bootstrap-theme .glyphicon-remove:before{content:""}#bootstrap-theme .glyphicon-zoom-in:before{content:""}#bootstrap-theme .glyphicon-zoom-out:before{content:""}#bootstrap-theme .glyphicon-off:before{content:""}#bootstrap-theme .glyphicon-signal:before{content:""}#bootstrap-theme .glyphicon-cog:before{content:""}#bootstrap-theme .glyphicon-trash:before{content:""}#bootstrap-theme .glyphicon-home:before{content:""}#bootstrap-theme .glyphicon-file:before{content:""}#bootstrap-theme .glyphicon-time:before{content:""}#bootstrap-theme .glyphicon-road:before{content:""}#bootstrap-theme .glyphicon-download-alt:before{content:""}#bootstrap-theme .glyphicon-download:before{content:""}#bootstrap-theme .glyphicon-upload:before{content:""}#bootstrap-theme .glyphicon-inbox:before{content:""}#bootstrap-theme .glyphicon-play-circle:before{content:""}#bootstrap-theme .glyphicon-repeat:before{content:""}#bootstrap-theme .glyphicon-refresh:before{content:""}#bootstrap-theme .glyphicon-list-alt:before{content:""}#bootstrap-theme .glyphicon-lock:before{content:""}#bootstrap-theme .glyphicon-flag:before{content:""}#bootstrap-theme .glyphicon-headphones:before{content:""}#bootstrap-theme .glyphicon-volume-off:before{content:""}#bootstrap-theme .glyphicon-volume-down:before{content:""}#bootstrap-theme .glyphicon-volume-up:before{content:""}#bootstrap-theme .glyphicon-qrcode:before{content:""}#bootstrap-theme .glyphicon-barcode:before{content:""}#bootstrap-theme .glyphicon-tag:before{content:""}#bootstrap-theme .glyphicon-tags:before{content:""}#bootstrap-theme .glyphicon-book:before{content:""}#bootstrap-theme .glyphicon-bookmark:before{content:""}#bootstrap-theme .glyphicon-print:before{content:""}#bootstrap-theme .glyphicon-camera:before{content:""}#bootstrap-theme .glyphicon-font:before{content:""}#bootstrap-theme .glyphicon-bold:before{content:""}#bootstrap-theme .glyphicon-italic:before{content:""}#bootstrap-theme .glyphicon-text-height:before{content:""}#bootstrap-theme .glyphicon-text-width:before{content:""}#bootstrap-theme .glyphicon-align-left:before{content:""}#bootstrap-theme .glyphicon-align-center:before{content:""}#bootstrap-theme .glyphicon-align-right:before{content:""}#bootstrap-theme .glyphicon-align-justify:before{content:""}#bootstrap-theme .glyphicon-list:before{content:""}#bootstrap-theme .glyphicon-indent-left:before{content:""}#bootstrap-theme .glyphicon-indent-right:before{content:""}#bootstrap-theme .glyphicon-facetime-video:before{content:""}#bootstrap-theme .glyphicon-picture:before{content:""}#bootstrap-theme .glyphicon-map-marker:before{content:""}#bootstrap-theme .glyphicon-adjust:before{content:""}#bootstrap-theme .glyphicon-tint:before{content:""}#bootstrap-theme .glyphicon-edit:before{content:""}#bootstrap-theme .glyphicon-share:before{content:""}#bootstrap-theme .glyphicon-check:before{content:""}#bootstrap-theme .glyphicon-move:before{content:""}#bootstrap-theme .glyphicon-step-backward:before{content:""}#bootstrap-theme .glyphicon-fast-backward:before{content:""}#bootstrap-theme .glyphicon-backward:before{content:""}#bootstrap-theme .glyphicon-play:before{content:""}#bootstrap-theme .glyphicon-pause:before{content:""}#bootstrap-theme .glyphicon-stop:before{content:""}#bootstrap-theme .glyphicon-forward:before{content:""}#bootstrap-theme .glyphicon-fast-forward:before{content:""}#bootstrap-theme .glyphicon-step-forward:before{content:""}#bootstrap-theme .glyphicon-eject:before{content:""}#bootstrap-theme .glyphicon-chevron-left:before{content:""}#bootstrap-theme .glyphicon-chevron-right:before{content:""}#bootstrap-theme .glyphicon-plus-sign:before{content:""}#bootstrap-theme .glyphicon-minus-sign:before{content:""}#bootstrap-theme .glyphicon-remove-sign:before{content:""}#bootstrap-theme .glyphicon-ok-sign:before{content:""}#bootstrap-theme .glyphicon-question-sign:before{content:""}#bootstrap-theme .glyphicon-info-sign:before{content:""}#bootstrap-theme .glyphicon-screenshot:before{content:""}#bootstrap-theme .glyphicon-remove-circle:before{content:""}#bootstrap-theme .glyphicon-ok-circle:before{content:""}#bootstrap-theme .glyphicon-ban-circle:before{content:""}#bootstrap-theme .glyphicon-arrow-left:before{content:""}#bootstrap-theme .glyphicon-arrow-right:before{content:""}#bootstrap-theme .glyphicon-arrow-up:before{content:""}#bootstrap-theme .glyphicon-arrow-down:before{content:""}#bootstrap-theme .glyphicon-share-alt:before{content:""}#bootstrap-theme .glyphicon-resize-full:before{content:""}#bootstrap-theme .glyphicon-resize-small:before{content:""}#bootstrap-theme .glyphicon-exclamation-sign:before{content:""}#bootstrap-theme .glyphicon-gift:before{content:""}#bootstrap-theme .glyphicon-leaf:before{content:""}#bootstrap-theme .glyphicon-fire:before{content:""}#bootstrap-theme .glyphicon-eye-open:before{content:""}#bootstrap-theme .glyphicon-eye-close:before{content:""}#bootstrap-theme .glyphicon-warning-sign:before{content:""}#bootstrap-theme .glyphicon-plane:before{content:""}#bootstrap-theme .glyphicon-calendar:before{content:""}#bootstrap-theme .glyphicon-random:before{content:""}#bootstrap-theme .glyphicon-comment:before{content:""}#bootstrap-theme .glyphicon-magnet:before{content:""}#bootstrap-theme .glyphicon-chevron-up:before{content:""}#bootstrap-theme .glyphicon-chevron-down:before{content:""}#bootstrap-theme .glyphicon-retweet:before{content:""}#bootstrap-theme .glyphicon-shopping-cart:before{content:""}#bootstrap-theme .glyphicon-folder-close:before{content:""}#bootstrap-theme .glyphicon-folder-open:before{content:""}#bootstrap-theme .glyphicon-resize-vertical:before{content:""}#bootstrap-theme .glyphicon-resize-horizontal:before{content:""}#bootstrap-theme .glyphicon-hdd:before{content:""}#bootstrap-theme .glyphicon-bullhorn:before{content:""}#bootstrap-theme .glyphicon-bell:before{content:""}#bootstrap-theme .glyphicon-certificate:before{content:""}#bootstrap-theme .glyphicon-thumbs-up:before{content:""}#bootstrap-theme .glyphicon-thumbs-down:before{content:""}#bootstrap-theme .glyphicon-hand-right:before{content:""}#bootstrap-theme .glyphicon-hand-left:before{content:""}#bootstrap-theme .glyphicon-hand-up:before{content:""}#bootstrap-theme .glyphicon-hand-down:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-right:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-left:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-up:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-down:before{content:""}#bootstrap-theme .glyphicon-globe:before{content:""}#bootstrap-theme .glyphicon-wrench:before{content:""}#bootstrap-theme .glyphicon-tasks:before{content:""}#bootstrap-theme .glyphicon-filter:before{content:""}#bootstrap-theme .glyphicon-briefcase:before{content:""}#bootstrap-theme .glyphicon-fullscreen:before{content:""}#bootstrap-theme .glyphicon-dashboard:before{content:""}#bootstrap-theme .glyphicon-paperclip:before{content:""}#bootstrap-theme .glyphicon-heart-empty:before{content:""}#bootstrap-theme .glyphicon-link:before{content:""}#bootstrap-theme .glyphicon-phone:before{content:""}#bootstrap-theme .glyphicon-pushpin:before{content:""}#bootstrap-theme .glyphicon-usd:before{content:""}#bootstrap-theme .glyphicon-gbp:before{content:""}#bootstrap-theme .glyphicon-sort:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-order:before{content:""}#bootstrap-theme .glyphicon-sort-by-order-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes-alt:before{content:""}#bootstrap-theme .glyphicon-unchecked:before{content:""}#bootstrap-theme .glyphicon-expand:before{content:""}#bootstrap-theme .glyphicon-collapse-down:before{content:""}#bootstrap-theme .glyphicon-collapse-up:before{content:""}#bootstrap-theme .glyphicon-log-in:before{content:""}#bootstrap-theme .glyphicon-flash:before{content:""}#bootstrap-theme .glyphicon-log-out:before{content:""}#bootstrap-theme .glyphicon-new-window:before{content:""}#bootstrap-theme .glyphicon-record:before{content:""}#bootstrap-theme .glyphicon-save:before{content:""}#bootstrap-theme .glyphicon-open:before{content:""}#bootstrap-theme .glyphicon-saved:before{content:""}#bootstrap-theme .glyphicon-import:before{content:""}#bootstrap-theme .glyphicon-export:before{content:""}#bootstrap-theme .glyphicon-send:before{content:""}#bootstrap-theme .glyphicon-floppy-disk:before{content:""}#bootstrap-theme .glyphicon-floppy-saved:before{content:""}#bootstrap-theme .glyphicon-floppy-remove:before{content:""}#bootstrap-theme .glyphicon-floppy-save:before{content:""}#bootstrap-theme .glyphicon-floppy-open:before{content:""}#bootstrap-theme .glyphicon-credit-card:before{content:""}#bootstrap-theme .glyphicon-transfer:before{content:""}#bootstrap-theme .glyphicon-cutlery:before{content:""}#bootstrap-theme .glyphicon-header:before{content:""}#bootstrap-theme .glyphicon-compressed:before{content:""}#bootstrap-theme .glyphicon-earphone:before{content:""}#bootstrap-theme .glyphicon-phone-alt:before{content:""}#bootstrap-theme .glyphicon-tower:before{content:""}#bootstrap-theme .glyphicon-stats:before{content:""}#bootstrap-theme .glyphicon-sd-video:before{content:""}#bootstrap-theme .glyphicon-hd-video:before{content:""}#bootstrap-theme .glyphicon-subtitles:before{content:""}#bootstrap-theme .glyphicon-sound-stereo:before{content:""}#bootstrap-theme .glyphicon-sound-dolby:before{content:""}#bootstrap-theme .glyphicon-sound-5-1:before{content:""}#bootstrap-theme .glyphicon-sound-6-1:before{content:""}#bootstrap-theme .glyphicon-sound-7-1:before{content:""}#bootstrap-theme .glyphicon-copyright-mark:before{content:""}#bootstrap-theme .glyphicon-registration-mark:before{content:""}#bootstrap-theme .glyphicon-cloud-download:before{content:""}#bootstrap-theme .glyphicon-cloud-upload:before{content:""}#bootstrap-theme .glyphicon-tree-conifer:before{content:""}#bootstrap-theme .glyphicon-tree-deciduous:before{content:""}#bootstrap-theme .glyphicon-cd:before{content:""}#bootstrap-theme .glyphicon-save-file:before{content:""}#bootstrap-theme .glyphicon-open-file:before{content:""}#bootstrap-theme .glyphicon-level-up:before{content:""}#bootstrap-theme .glyphicon-copy:before{content:""}#bootstrap-theme .glyphicon-paste:before{content:""}#bootstrap-theme .glyphicon-alert:before{content:""}#bootstrap-theme .glyphicon-equalizer:before{content:""}#bootstrap-theme .glyphicon-king:before{content:""}#bootstrap-theme .glyphicon-queen:before{content:""}#bootstrap-theme .glyphicon-pawn:before{content:""}#bootstrap-theme .glyphicon-bishop:before{content:""}#bootstrap-theme .glyphicon-knight:before{content:""}#bootstrap-theme .glyphicon-baby-formula:before{content:""}#bootstrap-theme .glyphicon-tent:before{content:"⛺"}#bootstrap-theme .glyphicon-blackboard:before{content:""}#bootstrap-theme .glyphicon-bed:before{content:""}#bootstrap-theme .glyphicon-apple:before{content:""}#bootstrap-theme .glyphicon-erase:before{content:""}#bootstrap-theme .glyphicon-hourglass:before{content:"⌛"}#bootstrap-theme .glyphicon-lamp:before{content:""}#bootstrap-theme .glyphicon-duplicate:before{content:""}#bootstrap-theme .glyphicon-piggy-bank:before{content:""}#bootstrap-theme .glyphicon-scissors:before{content:""}#bootstrap-theme .glyphicon-bitcoin:before{content:""}#bootstrap-theme .glyphicon-btc:before{content:""}#bootstrap-theme .glyphicon-xbt:before{content:""}#bootstrap-theme .glyphicon-yen:before{content:"¥"}#bootstrap-theme .glyphicon-jpy:before{content:"¥"}#bootstrap-theme .glyphicon-ruble:before{content:"₽"}#bootstrap-theme .glyphicon-rub:before{content:"₽"}#bootstrap-theme .glyphicon-scale:before{content:""}#bootstrap-theme .glyphicon-ice-lolly:before{content:""}#bootstrap-theme .glyphicon-ice-lolly-tasted:before{content:""}#bootstrap-theme .glyphicon-education:before{content:""}#bootstrap-theme .glyphicon-option-horizontal:before{content:""}#bootstrap-theme .glyphicon-option-vertical:before{content:""}#bootstrap-theme .glyphicon-menu-hamburger:before{content:""}#bootstrap-theme .glyphicon-modal-window:before{content:""}#bootstrap-theme .glyphicon-oil:before{content:""}#bootstrap-theme .glyphicon-grain:before{content:""}#bootstrap-theme .glyphicon-sunglasses:before{content:""}#bootstrap-theme .glyphicon-text-size:before{content:""}#bootstrap-theme .glyphicon-text-color:before{content:""}#bootstrap-theme .glyphicon-text-background:before{content:""}#bootstrap-theme .glyphicon-object-align-top:before{content:""}#bootstrap-theme .glyphicon-object-align-bottom:before{content:""}#bootstrap-theme .glyphicon-object-align-horizontal:before{content:""}#bootstrap-theme .glyphicon-object-align-left:before{content:""}#bootstrap-theme .glyphicon-object-align-vertical:before{content:""}#bootstrap-theme .glyphicon-object-align-right:before{content:""}#bootstrap-theme .glyphicon-triangle-right:before{content:""}#bootstrap-theme .glyphicon-triangle-left:before{content:""}#bootstrap-theme .glyphicon-triangle-bottom:before{content:""}#bootstrap-theme .glyphicon-triangle-top:before{content:""}#bootstrap-theme .glyphicon-console:before{content:""}#bootstrap-theme .glyphicon-superscript:before{content:""}#bootstrap-theme .glyphicon-subscript:before{content:""}#bootstrap-theme .glyphicon-menu-left:before{content:""}#bootstrap-theme .glyphicon-menu-right:before{content:""}#bootstrap-theme .glyphicon-menu-down:before{content:""}#bootstrap-theme .glyphicon-menu-up:before{content:""}#bootstrap-theme *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme *:before,#bootstrap-theme *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}#bootstrap-theme body{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff}#bootstrap-theme input,#bootstrap-theme button,#bootstrap-theme select,#bootstrap-theme textarea{font-family:inherit;font-size:inherit;line-height:inherit}#bootstrap-theme a{color:#2786c2;text-decoration:none}#bootstrap-theme a:hover,#bootstrap-theme a:focus{color:#1a5a82;text-decoration:underline}#bootstrap-theme a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme figure{margin:0}#bootstrap-theme img{vertical-align:middle}#bootstrap-theme .img-responsive{display:block;max-width:100%;height:auto}#bootstrap-theme .img-rounded{border-radius:6px}#bootstrap-theme .img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}#bootstrap-theme .img-circle{border-radius:50%}#bootstrap-theme hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}#bootstrap-theme .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}#bootstrap-theme .sr-only-focusable:active,#bootstrap-theme .sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}#bootstrap-theme [role=button]{cursor:pointer}#bootstrap-theme h1,#bootstrap-theme h2,#bootstrap-theme h3,#bootstrap-theme h4,#bootstrap-theme h5,#bootstrap-theme h6,#bootstrap-theme .h1,#bootstrap-theme .h2,#bootstrap-theme .h3,#bootstrap-theme .h4,#bootstrap-theme .h5,#bootstrap-theme .h6{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.2;color:#000}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-weight:400;line-height:1;color:#999}#bootstrap-theme h1,#bootstrap-theme .h1,#bootstrap-theme h2,#bootstrap-theme .h2,#bootstrap-theme h3,#bootstrap-theme .h3{margin-top:20px;margin-bottom:10px}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small{font-size:65%}#bootstrap-theme h4,#bootstrap-theme .h4,#bootstrap-theme h5,#bootstrap-theme .h5,#bootstrap-theme h6,#bootstrap-theme .h6{margin-top:10px;margin-bottom:10px}#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-size:75%}#bootstrap-theme h1,#bootstrap-theme .h1{font-size:36px}#bootstrap-theme h2,#bootstrap-theme .h2{font-size:30px}#bootstrap-theme h3,#bootstrap-theme .h3{font-size:24px}#bootstrap-theme h4,#bootstrap-theme .h4{font-size:18px}#bootstrap-theme h5,#bootstrap-theme .h5{font-size:14px}#bootstrap-theme h6,#bootstrap-theme .h6{font-size:12px}#bootstrap-theme p{margin:0 0 10px}#bootstrap-theme .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){#bootstrap-theme .lead{font-size:21px}}#bootstrap-theme small,#bootstrap-theme .small{font-size:85%}#bootstrap-theme mark,#bootstrap-theme .mark{padding:.2em;background-color:#fcf8e3}#bootstrap-theme .text-left{text-align:left}#bootstrap-theme .text-right{text-align:right}#bootstrap-theme .text-center{text-align:center}#bootstrap-theme .text-justify{text-align:justify}#bootstrap-theme .text-nowrap{white-space:nowrap}#bootstrap-theme .text-lowercase{text-transform:lowercase}#bootstrap-theme .text-uppercase,#bootstrap-theme .initialism{text-transform:uppercase}#bootstrap-theme .text-capitalize{text-transform:capitalize}#bootstrap-theme .text-muted{color:#999}#bootstrap-theme .text-primary{color:#000}#bootstrap-theme a.text-primary:hover,#bootstrap-theme a.text-primary:focus{color:#000}#bootstrap-theme .text-success{color:#468847}#bootstrap-theme a.text-success:hover,#bootstrap-theme a.text-success:focus{color:#356635}#bootstrap-theme .text-info{color:#3a87ad}#bootstrap-theme a.text-info:hover,#bootstrap-theme a.text-info:focus{color:#2d6987}#bootstrap-theme .text-warning{color:#c09853}#bootstrap-theme a.text-warning:hover,#bootstrap-theme a.text-warning:focus{color:#a47e3c}#bootstrap-theme .text-danger{color:#b94a48}#bootstrap-theme a.text-danger:hover,#bootstrap-theme a.text-danger:focus{color:#953b39}#bootstrap-theme .bg-primary{color:#fff}#bootstrap-theme .bg-primary{background-color:#000}#bootstrap-theme a.bg-primary:hover,#bootstrap-theme a.bg-primary:focus{background-color:#000}#bootstrap-theme .bg-success{background-color:#dff0d8}#bootstrap-theme a.bg-success:hover,#bootstrap-theme a.bg-success:focus{background-color:#c1e2b3}#bootstrap-theme .bg-info{background-color:#d9edf7}#bootstrap-theme a.bg-info:hover,#bootstrap-theme a.bg-info:focus{background-color:#afd9ee}#bootstrap-theme .bg-warning{background-color:#fcf8e3}#bootstrap-theme a.bg-warning:hover,#bootstrap-theme a.bg-warning:focus{background-color:#f7ecb5}#bootstrap-theme .bg-danger{background-color:#f2dede}#bootstrap-theme a.bg-danger:hover,#bootstrap-theme a.bg-danger:focus{background-color:#e4b9b9}#bootstrap-theme .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}#bootstrap-theme ul,#bootstrap-theme ol{margin-top:0;margin-bottom:10px}#bootstrap-theme ul ul,#bootstrap-theme ul ol,#bootstrap-theme ol ul,#bootstrap-theme ol ol{margin-bottom:0}#bootstrap-theme .list-unstyled{padding-left:0;list-style:none}#bootstrap-theme .list-inline{padding-left:0;list-style:none;margin-left:-5px}#bootstrap-theme .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}#bootstrap-theme dl{margin-top:0;margin-bottom:20px}#bootstrap-theme dt,#bootstrap-theme dd{line-height:1.428571429}#bootstrap-theme dt{font-weight:700}#bootstrap-theme dd{margin-left:0}#bootstrap-theme .dl-horizontal dd:before,#bootstrap-theme .dl-horizontal dd:after{display:table;content:" "}#bootstrap-theme .dl-horizontal dd:after{clear:both}@media (min-width:768px){#bootstrap-theme .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#bootstrap-theme .dl-horizontal dd{margin-left:180px}}#bootstrap-theme abbr[title],#bootstrap-theme abbr[data-original-title]{cursor:help}#bootstrap-theme .initialism{font-size:90%}#bootstrap-theme blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}#bootstrap-theme blockquote p:last-child,#bootstrap-theme blockquote ul:last-child,#bootstrap-theme blockquote ol:last-child{margin-bottom:0}#bootstrap-theme blockquote footer,#bootstrap-theme blockquote small,#bootstrap-theme blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}#bootstrap-theme blockquote footer:before,#bootstrap-theme blockquote small:before,#bootstrap-theme blockquote .small:before{content:"— "}#bootstrap-theme .blockquote-reverse,#bootstrap-theme blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}#bootstrap-theme .blockquote-reverse footer:before,#bootstrap-theme .blockquote-reverse small:before,#bootstrap-theme .blockquote-reverse .small:before,#bootstrap-theme blockquote.pull-right footer:before,#bootstrap-theme blockquote.pull-right small:before,#bootstrap-theme blockquote.pull-right .small:before{content:""}#bootstrap-theme .blockquote-reverse footer:after,#bootstrap-theme .blockquote-reverse small:after,#bootstrap-theme .blockquote-reverse .small:after,#bootstrap-theme blockquote.pull-right footer:after,#bootstrap-theme blockquote.pull-right small:after,#bootstrap-theme blockquote.pull-right .small:after{content:" —"}#bootstrap-theme address{margin-bottom:20px;font-style:normal;line-height:1.428571429}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}#bootstrap-theme code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}#bootstrap-theme kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}#bootstrap-theme kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}#bootstrap-theme pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;-ms-word-break:break-all;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}#bootstrap-theme pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}#bootstrap-theme .pre-scrollable{max-height:340px;overflow-y:scroll}#bootstrap-theme .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container:before,#bootstrap-theme .container:after{display:table;content:" "}#bootstrap-theme .container:after{clear:both}@media (min-width:768px){#bootstrap-theme .container{width:750px}}@media (min-width:992px){#bootstrap-theme .container{width:970px}}@media (min-width:1200px){#bootstrap-theme .container{width:1170px}}#bootstrap-theme .container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container-fluid:before,#bootstrap-theme .container-fluid:after{display:table;content:" "}#bootstrap-theme .container-fluid:after{clear:both}#bootstrap-theme .row{margin-right:-15px;margin-left:-15px}#bootstrap-theme .row:before,#bootstrap-theme .row:after{display:table;content:" "}#bootstrap-theme .row:after{clear:both}#bootstrap-theme .row-no-gutters{margin-right:0;margin-left:0}#bootstrap-theme .row-no-gutters [class*=col-]{padding-right:0;padding-left:0}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-sm-1,#bootstrap-theme .col-md-1,#bootstrap-theme .col-lg-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-md-2,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-md-3,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-md-4,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-md-5,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-md-6,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-md-7,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-md-8,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-md-9,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-md-10,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-md-11,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-xs-12,#bootstrap-theme .col-sm-12,#bootstrap-theme .col-md-12,#bootstrap-theme .col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-xs-12{float:left}#bootstrap-theme .col-xs-1{width:8.3333333333%}#bootstrap-theme .col-xs-2{width:16.6666666667%}#bootstrap-theme .col-xs-3{width:25%}#bootstrap-theme .col-xs-4{width:33.3333333333%}#bootstrap-theme .col-xs-5{width:41.6666666667%}#bootstrap-theme .col-xs-6{width:50%}#bootstrap-theme .col-xs-7{width:58.3333333333%}#bootstrap-theme .col-xs-8{width:66.6666666667%}#bootstrap-theme .col-xs-9{width:75%}#bootstrap-theme .col-xs-10{width:83.3333333333%}#bootstrap-theme .col-xs-11{width:91.6666666667%}#bootstrap-theme .col-xs-12{width:100%}#bootstrap-theme .col-xs-pull-0{right:auto}#bootstrap-theme .col-xs-pull-1{right:8.3333333333%}#bootstrap-theme .col-xs-pull-2{right:16.6666666667%}#bootstrap-theme .col-xs-pull-3{right:25%}#bootstrap-theme .col-xs-pull-4{right:33.3333333333%}#bootstrap-theme .col-xs-pull-5{right:41.6666666667%}#bootstrap-theme .col-xs-pull-6{right:50%}#bootstrap-theme .col-xs-pull-7{right:58.3333333333%}#bootstrap-theme .col-xs-pull-8{right:66.6666666667%}#bootstrap-theme .col-xs-pull-9{right:75%}#bootstrap-theme .col-xs-pull-10{right:83.3333333333%}#bootstrap-theme .col-xs-pull-11{right:91.6666666667%}#bootstrap-theme .col-xs-pull-12{right:100%}#bootstrap-theme .col-xs-push-0{left:auto}#bootstrap-theme .col-xs-push-1{left:8.3333333333%}#bootstrap-theme .col-xs-push-2{left:16.6666666667%}#bootstrap-theme .col-xs-push-3{left:25%}#bootstrap-theme .col-xs-push-4{left:33.3333333333%}#bootstrap-theme .col-xs-push-5{left:41.6666666667%}#bootstrap-theme .col-xs-push-6{left:50%}#bootstrap-theme .col-xs-push-7{left:58.3333333333%}#bootstrap-theme .col-xs-push-8{left:66.6666666667%}#bootstrap-theme .col-xs-push-9{left:75%}#bootstrap-theme .col-xs-push-10{left:83.3333333333%}#bootstrap-theme .col-xs-push-11{left:91.6666666667%}#bootstrap-theme .col-xs-push-12{left:100%}#bootstrap-theme .col-xs-offset-0{margin-left:0}#bootstrap-theme .col-xs-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-xs-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-xs-offset-3{margin-left:25%}#bootstrap-theme .col-xs-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-xs-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-xs-offset-6{margin-left:50%}#bootstrap-theme .col-xs-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-xs-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-xs-offset-9{margin-left:75%}#bootstrap-theme .col-xs-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-xs-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-xs-offset-12{margin-left:100%}@media (min-width:768px){#bootstrap-theme .col-sm-1,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-sm-12{float:left}#bootstrap-theme .col-sm-1{width:8.3333333333%}#bootstrap-theme .col-sm-2{width:16.6666666667%}#bootstrap-theme .col-sm-3{width:25%}#bootstrap-theme .col-sm-4{width:33.3333333333%}#bootstrap-theme .col-sm-5{width:41.6666666667%}#bootstrap-theme .col-sm-6{width:50%}#bootstrap-theme .col-sm-7{width:58.3333333333%}#bootstrap-theme .col-sm-8{width:66.6666666667%}#bootstrap-theme .col-sm-9{width:75%}#bootstrap-theme .col-sm-10{width:83.3333333333%}#bootstrap-theme .col-sm-11{width:91.6666666667%}#bootstrap-theme .col-sm-12{width:100%}#bootstrap-theme .col-sm-pull-0{right:auto}#bootstrap-theme .col-sm-pull-1{right:8.3333333333%}#bootstrap-theme .col-sm-pull-2{right:16.6666666667%}#bootstrap-theme .col-sm-pull-3{right:25%}#bootstrap-theme .col-sm-pull-4{right:33.3333333333%}#bootstrap-theme .col-sm-pull-5{right:41.6666666667%}#bootstrap-theme .col-sm-pull-6{right:50%}#bootstrap-theme .col-sm-pull-7{right:58.3333333333%}#bootstrap-theme .col-sm-pull-8{right:66.6666666667%}#bootstrap-theme .col-sm-pull-9{right:75%}#bootstrap-theme .col-sm-pull-10{right:83.3333333333%}#bootstrap-theme .col-sm-pull-11{right:91.6666666667%}#bootstrap-theme .col-sm-pull-12{right:100%}#bootstrap-theme .col-sm-push-0{left:auto}#bootstrap-theme .col-sm-push-1{left:8.3333333333%}#bootstrap-theme .col-sm-push-2{left:16.6666666667%}#bootstrap-theme .col-sm-push-3{left:25%}#bootstrap-theme .col-sm-push-4{left:33.3333333333%}#bootstrap-theme .col-sm-push-5{left:41.6666666667%}#bootstrap-theme .col-sm-push-6{left:50%}#bootstrap-theme .col-sm-push-7{left:58.3333333333%}#bootstrap-theme .col-sm-push-8{left:66.6666666667%}#bootstrap-theme .col-sm-push-9{left:75%}#bootstrap-theme .col-sm-push-10{left:83.3333333333%}#bootstrap-theme .col-sm-push-11{left:91.6666666667%}#bootstrap-theme .col-sm-push-12{left:100%}#bootstrap-theme .col-sm-offset-0{margin-left:0}#bootstrap-theme .col-sm-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-sm-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-sm-offset-3{margin-left:25%}#bootstrap-theme .col-sm-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-sm-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-sm-offset-6{margin-left:50%}#bootstrap-theme .col-sm-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-sm-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-sm-offset-9{margin-left:75%}#bootstrap-theme .col-sm-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-sm-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-sm-offset-12{margin-left:100%}}@media (min-width:992px){#bootstrap-theme .col-md-1,#bootstrap-theme .col-md-2,#bootstrap-theme .col-md-3,#bootstrap-theme .col-md-4,#bootstrap-theme .col-md-5,#bootstrap-theme .col-md-6,#bootstrap-theme .col-md-7,#bootstrap-theme .col-md-8,#bootstrap-theme .col-md-9,#bootstrap-theme .col-md-10,#bootstrap-theme .col-md-11,#bootstrap-theme .col-md-12{float:left}#bootstrap-theme .col-md-1{width:8.3333333333%}#bootstrap-theme .col-md-2{width:16.6666666667%}#bootstrap-theme .col-md-3{width:25%}#bootstrap-theme .col-md-4{width:33.3333333333%}#bootstrap-theme .col-md-5{width:41.6666666667%}#bootstrap-theme .col-md-6{width:50%}#bootstrap-theme .col-md-7{width:58.3333333333%}#bootstrap-theme .col-md-8{width:66.6666666667%}#bootstrap-theme .col-md-9{width:75%}#bootstrap-theme .col-md-10{width:83.3333333333%}#bootstrap-theme .col-md-11{width:91.6666666667%}#bootstrap-theme .col-md-12{width:100%}#bootstrap-theme .col-md-pull-0{right:auto}#bootstrap-theme .col-md-pull-1{right:8.3333333333%}#bootstrap-theme .col-md-pull-2{right:16.6666666667%}#bootstrap-theme .col-md-pull-3{right:25%}#bootstrap-theme .col-md-pull-4{right:33.3333333333%}#bootstrap-theme .col-md-pull-5{right:41.6666666667%}#bootstrap-theme .col-md-pull-6{right:50%}#bootstrap-theme .col-md-pull-7{right:58.3333333333%}#bootstrap-theme .col-md-pull-8{right:66.6666666667%}#bootstrap-theme .col-md-pull-9{right:75%}#bootstrap-theme .col-md-pull-10{right:83.3333333333%}#bootstrap-theme .col-md-pull-11{right:91.6666666667%}#bootstrap-theme .col-md-pull-12{right:100%}#bootstrap-theme .col-md-push-0{left:auto}#bootstrap-theme .col-md-push-1{left:8.3333333333%}#bootstrap-theme .col-md-push-2{left:16.6666666667%}#bootstrap-theme .col-md-push-3{left:25%}#bootstrap-theme .col-md-push-4{left:33.3333333333%}#bootstrap-theme .col-md-push-5{left:41.6666666667%}#bootstrap-theme .col-md-push-6{left:50%}#bootstrap-theme .col-md-push-7{left:58.3333333333%}#bootstrap-theme .col-md-push-8{left:66.6666666667%}#bootstrap-theme .col-md-push-9{left:75%}#bootstrap-theme .col-md-push-10{left:83.3333333333%}#bootstrap-theme .col-md-push-11{left:91.6666666667%}#bootstrap-theme .col-md-push-12{left:100%}#bootstrap-theme .col-md-offset-0{margin-left:0}#bootstrap-theme .col-md-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-md-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-md-offset-3{margin-left:25%}#bootstrap-theme .col-md-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-md-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-md-offset-6{margin-left:50%}#bootstrap-theme .col-md-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-md-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-md-offset-9{margin-left:75%}#bootstrap-theme .col-md-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-md-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-md-offset-12{margin-left:100%}}@media (min-width:1200px){#bootstrap-theme .col-lg-1,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-lg-12{float:left}#bootstrap-theme .col-lg-1{width:8.3333333333%}#bootstrap-theme .col-lg-2{width:16.6666666667%}#bootstrap-theme .col-lg-3{width:25%}#bootstrap-theme .col-lg-4{width:33.3333333333%}#bootstrap-theme .col-lg-5{width:41.6666666667%}#bootstrap-theme .col-lg-6{width:50%}#bootstrap-theme .col-lg-7{width:58.3333333333%}#bootstrap-theme .col-lg-8{width:66.6666666667%}#bootstrap-theme .col-lg-9{width:75%}#bootstrap-theme .col-lg-10{width:83.3333333333%}#bootstrap-theme .col-lg-11{width:91.6666666667%}#bootstrap-theme .col-lg-12{width:100%}#bootstrap-theme .col-lg-pull-0{right:auto}#bootstrap-theme .col-lg-pull-1{right:8.3333333333%}#bootstrap-theme .col-lg-pull-2{right:16.6666666667%}#bootstrap-theme .col-lg-pull-3{right:25%}#bootstrap-theme .col-lg-pull-4{right:33.3333333333%}#bootstrap-theme .col-lg-pull-5{right:41.6666666667%}#bootstrap-theme .col-lg-pull-6{right:50%}#bootstrap-theme .col-lg-pull-7{right:58.3333333333%}#bootstrap-theme .col-lg-pull-8{right:66.6666666667%}#bootstrap-theme .col-lg-pull-9{right:75%}#bootstrap-theme .col-lg-pull-10{right:83.3333333333%}#bootstrap-theme .col-lg-pull-11{right:91.6666666667%}#bootstrap-theme .col-lg-pull-12{right:100%}#bootstrap-theme .col-lg-push-0{left:auto}#bootstrap-theme .col-lg-push-1{left:8.3333333333%}#bootstrap-theme .col-lg-push-2{left:16.6666666667%}#bootstrap-theme .col-lg-push-3{left:25%}#bootstrap-theme .col-lg-push-4{left:33.3333333333%}#bootstrap-theme .col-lg-push-5{left:41.6666666667%}#bootstrap-theme .col-lg-push-6{left:50%}#bootstrap-theme .col-lg-push-7{left:58.3333333333%}#bootstrap-theme .col-lg-push-8{left:66.6666666667%}#bootstrap-theme .col-lg-push-9{left:75%}#bootstrap-theme .col-lg-push-10{left:83.3333333333%}#bootstrap-theme .col-lg-push-11{left:91.6666666667%}#bootstrap-theme .col-lg-push-12{left:100%}#bootstrap-theme .col-lg-offset-0{margin-left:0}#bootstrap-theme .col-lg-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-lg-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-lg-offset-3{margin-left:25%}#bootstrap-theme .col-lg-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-lg-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-lg-offset-6{margin-left:50%}#bootstrap-theme .col-lg-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-lg-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-lg-offset-9{margin-left:75%}#bootstrap-theme .col-lg-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-lg-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-lg-offset-12{margin-left:100%}}#bootstrap-theme table{background-color:transparent}#bootstrap-theme table col[class*=col-]{position:static;display:table-column;float:none}#bootstrap-theme table td[class*=col-],#bootstrap-theme table th[class*=col-]{position:static;display:table-cell;float:none}#bootstrap-theme caption{padding-top:8px;padding-bottom:8px;color:#999;text-align:left}#bootstrap-theme th{text-align:left}#bootstrap-theme .table{width:100%;max-width:100%;margin-bottom:20px}#bootstrap-theme .table>thead>tr>th,#bootstrap-theme .table>thead>tr>td,#bootstrap-theme .table>tbody>tr>th,#bootstrap-theme .table>tbody>tr>td,#bootstrap-theme .table>tfoot>tr>th,#bootstrap-theme .table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}#bootstrap-theme .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}#bootstrap-theme .table>caption+thead>tr:first-child>th,#bootstrap-theme .table>caption+thead>tr:first-child>td,#bootstrap-theme .table>colgroup+thead>tr:first-child>th,#bootstrap-theme .table>colgroup+thead>tr:first-child>td,#bootstrap-theme .table>thead:first-child>tr:first-child>th,#bootstrap-theme .table>thead:first-child>tr:first-child>td{border-top:0}#bootstrap-theme .table>tbody+tbody{border-top:2px solid #ddd}#bootstrap-theme .table .table{background-color:#fff}#bootstrap-theme .table-condensed>thead>tr>th,#bootstrap-theme .table-condensed>thead>tr>td,#bootstrap-theme .table-condensed>tbody>tr>th,#bootstrap-theme .table-condensed>tbody>tr>td,#bootstrap-theme .table-condensed>tfoot>tr>th,#bootstrap-theme .table-condensed>tfoot>tr>td{padding:5px}#bootstrap-theme .table-bordered{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td,#bootstrap-theme .table-bordered>tbody>tr>th,#bootstrap-theme .table-bordered>tbody>tr>td,#bootstrap-theme .table-bordered>tfoot>tr>th,#bootstrap-theme .table-bordered>tfoot>tr>td{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td{border-bottom-width:2px}#bootstrap-theme .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}#bootstrap-theme .table-hover>tbody>tr:hover{background-color:#f5f5f5}#bootstrap-theme .table>thead>tr>td.active,#bootstrap-theme .table>thead>tr>th.active,#bootstrap-theme .table>thead>tr.active>td,#bootstrap-theme .table>thead>tr.active>th,#bootstrap-theme .table>tbody>tr>td.active,#bootstrap-theme .table>tbody>tr>th.active,#bootstrap-theme .table>tbody>tr.active>td,#bootstrap-theme .table>tbody>tr.active>th,#bootstrap-theme .table>tfoot>tr>td.active,#bootstrap-theme .table>tfoot>tr>th.active,#bootstrap-theme .table>tfoot>tr.active>td,#bootstrap-theme .table>tfoot>tr.active>th{background-color:#f5f5f5}#bootstrap-theme .table-hover>tbody>tr>td.active:hover,#bootstrap-theme .table-hover>tbody>tr>th.active:hover,#bootstrap-theme .table-hover>tbody>tr.active:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.active,#bootstrap-theme .table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}#bootstrap-theme .table>thead>tr>td.success,#bootstrap-theme .table>thead>tr>th.success,#bootstrap-theme .table>thead>tr.success>td,#bootstrap-theme .table>thead>tr.success>th,#bootstrap-theme .table>tbody>tr>td.success,#bootstrap-theme .table>tbody>tr>th.success,#bootstrap-theme .table>tbody>tr.success>td,#bootstrap-theme .table>tbody>tr.success>th,#bootstrap-theme .table>tfoot>tr>td.success,#bootstrap-theme .table>tfoot>tr>th.success,#bootstrap-theme .table>tfoot>tr.success>td,#bootstrap-theme .table>tfoot>tr.success>th{background-color:#dff0d8}#bootstrap-theme .table-hover>tbody>tr>td.success:hover,#bootstrap-theme .table-hover>tbody>tr>th.success:hover,#bootstrap-theme .table-hover>tbody>tr.success:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.success,#bootstrap-theme .table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}#bootstrap-theme .table>thead>tr>td.info,#bootstrap-theme .table>thead>tr>th.info,#bootstrap-theme .table>thead>tr.info>td,#bootstrap-theme .table>thead>tr.info>th,#bootstrap-theme .table>tbody>tr>td.info,#bootstrap-theme .table>tbody>tr>th.info,#bootstrap-theme .table>tbody>tr.info>td,#bootstrap-theme .table>tbody>tr.info>th,#bootstrap-theme .table>tfoot>tr>td.info,#bootstrap-theme .table>tfoot>tr>th.info,#bootstrap-theme .table>tfoot>tr.info>td,#bootstrap-theme .table>tfoot>tr.info>th{background-color:#d9edf7}#bootstrap-theme .table-hover>tbody>tr>td.info:hover,#bootstrap-theme .table-hover>tbody>tr>th.info:hover,#bootstrap-theme .table-hover>tbody>tr.info:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.info,#bootstrap-theme .table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}#bootstrap-theme .table>thead>tr>td.warning,#bootstrap-theme .table>thead>tr>th.warning,#bootstrap-theme .table>thead>tr.warning>td,#bootstrap-theme .table>thead>tr.warning>th,#bootstrap-theme .table>tbody>tr>td.warning,#bootstrap-theme .table>tbody>tr>th.warning,#bootstrap-theme .table>tbody>tr.warning>td,#bootstrap-theme .table>tbody>tr.warning>th,#bootstrap-theme .table>tfoot>tr>td.warning,#bootstrap-theme .table>tfoot>tr>th.warning,#bootstrap-theme .table>tfoot>tr.warning>td,#bootstrap-theme .table>tfoot>tr.warning>th{background-color:#fcf8e3}#bootstrap-theme .table-hover>tbody>tr>td.warning:hover,#bootstrap-theme .table-hover>tbody>tr>th.warning:hover,#bootstrap-theme .table-hover>tbody>tr.warning:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.warning,#bootstrap-theme .table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}#bootstrap-theme .table>thead>tr>td.danger,#bootstrap-theme .table>thead>tr>th.danger,#bootstrap-theme .table>thead>tr.danger>td,#bootstrap-theme .table>thead>tr.danger>th,#bootstrap-theme .table>tbody>tr>td.danger,#bootstrap-theme .table>tbody>tr>th.danger,#bootstrap-theme .table>tbody>tr.danger>td,#bootstrap-theme .table>tbody>tr.danger>th,#bootstrap-theme .table>tfoot>tr>td.danger,#bootstrap-theme .table>tfoot>tr>th.danger,#bootstrap-theme .table>tfoot>tr.danger>td,#bootstrap-theme .table>tfoot>tr.danger>th{background-color:#f2dede}#bootstrap-theme .table-hover>tbody>tr>td.danger:hover,#bootstrap-theme .table-hover>tbody>tr>th.danger:hover,#bootstrap-theme .table-hover>tbody>tr.danger:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.danger,#bootstrap-theme .table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}#bootstrap-theme .table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){#bootstrap-theme .table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}#bootstrap-theme .table-responsive>.table{margin-bottom:0}#bootstrap-theme .table-responsive>.table>thead>tr>th,#bootstrap-theme .table-responsive>.table>thead>tr>td,#bootstrap-theme .table-responsive>.table>tbody>tr>th,#bootstrap-theme .table-responsive>.table>tbody>tr>td,#bootstrap-theme .table-responsive>.table>tfoot>tr>th,#bootstrap-theme .table-responsive>.table>tfoot>tr>td{white-space:nowrap}#bootstrap-theme .table-responsive>.table-bordered{border:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}#bootstrap-theme fieldset{min-width:0;padding:0;margin:0;border:0}#bootstrap-theme legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#555;border:0;border-bottom:1px solid #e5e5e5}#bootstrap-theme label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}#bootstrap-theme input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}#bootstrap-theme input[type=radio][disabled],#bootstrap-theme input[type=radio].disabled,fieldset[disabled] #bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox][disabled],#bootstrap-theme input[type=checkbox].disabled,fieldset[disabled] #bootstrap-theme input[type=checkbox]{cursor:not-allowed}#bootstrap-theme input[type=file]{display:block}#bootstrap-theme input[type=range]{display:block;width:100%}#bootstrap-theme select[multiple],#bootstrap-theme select[size]{height:auto}#bootstrap-theme input[type=file]:focus,#bootstrap-theme input[type=radio]:focus,#bootstrap-theme input[type=checkbox]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme output{display:block;padding-top:5px;font-size:14px;line-height:1.428571429;color:#555}#bootstrap-theme .form-control{display:block;width:100%;height:30px;padding:4px 8px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}#bootstrap-theme .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}#bootstrap-theme .form-control::-moz-placeholder{color:#999;opacity:1}#bootstrap-theme .form-control:-ms-input-placeholder{color:#999}#bootstrap-theme .form-control::-webkit-input-placeholder{color:#999}#bootstrap-theme .form-control::-ms-expand{background-color:transparent;border:0}#bootstrap-theme .form-control[disabled],#bootstrap-theme .form-control[readonly],fieldset[disabled] #bootstrap-theme .form-control{background-color:#eee;opacity:1}#bootstrap-theme .form-control[disabled],fieldset[disabled] #bootstrap-theme .form-control{cursor:not-allowed}#bootstrap-theme textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){#bootstrap-theme input[type=date].form-control,#bootstrap-theme input[type=time].form-control,#bootstrap-theme input[type=datetime-local].form-control,#bootstrap-theme input[type=month].form-control{line-height:30px}#bootstrap-theme input[type=date].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=date],#bootstrap-theme .input-group-sm>input.input-group-addon[type=date],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=date],.input-group-sm #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=time],#bootstrap-theme .input-group-sm>input.input-group-addon[type=time],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=time],.input-group-sm #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=datetime-local],#bootstrap-theme .input-group-sm>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=datetime-local],.input-group-sm #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=month],#bootstrap-theme .input-group-sm>input.input-group-addon[type=month],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=month],.input-group-sm #bootstrap-theme input[type=month]{line-height:30px}#bootstrap-theme input[type=date].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=date],#bootstrap-theme .input-group-lg>input.input-group-addon[type=date],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=date],.input-group-lg #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=time],#bootstrap-theme .input-group-lg>input.input-group-addon[type=time],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=time],.input-group-lg #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=datetime-local],#bootstrap-theme .input-group-lg>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=datetime-local],.input-group-lg #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=month],#bootstrap-theme .input-group-lg>input.input-group-addon[type=month],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=month],.input-group-lg #bootstrap-theme input[type=month]{line-height:54px}}#bootstrap-theme .form-group{margin-bottom:15px}#bootstrap-theme .radio,#bootstrap-theme .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}#bootstrap-theme .radio.disabled label,fieldset[disabled] #bootstrap-theme .radio label,#bootstrap-theme .checkbox.disabled label,fieldset[disabled] #bootstrap-theme .checkbox label{cursor:not-allowed}#bootstrap-theme .radio label,#bootstrap-theme .checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}#bootstrap-theme .radio input[type=radio],#bootstrap-theme .radio-inline input[type=radio],#bootstrap-theme .checkbox input[type=checkbox],#bootstrap-theme .checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}#bootstrap-theme .radio+.radio,#bootstrap-theme .checkbox+.checkbox{margin-top:-5px}#bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}#bootstrap-theme .radio-inline.disabled,fieldset[disabled] #bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline.disabled,fieldset[disabled] #bootstrap-theme .checkbox-inline{cursor:not-allowed}#bootstrap-theme .radio-inline+.radio-inline,#bootstrap-theme .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}#bootstrap-theme .form-control-static{min-height:34px;padding-top:5px;padding-bottom:5px;margin-bottom:0}#bootstrap-theme .form-control-static.input-lg,#bootstrap-theme .input-group-lg>.form-control-static.form-control,#bootstrap-theme .input-group-lg>.form-control-static.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.form-control-static.btn,#bootstrap-theme .form-control-static.input-sm,#bootstrap-theme .input-group-sm>.form-control-static.form-control,#bootstrap-theme .input-group-sm>.form-control-static.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}#bootstrap-theme .input-sm,#bootstrap-theme .input-group-sm>.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme select.input-sm,#bootstrap-theme .input-group-sm>select.form-control,#bootstrap-theme .input-group-sm>select.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>select.btn{height:30px;line-height:30px}#bootstrap-theme textarea.input-sm,#bootstrap-theme .input-group-sm>textarea.form-control,#bootstrap-theme .input-group-sm>textarea.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-sm,#bootstrap-theme .input-group-sm>select.form-control[multiple],#bootstrap-theme .input-group-sm>select.input-group-addon[multiple],#bootstrap-theme .input-group-sm>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .form-group-sm select.form-control{height:30px;line-height:30px}#bootstrap-theme .form-group-sm textarea.form-control,#bootstrap-theme .form-group-sm select[multiple].form-control{height:auto}#bootstrap-theme .form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .input-lg,#bootstrap-theme .input-group-lg>.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme select.input-lg,#bootstrap-theme .input-group-lg>select.form-control,#bootstrap-theme .input-group-lg>select.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>select.btn{height:54px;line-height:54px}#bootstrap-theme textarea.input-lg,#bootstrap-theme .input-group-lg>textarea.form-control,#bootstrap-theme .input-group-lg>textarea.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-lg,#bootstrap-theme .input-group-lg>select.form-control[multiple],#bootstrap-theme .input-group-lg>select.input-group-addon[multiple],#bootstrap-theme .input-group-lg>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .form-group-lg select.form-control{height:54px;line-height:54px}#bootstrap-theme .form-group-lg textarea.form-control,#bootstrap-theme .form-group-lg select[multiple].form-control{height:auto}#bootstrap-theme .form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .has-feedback{position:relative}#bootstrap-theme .has-feedback .form-control{padding-right:37.5px}#bootstrap-theme .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:30px;height:30px;line-height:30px;text-align:center;pointer-events:none}#bootstrap-theme .input-lg+.form-control-feedback,#bootstrap-theme .input-group-lg>.form-control+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-lg+.form-control-feedback,#bootstrap-theme .form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}#bootstrap-theme .input-sm+.form-control-feedback,#bootstrap-theme .input-group-sm>.form-control+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-sm+.form-control-feedback,#bootstrap-theme .form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}#bootstrap-theme .has-success .help-block,#bootstrap-theme .has-success .control-label,#bootstrap-theme .has-success .radio,#bootstrap-theme .has-success .checkbox,#bootstrap-theme .has-success .radio-inline,#bootstrap-theme .has-success .checkbox-inline,#bootstrap-theme .has-success.radio label,#bootstrap-theme .has-success.checkbox label,#bootstrap-theme .has-success.radio-inline label,#bootstrap-theme .has-success.checkbox-inline label{color:#468847}#bootstrap-theme .has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}#bootstrap-theme .has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}#bootstrap-theme .has-success .form-control-feedback{color:#468847}#bootstrap-theme .has-warning .help-block,#bootstrap-theme .has-warning .control-label,#bootstrap-theme .has-warning .radio,#bootstrap-theme .has-warning .checkbox,#bootstrap-theme .has-warning .radio-inline,#bootstrap-theme .has-warning .checkbox-inline,#bootstrap-theme .has-warning.radio label,#bootstrap-theme .has-warning.checkbox label,#bootstrap-theme .has-warning.radio-inline label,#bootstrap-theme .has-warning.checkbox-inline label{color:#c09853}#bootstrap-theme .has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}#bootstrap-theme .has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}#bootstrap-theme .has-warning .form-control-feedback{color:#c09853}#bootstrap-theme .has-error .help-block,#bootstrap-theme .has-error .control-label,#bootstrap-theme .has-error .radio,#bootstrap-theme .has-error .checkbox,#bootstrap-theme .has-error .radio-inline,#bootstrap-theme .has-error .checkbox-inline,#bootstrap-theme .has-error.radio label,#bootstrap-theme .has-error.checkbox label,#bootstrap-theme .has-error.radio-inline label,#bootstrap-theme .has-error.checkbox-inline label{color:#b94a48}#bootstrap-theme .has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}#bootstrap-theme .has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}#bootstrap-theme .has-error .form-control-feedback{color:#b94a48}#bootstrap-theme .has-feedback label~.form-control-feedback{top:25px}#bootstrap-theme .has-feedback label.sr-only~.form-control-feedback{top:0}#bootstrap-theme .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media (min-width:768px){#bootstrap-theme .form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .form-inline .form-control-static{display:inline-block}#bootstrap-theme .form-inline .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .form-inline .input-group .input-group-addon,#bootstrap-theme .form-inline .input-group .input-group-btn,#bootstrap-theme .form-inline .input-group .form-control{width:auto}#bootstrap-theme .form-inline .input-group>.form-control{width:100%}#bootstrap-theme .form-inline .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio,#bootstrap-theme .form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio label,#bootstrap-theme .form-inline .checkbox label{padding-left:0}#bootstrap-theme .form-inline .radio input[type=radio],#bootstrap-theme .form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .form-inline .has-feedback .form-control-feedback{top:0}}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox,#bootstrap-theme .form-horizontal .radio-inline,#bootstrap-theme .form-horizontal .checkbox-inline{padding-top:5px;margin-top:0;margin-bottom:0}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox{min-height:25px}#bootstrap-theme .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}#bootstrap-theme .form-horizontal .form-group:before,#bootstrap-theme .form-horizontal .form-group:after{display:table;content:" "}#bootstrap-theme .form-horizontal .form-group:after{clear:both}@media (min-width:768px){#bootstrap-theme .form-horizontal .control-label{padding-top:5px;margin-bottom:0;text-align:right}}#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-lg .control-label{padding-top:15px;font-size:18px}}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}#bootstrap-theme .btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:4px 8px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus,#bootstrap-theme .btn:active:focus,#bootstrap-theme .btn:active.focus,#bootstrap-theme .btn.active:focus,#bootstrap-theme .btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme .btn:hover,#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus{color:#fff;text-decoration:none}#bootstrap-theme .btn:active,#bootstrap-theme .btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn.disabled,#bootstrap-theme .btn[disabled],fieldset[disabled] #bootstrap-theme .btn{cursor:not-allowed;-webkit-filter:alpha(opacity=65);filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme a.btn.disabled,fieldset[disabled] #bootstrap-theme a.btn{pointer-events:none}#bootstrap-theme .btn-default{color:#fff;background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:focus,#bootstrap-theme .btn-default.focus{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:hover{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active,#bootstrap-theme .btn-default.active,.open>#bootstrap-theme .btn-default.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active:hover,#bootstrap-theme .btn-default:active:focus,#bootstrap-theme .btn-default:active.focus,#bootstrap-theme .btn-default.active:hover,#bootstrap-theme .btn-default.active:focus,#bootstrap-theme .btn-default.active.focus,.open>#bootstrap-theme .btn-default.dropdown-toggle:hover,.open>#bootstrap-theme .btn-default.dropdown-toggle:focus,.open>#bootstrap-theme .btn-default.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default.disabled:hover,#bootstrap-theme .btn-default.disabled:focus,#bootstrap-theme .btn-default.disabled.focus,#bootstrap-theme .btn-default[disabled]:hover,#bootstrap-theme .btn-default[disabled]:focus,#bootstrap-theme .btn-default[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-default:hover,fieldset[disabled] #bootstrap-theme .btn-default:focus,fieldset[disabled] #bootstrap-theme .btn-default.focus{background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-primary{color:#fff;background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary:focus,#bootstrap-theme .btn-primary.focus{color:#fff;background-color:#565752;border-color:#2f302d}#bootstrap-theme .btn-primary:hover{color:#fff;background-color:#565752;border-color:#51524d}#bootstrap-theme .btn-primary:active,#bootstrap-theme .btn-primary.active,.open>#bootstrap-theme .btn-primary.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:#51524d}#bootstrap-theme .btn-primary:active:hover,#bootstrap-theme .btn-primary:active:focus,#bootstrap-theme .btn-primary:active.focus,#bootstrap-theme .btn-primary.active:hover,#bootstrap-theme .btn-primary.active:focus,#bootstrap-theme .btn-primary.active.focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle:hover,.open>#bootstrap-theme .btn-primary.dropdown-toggle:focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:#2f302d}#bootstrap-theme .btn-primary.disabled:hover,#bootstrap-theme .btn-primary.disabled:focus,#bootstrap-theme .btn-primary.disabled.focus,#bootstrap-theme .btn-primary[disabled]:hover,#bootstrap-theme .btn-primary[disabled]:focus,#bootstrap-theme .btn-primary[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-primary:hover,fieldset[disabled] #bootstrap-theme .btn-primary:focus,fieldset[disabled] #bootstrap-theme .btn-primary.focus{background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-success{color:#fff;background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success:focus,#bootstrap-theme .btn-success.focus{color:#fff;background-color:#59822c;border-color:#324919}#bootstrap-theme .btn-success:hover{color:#fff;background-color:#59822c;border-color:#547a29}#bootstrap-theme .btn-success:active,#bootstrap-theme .btn-success.active,.open>#bootstrap-theme .btn-success.dropdown-toggle{color:#fff;background-color:#59822c;background-image:none;border-color:#547a29}#bootstrap-theme .btn-success:active:hover,#bootstrap-theme .btn-success:active:focus,#bootstrap-theme .btn-success:active.focus,#bootstrap-theme .btn-success.active:hover,#bootstrap-theme .btn-success.active:focus,#bootstrap-theme .btn-success.active.focus,.open>#bootstrap-theme .btn-success.dropdown-toggle:hover,.open>#bootstrap-theme .btn-success.dropdown-toggle:focus,.open>#bootstrap-theme .btn-success.dropdown-toggle.focus{color:#fff;background-color:#476723;border-color:#324919}#bootstrap-theme .btn-success.disabled:hover,#bootstrap-theme .btn-success.disabled:focus,#bootstrap-theme .btn-success.disabled.focus,#bootstrap-theme .btn-success[disabled]:hover,#bootstrap-theme .btn-success[disabled]:focus,#bootstrap-theme .btn-success[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-success:hover,fieldset[disabled] #bootstrap-theme .btn-success:focus,fieldset[disabled] #bootstrap-theme .btn-success.focus{background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success .badge{color:#73a839;background-color:#fff}#bootstrap-theme .btn-info{color:#000;background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info:focus,#bootstrap-theme .btn-info.focus{color:#000;background-color:#9bd1fd;border-color:#50affc}#bootstrap-theme .btn-info:hover{color:#000;background-color:#9bd1fd;border-color:#91ccfd}#bootstrap-theme .btn-info:active,#bootstrap-theme .btn-info.active,.open>#bootstrap-theme .btn-info.dropdown-toggle{color:#000;background-color:#9bd1fd;background-image:none;border-color:#91ccfd}#bootstrap-theme .btn-info:active:hover,#bootstrap-theme .btn-info:active:focus,#bootstrap-theme .btn-info:active.focus,#bootstrap-theme .btn-info.active:hover,#bootstrap-theme .btn-info.active:focus,#bootstrap-theme .btn-info.active.focus,.open>#bootstrap-theme .btn-info.dropdown-toggle:hover,.open>#bootstrap-theme .btn-info.dropdown-toggle:focus,.open>#bootstrap-theme .btn-info.dropdown-toggle.focus{color:#000;background-color:#78c1fc;border-color:#50affc}#bootstrap-theme .btn-info.disabled:hover,#bootstrap-theme .btn-info.disabled:focus,#bootstrap-theme .btn-info.disabled.focus,#bootstrap-theme .btn-info[disabled]:hover,#bootstrap-theme .btn-info[disabled]:focus,#bootstrap-theme .btn-info[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-info:hover,fieldset[disabled] #bootstrap-theme .btn-info:focus,fieldset[disabled] #bootstrap-theme .btn-info.focus{background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info .badge{color:#cde8fe;background-color:#000}#bootstrap-theme .btn-warning{color:#fff;background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning:focus,#bootstrap-theme .btn-warning.focus{color:#fff;background-color:#aa4200;border-color:#5e2400}#bootstrap-theme .btn-warning:hover{color:#fff;background-color:#aa4200;border-color:#a03e00}#bootstrap-theme .btn-warning:active,#bootstrap-theme .btn-warning.active,.open>#bootstrap-theme .btn-warning.dropdown-toggle{color:#fff;background-color:#aa4200;background-image:none;border-color:#a03e00}#bootstrap-theme .btn-warning:active:hover,#bootstrap-theme .btn-warning:active:focus,#bootstrap-theme .btn-warning:active.focus,#bootstrap-theme .btn-warning.active:hover,#bootstrap-theme .btn-warning.active:focus,#bootstrap-theme .btn-warning.active.focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle:hover,.open>#bootstrap-theme .btn-warning.dropdown-toggle:focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle.focus{color:#fff;background-color:#863400;border-color:#5e2400}#bootstrap-theme .btn-warning.disabled:hover,#bootstrap-theme .btn-warning.disabled:focus,#bootstrap-theme .btn-warning.disabled.focus,#bootstrap-theme .btn-warning[disabled]:hover,#bootstrap-theme .btn-warning[disabled]:focus,#bootstrap-theme .btn-warning[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-warning:hover,fieldset[disabled] #bootstrap-theme .btn-warning:focus,fieldset[disabled] #bootstrap-theme .btn-warning.focus{background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning .badge{color:#dd5600;background-color:#fff}#bootstrap-theme .btn-danger{color:#fff;background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger:focus,#bootstrap-theme .btn-danger.focus{color:#fff;background-color:#9a161a;border-color:#570c0f}#bootstrap-theme .btn-danger:hover{color:#fff;background-color:#9a161a;border-color:#911419}#bootstrap-theme .btn-danger:active,#bootstrap-theme .btn-danger.active,.open>#bootstrap-theme .btn-danger.dropdown-toggle{color:#fff;background-color:#9a161a;background-image:none;border-color:#911419}#bootstrap-theme .btn-danger:active:hover,#bootstrap-theme .btn-danger:active:focus,#bootstrap-theme .btn-danger:active.focus,#bootstrap-theme .btn-danger.active:hover,#bootstrap-theme .btn-danger.active:focus,#bootstrap-theme .btn-danger.active.focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle:hover,.open>#bootstrap-theme .btn-danger.dropdown-toggle:focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle.focus{color:#fff;background-color:#7b1115;border-color:#570c0f}#bootstrap-theme .btn-danger.disabled:hover,#bootstrap-theme .btn-danger.disabled:focus,#bootstrap-theme .btn-danger.disabled.focus,#bootstrap-theme .btn-danger[disabled]:hover,#bootstrap-theme .btn-danger[disabled]:focus,#bootstrap-theme .btn-danger[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-danger:hover,fieldset[disabled] #bootstrap-theme .btn-danger:focus,fieldset[disabled] #bootstrap-theme .btn-danger.focus{background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger .badge{color:#c71c22;background-color:#fff}#bootstrap-theme .btn-link{font-weight:400;color:#2786c2;border-radius:0}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:active,#bootstrap-theme .btn-link.active,#bootstrap-theme .btn-link[disabled],fieldset[disabled] #bootstrap-theme .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus,#bootstrap-theme .btn-link:active{border-color:transparent}#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus{color:#1a5a82;text-decoration:underline;background-color:transparent}#bootstrap-theme .btn-link[disabled]:hover,#bootstrap-theme .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .btn-link:hover,fieldset[disabled] #bootstrap-theme .btn-link:focus{color:#999;text-decoration:none}#bootstrap-theme .btn-lg,#bootstrap-theme .btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .btn-sm,#bootstrap-theme .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-xs,#bootstrap-theme .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-block{display:block;width:100%}#bootstrap-theme .btn-block+.btn-block{margin-top:5px}#bootstrap-theme input[type=submit].btn-block,#bootstrap-theme input[type=reset].btn-block,#bootstrap-theme input[type=button].btn-block{width:100%}#bootstrap-theme .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}#bootstrap-theme .fade.in{opacity:1}#bootstrap-theme .collapse{display:none}#bootstrap-theme .collapse.in{display:block}#bootstrap-theme tr.collapse.in{display:table-row}#bootstrap-theme tbody.collapse.in{display:table-row-group}#bootstrap-theme .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}#bootstrap-theme .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}#bootstrap-theme .dropup,#bootstrap-theme .dropdown{position:relative}#bootstrap-theme .dropdown-toggle:focus{outline:0}#bootstrap-theme .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}#bootstrap-theme .dropdown-menu.pull-right{right:0;left:auto}#bootstrap-theme .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}#bootstrap-theme .dropdown-menu>li>a:hover,#bootstrap-theme .dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#000}#bootstrap-theme .dropdown-menu>.active>a,#bootstrap-theme .dropdown-menu>.active>a:hover,#bootstrap-theme .dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;outline:0}#bootstrap-theme .dropdown-menu>.disabled>a,#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{color:#999}#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;-webkit-filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}#bootstrap-theme .open>.dropdown-menu{display:block}#bootstrap-theme .open>a{outline:0}#bootstrap-theme .dropdown-menu-right{right:0;left:auto}#bootstrap-theme .dropdown-menu-left{right:auto;left:0}#bootstrap-theme .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999;white-space:nowrap}#bootstrap-theme .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}#bootstrap-theme .pull-right>.dropdown-menu{right:0;left:auto}#bootstrap-theme .dropup .caret,#bootstrap-theme .navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9}#bootstrap-theme .dropup .dropdown-menu,#bootstrap-theme .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){#bootstrap-theme .navbar-right .dropdown-menu{right:0;left:auto}#bootstrap-theme .navbar-right .dropdown-menu-left{left:0;right:auto}}#bootstrap-theme .btn-group,#bootstrap-theme .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}#bootstrap-theme .btn-group>.btn,#bootstrap-theme .btn-group-vertical>.btn{position:relative;float:left}#bootstrap-theme .btn-group>.btn:hover,#bootstrap-theme .btn-group>.btn:focus,#bootstrap-theme .btn-group>.btn:active,#bootstrap-theme .btn-group>.btn.active,#bootstrap-theme .btn-group-vertical>.btn:hover,#bootstrap-theme .btn-group-vertical>.btn:focus,#bootstrap-theme .btn-group-vertical>.btn:active,#bootstrap-theme .btn-group-vertical>.btn.active{z-index:2}#bootstrap-theme .btn-group .btn+.btn,#bootstrap-theme .btn-group .btn+.btn-group,#bootstrap-theme .btn-group .btn-group+.btn,#bootstrap-theme .btn-group .btn-group+.btn-group{margin-left:-1px}#bootstrap-theme .btn-toolbar{margin-left:-5px}#bootstrap-theme .btn-toolbar:before,#bootstrap-theme .btn-toolbar:after{display:table;content:" "}#bootstrap-theme .btn-toolbar:after{clear:both}#bootstrap-theme .btn-toolbar .btn,#bootstrap-theme .btn-toolbar .btn-group,#bootstrap-theme .btn-toolbar .input-group{float:left}#bootstrap-theme .btn-toolbar>.btn,#bootstrap-theme .btn-toolbar>.btn-group,#bootstrap-theme .btn-toolbar>.input-group{margin-left:5px}#bootstrap-theme .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}#bootstrap-theme .btn-group>.btn:first-child{margin-left:0}#bootstrap-theme .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn:last-child:not(:first-child),#bootstrap-theme .btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group>.btn-group{float:left}#bootstrap-theme .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group .dropdown-toggle:active,#bootstrap-theme .btn-group.open .dropdown-toggle{outline:0}#bootstrap-theme .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}#bootstrap-theme .btn-group>.btn-lg+.dropdown-toggle,#bootstrap-theme .btn-group-lg.btn-group>.btn+.dropdown-toggle,#bootstrap-theme .btn-group-lg>.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}#bootstrap-theme .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn .caret{margin-left:0}#bootstrap-theme .btn-lg .caret,#bootstrap-theme .btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}#bootstrap-theme .dropup .btn-lg .caret,#bootstrap-theme .dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}#bootstrap-theme .btn-group-vertical>.btn,#bootstrap-theme .btn-group-vertical>.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}#bootstrap-theme .btn-group-vertical>.btn-group:before,#bootstrap-theme .btn-group-vertical>.btn-group:after{display:table;content:" "}#bootstrap-theme .btn-group-vertical>.btn-group:after{clear:both}#bootstrap-theme .btn-group-vertical>.btn-group>.btn{float:none}#bootstrap-theme .btn-group-vertical>.btn+.btn,#bootstrap-theme .btn-group-vertical>.btn+.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group+.btn,#bootstrap-theme .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}#bootstrap-theme .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}#bootstrap-theme .btn-group-justified>.btn,#bootstrap-theme .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}#bootstrap-theme .btn-group-justified>.btn-group .btn{width:100%}#bootstrap-theme .btn-group-justified>.btn-group .dropdown-menu{left:auto}#bootstrap-theme [data-toggle=buttons]>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn input[type=checkbox],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}#bootstrap-theme .input-group{position:relative;display:table;border-collapse:separate}#bootstrap-theme .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}#bootstrap-theme .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}#bootstrap-theme .input-group .form-control:focus{z-index:3}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn,#bootstrap-theme .input-group .form-control{display:table-cell}#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child),#bootstrap-theme .input-group-btn:not(:first-child):not(:last-child),#bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}#bootstrap-theme .input-group-addon{padding:4px 8px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}#bootstrap-theme .input-group-addon.input-sm,#bootstrap-theme .input-group-sm>.input-group-addon.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:12px;border-radius:3px}#bootstrap-theme .input-group-addon.input-lg,#bootstrap-theme .input-group-lg>.input-group-addon.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.input-group-addon.btn{padding:14px 16px;font-size:18px;border-radius:6px}#bootstrap-theme .input-group-addon input[type=radio],#bootstrap-theme .input-group-addon input[type=checkbox]{margin-top:0}#bootstrap-theme .input-group .form-control:first-child,#bootstrap-theme .input-group-addon:first-child,#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:first-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),#bootstrap-theme .input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .input-group-addon:first-child{border-right:0}#bootstrap-theme .input-group .form-control:last-child,#bootstrap-theme .input-group-addon:last-child,#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:last-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:first-child>.btn:not(:first-child),#bootstrap-theme .input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .input-group-addon:last-child{border-left:0}#bootstrap-theme .input-group-btn{position:relative;font-size:0;white-space:nowrap}#bootstrap-theme .input-group-btn>.btn{position:relative}#bootstrap-theme .input-group-btn>.btn+.btn{margin-left:-1px}#bootstrap-theme .input-group-btn>.btn:hover,#bootstrap-theme .input-group-btn>.btn:focus,#bootstrap-theme .input-group-btn>.btn:active{z-index:2}#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group{margin-right:-1px}#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}#bootstrap-theme .nav{padding-left:0;margin-bottom:0;list-style:none}#bootstrap-theme .nav:before,#bootstrap-theme .nav:after{display:table;content:" "}#bootstrap-theme .nav:after{clear:both}#bootstrap-theme .nav>li{position:relative;display:block}#bootstrap-theme .nav>li>a{position:relative;display:block;padding:10px 15px}#bootstrap-theme .nav>li>a:hover,#bootstrap-theme .nav>li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .nav>li.disabled>a{color:#999}#bootstrap-theme .nav>li.disabled>a:hover,#bootstrap-theme .nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}#bootstrap-theme .nav .open>a,#bootstrap-theme .nav .open>a:hover,#bootstrap-theme .nav .open>a:focus{background-color:#eee;border-color:#2786c2}#bootstrap-theme .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .nav>li>a>img{max-width:none}#bootstrap-theme .nav-tabs{border-bottom:1px solid #ddd}#bootstrap-theme .nav-tabs>li{float:left;margin-bottom:-1px}#bootstrap-theme .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}#bootstrap-theme .nav-tabs>li.active>a,#bootstrap-theme .nav-tabs>li.active>a:hover,#bootstrap-theme .nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}#bootstrap-theme .nav-pills>li{float:left}#bootstrap-theme .nav-pills>li>a{border-radius:4px}#bootstrap-theme .nav-pills>li+li{margin-left:2px}#bootstrap-theme .nav-pills>li.active>a,#bootstrap-theme .nav-pills>li.active>a:hover,#bootstrap-theme .nav-pills>li.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .nav-stacked>li{float:none}#bootstrap-theme .nav-stacked>li+li{margin-top:2px;margin-left:0}#bootstrap-theme .nav-justified,#bootstrap-theme .nav-tabs.nav-justified{width:100%}#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{float:none}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}#bootstrap-theme .nav-justified>.dropdown .dropdown-menu,#bootstrap-theme .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{display:table-cell;width:1%}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:0}}#bootstrap-theme .nav-tabs-justified,#bootstrap-theme .nav-tabs.nav-justified{border-bottom:0}#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}#bootstrap-theme .tab-content>.tab-pane{display:none}#bootstrap-theme .tab-content>.active{display:block}#bootstrap-theme .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}#bootstrap-theme .navbar:before,#bootstrap-theme .navbar:after{display:table;content:" "}#bootstrap-theme .navbar:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar{border-radius:4px}}#bootstrap-theme .navbar-header:before,#bootstrap-theme .navbar-header:after{display:table;content:" "}#bootstrap-theme .navbar-header:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar-header{float:left}}#bootstrap-theme .navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}#bootstrap-theme .navbar-collapse:before,#bootstrap-theme .navbar-collapse:after{display:table;content:" "}#bootstrap-theme .navbar-collapse:after{clear:both}#bootstrap-theme .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){#bootstrap-theme .navbar-collapse{width:auto;border-top:0;box-shadow:none}#bootstrap-theme .navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}#bootstrap-theme .navbar-collapse.in{overflow-y:visible}.navbar-fixed-top #bootstrap-theme .navbar-collapse,.navbar-static-top #bootstrap-theme .navbar-collapse,.navbar-fixed-bottom #bootstrap-theme .navbar-collapse{padding-right:0;padding-left:0}}#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:200px}}@media (min-width:768px){#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{border-radius:0}}#bootstrap-theme .navbar-fixed-top{top:0;border-width:0 0 1px}#bootstrap-theme .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}#bootstrap-theme .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){#bootstrap-theme .navbar-static-top{border-radius:0}}#bootstrap-theme .navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}#bootstrap-theme .navbar-brand:hover,#bootstrap-theme .navbar-brand:focus{text-decoration:none}#bootstrap-theme .navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container #bootstrap-theme .navbar-brand,.navbar>.container-fluid #bootstrap-theme .navbar-brand{margin-left:-15px}}#bootstrap-theme .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}#bootstrap-theme .navbar-toggle:focus{outline:0}#bootstrap-theme .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}#bootstrap-theme .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){#bootstrap-theme .navbar-toggle{display:none}}#bootstrap-theme .navbar-nav{margin:7.5px -15px}#bootstrap-theme .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){#bootstrap-theme .navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a,#bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a{line-height:20px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){#bootstrap-theme .navbar-nav{float:left;margin:0}#bootstrap-theme .navbar-nav>li{float:left}#bootstrap-theme .navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}#bootstrap-theme .navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:10px;margin-bottom:10px}@media (min-width:768px){#bootstrap-theme .navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .navbar-form .form-control-static{display:inline-block}#bootstrap-theme .navbar-form .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .navbar-form .input-group .input-group-addon,#bootstrap-theme .navbar-form .input-group .input-group-btn,#bootstrap-theme .navbar-form .input-group .form-control{width:auto}#bootstrap-theme .navbar-form .input-group>.form-control{width:100%}#bootstrap-theme .navbar-form .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio,#bootstrap-theme .navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio label,#bootstrap-theme .navbar-form .checkbox label{padding-left:0}#bootstrap-theme .navbar-form .radio input[type=radio],#bootstrap-theme .navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){#bootstrap-theme .navbar-form .form-group{margin-bottom:5px}#bootstrap-theme .navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){#bootstrap-theme .navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}#bootstrap-theme .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .navbar-btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-sm,#bootstrap-theme .btn-group-sm>.navbar-btn.btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-xs,#bootstrap-theme .btn-group-xs>.navbar-btn.btn{margin-top:14px;margin-bottom:14px}#bootstrap-theme .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){#bootstrap-theme .navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){#bootstrap-theme .navbar-left{float:left !important}#bootstrap-theme .navbar-right{float:right !important;margin-right:-15px}#bootstrap-theme .navbar-right~.navbar-right{margin-right:0}}#bootstrap-theme .navbar-default{background-color:#000;border-color:#000}#bootstrap-theme .navbar-default .navbar-brand{color:#fff}#bootstrap-theme .navbar-default .navbar-brand:hover,#bootstrap-theme .navbar-default .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-default .navbar-text{color:#ddd}#bootstrap-theme .navbar-default .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.active>a,#bootstrap-theme .navbar-default .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:focus{color:#ddd;background-color:transparent}#bootstrap-theme .navbar-default .navbar-nav>.open>a,#bootstrap-theme .navbar-default .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#000}@media (max-width:767px){#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ddd;background-color:transparent}}#bootstrap-theme .navbar-default .navbar-toggle{border-color:#000}#bootstrap-theme .navbar-default .navbar-toggle:hover,#bootstrap-theme .navbar-default .navbar-toggle:focus{background-color:#000}#bootstrap-theme .navbar-default .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-default .navbar-collapse,#bootstrap-theme .navbar-default .navbar-form{border-color:#000}#bootstrap-theme .navbar-default .navbar-link{color:#fff}#bootstrap-theme .navbar-default .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-default .btn-link{color:#fff}#bootstrap-theme .navbar-default .btn-link:hover,#bootstrap-theme .navbar-default .btn-link:focus{color:#fff}#bootstrap-theme .navbar-default .btn-link[disabled]:hover,#bootstrap-theme .navbar-default .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus{color:#ddd}#bootstrap-theme .navbar-inverse{background-color:#cde8fe;border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-brand{color:#fff}#bootstrap-theme .navbar-inverse .navbar-brand:hover,#bootstrap-theme .navbar-inverse .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-inverse .navbar-text{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}#bootstrap-theme .navbar-inverse .navbar-nav>.open>a,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#b4ddfe}@media (max-width:767px){#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}#bootstrap-theme .navbar-inverse .navbar-toggle{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle:hover,#bootstrap-theme .navbar-inverse .navbar-toggle:focus{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-inverse .navbar-collapse,#bootstrap-theme .navbar-inverse .navbar-form{border-color:#aad8fd}#bootstrap-theme .navbar-inverse .navbar-link{color:#fff}#bootstrap-theme .navbar-inverse .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-inverse .btn-link{color:#fff}#bootstrap-theme .navbar-inverse .btn-link:hover,#bootstrap-theme .navbar-inverse .btn-link:focus{color:#fff}#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover,#bootstrap-theme .navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus{color:#ccc}#bootstrap-theme .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}#bootstrap-theme .breadcrumb>li{display:inline-block}#bootstrap-theme .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/ "}#bootstrap-theme .breadcrumb>.active{color:#999}#bootstrap-theme .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}#bootstrap-theme .pagination>li{display:inline}#bootstrap-theme .pagination>li>a,#bootstrap-theme .pagination>li>span{position:relative;float:left;padding:4px 8px;margin-left:-1px;line-height:1.428571429;color:#2786c2;text-decoration:none;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .pagination>li>a:hover,#bootstrap-theme .pagination>li>a:focus,#bootstrap-theme .pagination>li>span:hover,#bootstrap-theme .pagination>li>span:focus{z-index:2;color:#1a5a82;background-color:#eee;border-color:#ddd}#bootstrap-theme .pagination>li:first-child>a,#bootstrap-theme .pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .pagination>li:last-child>a,#bootstrap-theme .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}#bootstrap-theme .pagination>.active>a,#bootstrap-theme .pagination>.active>a:hover,#bootstrap-theme .pagination>.active>a:focus,#bootstrap-theme .pagination>.active>span,#bootstrap-theme .pagination>.active>span:hover,#bootstrap-theme .pagination>.active>span:focus{z-index:3;color:#999;cursor:default;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .pagination>.disabled>span,#bootstrap-theme .pagination>.disabled>span:hover,#bootstrap-theme .pagination>.disabled>span:focus,#bootstrap-theme .pagination>.disabled>a,#bootstrap-theme .pagination>.disabled>a:hover,#bootstrap-theme .pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}#bootstrap-theme .pagination-lg>li>a,#bootstrap-theme .pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .pagination-lg>li:first-child>a,#bootstrap-theme .pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}#bootstrap-theme .pagination-lg>li:last-child>a,#bootstrap-theme .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}#bootstrap-theme .pagination-sm>li>a,#bootstrap-theme .pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .pagination-sm>li:first-child>a,#bootstrap-theme .pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .pagination-sm>li:last-child>a,#bootstrap-theme .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}#bootstrap-theme .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}#bootstrap-theme .pager:before,#bootstrap-theme .pager:after{display:table;content:" "}#bootstrap-theme .pager:after{clear:both}#bootstrap-theme .pager li{display:inline}#bootstrap-theme .pager li>a,#bootstrap-theme .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}#bootstrap-theme .pager li>a:hover,#bootstrap-theme .pager li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .pager .next>a,#bootstrap-theme .pager .next>span{float:right}#bootstrap-theme .pager .previous>a,#bootstrap-theme .pager .previous>span{float:left}#bootstrap-theme .pager .disabled>a,#bootstrap-theme .pager .disabled>a:hover,#bootstrap-theme .pager .disabled>a:focus,#bootstrap-theme .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}#bootstrap-theme .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}#bootstrap-theme .label:empty{display:none}.btn #bootstrap-theme .label{position:relative;top:-1px}#bootstrap-theme a.label:hover,#bootstrap-theme a.label:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .label-default{background-color:#999}#bootstrap-theme .label-default[href]:hover,#bootstrap-theme .label-default[href]:focus{background-color:gray}#bootstrap-theme .label-primary{background-color:#000}#bootstrap-theme .label-primary[href]:hover,#bootstrap-theme .label-primary[href]:focus{background-color:#000}#bootstrap-theme .label-success{background-color:#73a839}#bootstrap-theme .label-success[href]:hover,#bootstrap-theme .label-success[href]:focus{background-color:#59822c}#bootstrap-theme .label-info{background-color:#cde8fe}#bootstrap-theme .label-info[href]:hover,#bootstrap-theme .label-info[href]:focus{background-color:#9bd1fd}#bootstrap-theme .label-warning{background-color:#dd5600}#bootstrap-theme .label-warning[href]:hover,#bootstrap-theme .label-warning[href]:focus{background-color:#aa4200}#bootstrap-theme .label-danger{background-color:#c71c22}#bootstrap-theme .label-danger[href]:hover,#bootstrap-theme .label-danger[href]:focus{background-color:#9a161a}#bootstrap-theme .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#000;border-radius:10px}#bootstrap-theme .badge:empty{display:none}.btn #bootstrap-theme .badge{position:relative;top:-1px}.btn-xs #bootstrap-theme .badge,#bootstrap-theme .btn-group-xs>.btn #bootstrap-theme .badge,.btn-group-xs>.btn #bootstrap-theme .badge{top:0;padding:1px 5px}.list-group-item.active>#bootstrap-theme .badge,.nav-pills>.active>a>#bootstrap-theme .badge{color:#2786c2;background-color:#fff}.list-group-item>#bootstrap-theme .badge{float:right}.list-group-item>#bootstrap-theme .badge+#bootstrap-theme .badge{margin-right:5px}.nav-pills>li>a>#bootstrap-theme .badge{margin-left:3px}#bootstrap-theme a.badge:hover,#bootstrap-theme a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{color:inherit}#bootstrap-theme .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}#bootstrap-theme .jumbotron>hr{border-top-color:#d5d5d5}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}#bootstrap-theme .jumbotron .container{max-width:100%}@media screen and (min-width:768px){#bootstrap-theme .jumbotron{padding-top:48px;padding-bottom:48px}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:60px;padding-left:60px}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{font-size:63px}}#bootstrap-theme .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}#bootstrap-theme .thumbnail>img,#bootstrap-theme .thumbnail a>img{display:block;max-width:100%;height:auto;margin-right:auto;margin-left:auto}#bootstrap-theme .thumbnail .caption{padding:9px;color:#555}#bootstrap-theme a.thumbnail:hover,#bootstrap-theme a.thumbnail:focus,#bootstrap-theme a.thumbnail.active{border-color:#2786c2}#bootstrap-theme .alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}#bootstrap-theme .alert h4{margin-top:0;color:inherit}#bootstrap-theme .alert .alert-link{font-weight:700}#bootstrap-theme .alert>p,#bootstrap-theme .alert>ul{margin-bottom:0}#bootstrap-theme .alert>p+p{margin-top:5px}#bootstrap-theme .alert-dismissable,#bootstrap-theme .alert-dismissible{padding-right:35px}#bootstrap-theme .alert-dismissable .close,#bootstrap-theme .alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}#bootstrap-theme .alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}#bootstrap-theme .alert-success hr{border-top-color:#c9e2b3}#bootstrap-theme .alert-success .alert-link{color:#356635}#bootstrap-theme .alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#bootstrap-theme .alert-info hr{border-top-color:#a6e1ec}#bootstrap-theme .alert-info .alert-link{color:#2d6987}#bootstrap-theme .alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}#bootstrap-theme .alert-warning hr{border-top-color:#f8e5be}#bootstrap-theme .alert-warning .alert-link{color:#a47e3c}#bootstrap-theme .alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}#bootstrap-theme .alert-danger hr{border-top-color:#e6c1c7}#bootstrap-theme .alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}#bootstrap-theme .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}#bootstrap-theme .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#000;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}#bootstrap-theme .progress-striped .progress-bar,#bootstrap-theme .progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}#bootstrap-theme .progress.active .progress-bar,#bootstrap-theme .progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}#bootstrap-theme .progress-bar-success{background-color:#73a839}.progress-striped #bootstrap-theme .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-info{background-color:#cde8fe}.progress-striped #bootstrap-theme .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-warning{background-color:#dd5600}.progress-striped #bootstrap-theme .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-danger{background-color:#c71c22}.progress-striped #bootstrap-theme .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .media{margin-top:15px}#bootstrap-theme .media:first-child{margin-top:0}#bootstrap-theme .media,#bootstrap-theme .media-body{overflow:hidden;zoom:1}#bootstrap-theme .media-body{width:10000px}#bootstrap-theme .media-object{display:block}#bootstrap-theme .media-object.img-thumbnail{max-width:none}#bootstrap-theme .media-right,#bootstrap-theme .media>.pull-right{padding-left:10px}#bootstrap-theme .media-left,#bootstrap-theme .media>.pull-left{padding-right:10px}#bootstrap-theme .media-left,#bootstrap-theme .media-right,#bootstrap-theme .media-body{display:table-cell;vertical-align:top}#bootstrap-theme .media-middle{vertical-align:middle}#bootstrap-theme .media-bottom{vertical-align:bottom}#bootstrap-theme .media-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .media-list{padding-left:0;list-style:none}#bootstrap-theme .list-group{padding-left:0;margin-bottom:20px}#bootstrap-theme .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}#bootstrap-theme .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .list-group-item.disabled,#bootstrap-theme .list-group-item.disabled:hover,#bootstrap-theme .list-group-item.disabled:focus{color:#999;cursor:not-allowed;background-color:#eee}#bootstrap-theme .list-group-item.disabled .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading{color:inherit}#bootstrap-theme .list-group-item.disabled .list-group-item-text,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-text,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-text{color:#999}#bootstrap-theme .list-group-item.active,#bootstrap-theme .list-group-item.active:hover,#bootstrap-theme .list-group-item.active:focus{z-index:2;color:#fff;background-color:#000;border-color:#000}#bootstrap-theme .list-group-item.active .list-group-item-heading,#bootstrap-theme .list-group-item.active .list-group-item-heading>small,#bootstrap-theme .list-group-item.active .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>.small{color:inherit}#bootstrap-theme .list-group-item.active .list-group-item-text,#bootstrap-theme .list-group-item.active:hover .list-group-item-text,#bootstrap-theme .list-group-item.active:focus .list-group-item-text{color:#666}#bootstrap-theme a.list-group-item,#bootstrap-theme button.list-group-item{color:#555}#bootstrap-theme a.list-group-item .list-group-item-heading,#bootstrap-theme button.list-group-item .list-group-item-heading{color:#333}#bootstrap-theme a.list-group-item:hover,#bootstrap-theme a.list-group-item:focus,#bootstrap-theme button.list-group-item:hover,#bootstrap-theme button.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}#bootstrap-theme button.list-group-item{width:100%;text-align:left}#bootstrap-theme .list-group-item-success{color:#468847;background-color:#dff0d8}#bootstrap-theme a.list-group-item-success,#bootstrap-theme button.list-group-item-success{color:#468847}#bootstrap-theme a.list-group-item-success .list-group-item-heading,#bootstrap-theme button.list-group-item-success .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-success:hover,#bootstrap-theme a.list-group-item-success:focus,#bootstrap-theme button.list-group-item-success:hover,#bootstrap-theme button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}#bootstrap-theme a.list-group-item-success.active,#bootstrap-theme a.list-group-item-success.active:hover,#bootstrap-theme a.list-group-item-success.active:focus,#bootstrap-theme button.list-group-item-success.active,#bootstrap-theme button.list-group-item-success.active:hover,#bootstrap-theme button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}#bootstrap-theme .list-group-item-info{color:#3a87ad;background-color:#d9edf7}#bootstrap-theme a.list-group-item-info,#bootstrap-theme button.list-group-item-info{color:#3a87ad}#bootstrap-theme a.list-group-item-info .list-group-item-heading,#bootstrap-theme button.list-group-item-info .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-info:hover,#bootstrap-theme a.list-group-item-info:focus,#bootstrap-theme button.list-group-item-info:hover,#bootstrap-theme button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}#bootstrap-theme a.list-group-item-info.active,#bootstrap-theme a.list-group-item-info.active:hover,#bootstrap-theme a.list-group-item-info.active:focus,#bootstrap-theme button.list-group-item-info.active,#bootstrap-theme button.list-group-item-info.active:hover,#bootstrap-theme button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}#bootstrap-theme .list-group-item-warning{color:#c09853;background-color:#fcf8e3}#bootstrap-theme a.list-group-item-warning,#bootstrap-theme button.list-group-item-warning{color:#c09853}#bootstrap-theme a.list-group-item-warning .list-group-item-heading,#bootstrap-theme button.list-group-item-warning .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-warning:hover,#bootstrap-theme a.list-group-item-warning:focus,#bootstrap-theme button.list-group-item-warning:hover,#bootstrap-theme button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}#bootstrap-theme a.list-group-item-warning.active,#bootstrap-theme a.list-group-item-warning.active:hover,#bootstrap-theme a.list-group-item-warning.active:focus,#bootstrap-theme button.list-group-item-warning.active,#bootstrap-theme button.list-group-item-warning.active:hover,#bootstrap-theme button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}#bootstrap-theme .list-group-item-danger{color:#b94a48;background-color:#f2dede}#bootstrap-theme a.list-group-item-danger,#bootstrap-theme button.list-group-item-danger{color:#b94a48}#bootstrap-theme a.list-group-item-danger .list-group-item-heading,#bootstrap-theme button.list-group-item-danger .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-danger:hover,#bootstrap-theme a.list-group-item-danger:focus,#bootstrap-theme button.list-group-item-danger:hover,#bootstrap-theme button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}#bootstrap-theme a.list-group-item-danger.active,#bootstrap-theme a.list-group-item-danger.active:hover,#bootstrap-theme a.list-group-item-danger.active:focus,#bootstrap-theme button.list-group-item-danger.active,#bootstrap-theme button.list-group-item-danger.active:hover,#bootstrap-theme button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}#bootstrap-theme .list-group-item-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .list-group-item-text{margin-bottom:0;line-height:1.3}#bootstrap-theme .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .panel-body{padding:15px}#bootstrap-theme .panel-body:before,#bootstrap-theme .panel-body:after{display:table;content:" "}#bootstrap-theme .panel-body:after{clear:both}#bootstrap-theme .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel-heading>.dropdown .dropdown-toggle{color:inherit}#bootstrap-theme .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}#bootstrap-theme .panel-title>a,#bootstrap-theme .panel-title>small,#bootstrap-theme .panel-title>.small,#bootstrap-theme .panel-title>small>a,#bootstrap-theme .panel-title>.small>a{color:inherit}#bootstrap-theme .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.list-group,#bootstrap-theme .panel>.panel-collapse>.list-group{margin-bottom:0}#bootstrap-theme .panel>.list-group .list-group-item,#bootstrap-theme .panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}#bootstrap-theme .panel>.list-group:first-child .list-group-item:first-child,#bootstrap-theme .panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.list-group:last-child .list-group-item:last-child,#bootstrap-theme .panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}#bootstrap-theme .list-group+.panel-footer{border-top-width:0}#bootstrap-theme .panel>.table,#bootstrap-theme .panel>.table-responsive>.table,#bootstrap-theme .panel>.panel-collapse>.table{margin-bottom:0}#bootstrap-theme .panel>.table caption,#bootstrap-theme .panel>.table-responsive>.table caption,#bootstrap-theme .panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}#bootstrap-theme .panel>.table:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}#bootstrap-theme .panel>.table:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}#bootstrap-theme .panel>.panel-body+.table,#bootstrap-theme .panel>.panel-body+.table-responsive,#bootstrap-theme .panel>.table+.panel-body,#bootstrap-theme .panel>.table-responsive+.panel-body{border-top:1px solid #ddd}#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child th,#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child td{border-top:0}#bootstrap-theme .panel>.table-bordered,#bootstrap-theme .panel>.table-responsive>.table-bordered{border:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}#bootstrap-theme .panel>.table-responsive{margin-bottom:0;border:0}#bootstrap-theme .panel-group{margin-bottom:20px}#bootstrap-theme .panel-group .panel{margin-bottom:0;border-radius:4px}#bootstrap-theme .panel-group .panel+.panel{margin-top:5px}#bootstrap-theme .panel-group .panel-heading{border-bottom:0}#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.panel-body,#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}#bootstrap-theme .panel-group .panel-footer{border-top:0}#bootstrap-theme .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}#bootstrap-theme .panel-default{border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading{color:#555;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#555}#bootstrap-theme .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-primary{border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading{color:#fff;background-color:#000;border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading .badge{color:#000;background-color:#fff}#bootstrap-theme .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-success{border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading{color:#468847;background-color:#73a839;border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-success>.panel-heading .badge{color:#73a839;background-color:#468847}#bootstrap-theme .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-info{border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading{color:#3a87ad;background-color:#cde8fe;border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-info>.panel-heading .badge{color:#cde8fe;background-color:#3a87ad}#bootstrap-theme .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-warning{border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading{color:#c09853;background-color:#dd5600;border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading .badge{color:#dd5600;background-color:#c09853}#bootstrap-theme .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-danger{border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading{color:#b94a48;background-color:#c71c22;border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading .badge{color:#c71c22;background-color:#b94a48}#bootstrap-theme .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}#bootstrap-theme .embed-responsive .embed-responsive-item,#bootstrap-theme .embed-responsive iframe,#bootstrap-theme .embed-responsive embed,#bootstrap-theme .embed-responsive object,#bootstrap-theme .embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}#bootstrap-theme .embed-responsive-16by9{padding-bottom:56.25%}#bootstrap-theme .embed-responsive-4by3{padding-bottom:75%}#bootstrap-theme .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}#bootstrap-theme .well-lg{padding:24px;border-radius:6px}#bootstrap-theme .well-sm{padding:9px;border-radius:3px}#bootstrap-theme .close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;-webkit-filter:alpha(opacity=20);filter:alpha(opacity=20);opacity:.2}#bootstrap-theme .close:hover,#bootstrap-theme .close:focus{color:#000;text-decoration:none;cursor:pointer;-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme .modal-open{overflow:hidden}#bootstrap-theme .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}#bootstrap-theme .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-ms-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out}#bootstrap-theme .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}#bootstrap-theme .modal-open .modal{overflow-x:hidden;overflow-y:auto}#bootstrap-theme .modal-dialog{position:relative;width:auto;margin:10px}#bootstrap-theme .modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}#bootstrap-theme .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}#bootstrap-theme .modal-backdrop.fade{-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .modal-backdrop.in{-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .modal-header{padding:15px;border-bottom:1px solid #e5e5e5}#bootstrap-theme .modal-header:before,#bootstrap-theme .modal-header:after{display:table;content:" "}#bootstrap-theme .modal-header:after{clear:both}#bootstrap-theme .modal-header .close{margin-top:-2px}#bootstrap-theme .modal-title{margin:0;line-height:1.428571429}#bootstrap-theme .modal-body{position:relative;padding:20px}#bootstrap-theme .modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}#bootstrap-theme .modal-footer:before,#bootstrap-theme .modal-footer:after{display:table;content:" "}#bootstrap-theme .modal-footer:after{clear:both}#bootstrap-theme .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}#bootstrap-theme .modal-footer .btn-group .btn+.btn{margin-left:-1px}#bootstrap-theme .modal-footer .btn-block+.btn-block{margin-left:0}#bootstrap-theme .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){#bootstrap-theme .modal-dialog{width:600px;margin:30px auto}#bootstrap-theme .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}#bootstrap-theme .modal-sm{width:300px}}@media (min-width:992px){#bootstrap-theme .modal-lg{width:900px}}#bootstrap-theme .tooltip{position:absolute;z-index:1070;display:block;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .tooltip.in{-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .tooltip.top{padding:5px 0;margin-top:-3px}#bootstrap-theme .tooltip.right{padding:0 5px;margin-left:3px}#bootstrap-theme .tooltip.bottom{padding:5px 0;margin-top:3px}#bootstrap-theme .tooltip.left{padding:0 5px;margin-left:-3px}#bootstrap-theme .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}#bootstrap-theme .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}#bootstrap-theme .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}#bootstrap-theme .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}#bootstrap-theme .popover.top{margin-top:-10px}#bootstrap-theme .popover.right{margin-left:10px}#bootstrap-theme .popover.bottom{margin-top:10px}#bootstrap-theme .popover.left{margin-left:-10px}#bootstrap-theme .popover>.arrow{border-width:11px}#bootstrap-theme .popover>.arrow,#bootstrap-theme .popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover>.arrow:after{content:"";border-width:10px}#bootstrap-theme .popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}#bootstrap-theme .popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}#bootstrap-theme .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}#bootstrap-theme .popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}#bootstrap-theme .popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}#bootstrap-theme .popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}#bootstrap-theme .popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}#bootstrap-theme .popover-content{padding:9px 14px}#bootstrap-theme .carousel{position:relative}#bootstrap-theme .carousel-inner{position:relative;width:100%;overflow:hidden}#bootstrap-theme .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}#bootstrap-theme .carousel-inner>.item>img,#bootstrap-theme .carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}@media (transform-3d),(-webkit-transform-3d){#bootstrap-theme .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-ms-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}#bootstrap-theme .carousel-inner>.item.next,#bootstrap-theme .carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.prev,#bootstrap-theme .carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.next.left,#bootstrap-theme .carousel-inner>.item.prev.right,#bootstrap-theme .carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}#bootstrap-theme .carousel-inner>.active,#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{display:block}#bootstrap-theme .carousel-inner>.active{left:0}#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{position:absolute;top:0;width:100%}#bootstrap-theme .carousel-inner>.next{left:100%}#bootstrap-theme .carousel-inner>.prev{left:-100%}#bootstrap-theme .carousel-inner>.next.left,#bootstrap-theme .carousel-inner>.prev.right{left:0}#bootstrap-theme .carousel-inner>.active.left{left:-100%}#bootstrap-theme .carousel-inner>.active.right{left:100%}#bootstrap-theme .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control:hover,#bootstrap-theme .carousel-control:focus{color:#fff;text-decoration:none;outline:0;-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:20px;height:20px;font-family:serif;line-height:1}#bootstrap-theme .carousel-control .icon-prev:before{content:"‹"}#bootstrap-theme .carousel-control .icon-next:before{content:"›"}#bootstrap-theme .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}#bootstrap-theme .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}#bootstrap-theme .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}#bootstrap-theme .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}#bootstrap-theme .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .icon-prev{margin-left:-10px}#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-next{margin-right:-10px}#bootstrap-theme .carousel-caption{right:20%;left:20%;padding-bottom:30px}#bootstrap-theme .carousel-indicators{bottom:20px}}#bootstrap-theme .clearfix:before,#bootstrap-theme .clearfix:after{display:table;content:" "}#bootstrap-theme .clearfix:after{clear:both}#bootstrap-theme .center-block{display:block;margin-right:auto;margin-left:auto}#bootstrap-theme .pull-right{float:right !important}#bootstrap-theme .pull-left{float:left !important}#bootstrap-theme .hide{display:none !important}#bootstrap-theme .show{display:block !important}#bootstrap-theme .invisible{visibility:hidden}#bootstrap-theme .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}#bootstrap-theme .hidden{display:none !important}#bootstrap-theme .affix{position:fixed}@-ms-viewport{width:device-width}#bootstrap-theme .visible-sm{display:none !important}#bootstrap-theme .visible-md{display:none !important}#bootstrap-theme .visible-lg{display:none !important}#bootstrap-theme .visible-xs-block,#bootstrap-theme .visible-xs-inline,#bootstrap-theme .visible-xs-inline-block,#bootstrap-theme .visible-sm-block,#bootstrap-theme .visible-sm-inline,#bootstrap-theme .visible-sm-inline-block,#bootstrap-theme .visible-md-block,#bootstrap-theme .visible-md-inline,#bootstrap-theme .visible-md-inline-block,#bootstrap-theme .visible-lg-block,#bootstrap-theme .visible-lg-inline,#bootstrap-theme .visible-lg-inline-block{display:none !important}@media (max-width:767px){#bootstrap-theme .visible-xs{display:block !important}#bootstrap-theme table.visible-xs{display:table !important}#bootstrap-theme tr.visible-xs{display:table-row !important}#bootstrap-theme th.visible-xs,#bootstrap-theme td.visible-xs{display:table-cell !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-block{display:block !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline{display:inline !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm{display:block !important}#bootstrap-theme table.visible-sm{display:table !important}#bootstrap-theme tr.visible-sm{display:table-row !important}#bootstrap-theme th.visible-sm,#bootstrap-theme td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md{display:block !important}#bootstrap-theme table.visible-md{display:table !important}#bootstrap-theme tr.visible-md{display:table-row !important}#bootstrap-theme th.visible-md,#bootstrap-theme td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg{display:block !important}#bootstrap-theme table.visible-lg{display:table !important}#bootstrap-theme tr.visible-lg{display:table-row !important}#bootstrap-theme th.visible-lg,#bootstrap-theme td.visible-lg{display:table-cell !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-block{display:block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline{display:inline !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){#bootstrap-theme .hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .hidden-md{display:none !important}}@media (min-width:1200px){#bootstrap-theme .hidden-lg{display:none !important}}#bootstrap-theme .visible-print{display:none !important}@media print{#bootstrap-theme .visible-print{display:block !important}#bootstrap-theme table.visible-print{display:table !important}#bootstrap-theme tr.visible-print{display:table-row !important}#bootstrap-theme th.visible-print,#bootstrap-theme td.visible-print{display:table-cell !important}}#bootstrap-theme .visible-print-block{display:none !important}@media print{#bootstrap-theme .visible-print-block{display:block !important}}#bootstrap-theme .visible-print-inline{display:none !important}@media print{#bootstrap-theme .visible-print-inline{display:inline !important}}#bootstrap-theme .visible-print-inline-block{display:none !important}@media print{#bootstrap-theme .visible-print-inline-block{display:inline-block !important}}@media print{#bootstrap-theme .hidden-print{display:none !important}}#bootstrap-theme ul,#bootstrap-theme ol{margin-left:0;margin-right:0}#bootstrap-theme .form-control.checkbox-inline>label{margin-left:9px}#bootstrap-theme label input[type=checkbox]:not(:checked)+*{font-weight:400}#bootstrap-theme .select2-choices{margin-bottom:0}#bootstrap-theme input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}#bootstrap-theme .select2-container .select2-choice>.select2-chosen{font-size:inherit;font-weight:400}#bootstrap-theme summary{display:list-item}#bootstrap-theme .form-control .select2-choice{border:0;border-radius:2px}#bootstrap-theme .form-control .select2-choice .select2-arrow{border-radius:0 2px 2px 0}#bootstrap-theme .form-control.select2-container{height:auto !important;padding:0}#bootstrap-theme .form-control.select2-container.select2-dropdown-open{border-color:#5897fb;border-radius:3px 3px 0 0}#bootstrap-theme .form-control .select2-container.select2-dropdown-open .select2-choices{border-radius:3px 3px 0 0}#bootstrap-theme .form-control.select2-container .select2-choices{border:0 !important;border-radius:3px}#bootstrap-theme .control-group.warning .select2-container .select2-choice,#bootstrap-theme .control-group.warning .select2-container .select2-choices,#bootstrap-theme .control-group.warning .select2-container-active .select2-choice,#bootstrap-theme .control-group.warning .select2-container-active .select2-choices,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.warning .select2-container-multi.select2-container-active .select2-choices{border:1px solid #c09853 !important}#bootstrap-theme .control-group.warning .select2-container .select2-choice div{border-left:1px solid #c09853 !important;background:#fcf8e3 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice,#bootstrap-theme .control-group.error .select2-container .select2-choices,#bootstrap-theme .control-group.error .select2-container-active .select2-choice,#bootstrap-theme .control-group.error .select2-container-active .select2-choices,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.error .select2-container-multi.select2-container-active .select2-choices{border:1px solid #b94a48 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice div{border-left:1px solid #b94a48 !important;background:#f2dede !important}#bootstrap-theme .control-group.info .select2-container .select2-choice,#bootstrap-theme .control-group.info .select2-container .select2-choices,#bootstrap-theme .control-group.info .select2-container-active .select2-choice,#bootstrap-theme .control-group.info .select2-container-active .select2-choices,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.info .select2-container-multi.select2-container-active .select2-choices{border:1px solid #3a87ad !important}#bootstrap-theme .control-group.info .select2-container .select2-choice div{border-left:1px solid #3a87ad !important;background:#d9edf7 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice,#bootstrap-theme .control-group.success .select2-container .select2-choices,#bootstrap-theme .control-group.success .select2-container-active .select2-choice,#bootstrap-theme .control-group.success .select2-container-active .select2-choices,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.success .select2-container-multi.select2-container-active .select2-choices{border:1px solid #468847 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice div{border-left:1px solid #468847 !important;background:#dff0d8 !important}
\ No newline at end of file
+@charset "UTF-8";#bootstrap-theme html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}#bootstrap-theme body{margin:0}#bootstrap-theme article,#bootstrap-theme aside,#bootstrap-theme details,#bootstrap-theme figcaption,#bootstrap-theme figure,#bootstrap-theme footer,#bootstrap-theme header,#bootstrap-theme hgroup,#bootstrap-theme main,#bootstrap-theme menu,#bootstrap-theme nav,#bootstrap-theme section,#bootstrap-theme summary{display:block}#bootstrap-theme audio,#bootstrap-theme canvas,#bootstrap-theme progress,#bootstrap-theme video{display:inline-block;vertical-align:baseline}#bootstrap-theme audio:not([controls]){display:none;height:0}#bootstrap-theme [hidden],#bootstrap-theme template{display:none}#bootstrap-theme a{background-color:transparent}#bootstrap-theme a:active,#bootstrap-theme a:hover{outline:0}#bootstrap-theme abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}#bootstrap-theme b,#bootstrap-theme strong{font-weight:700}#bootstrap-theme dfn{font-style:italic}#bootstrap-theme h1{font-size:2em;margin:.67em 0}#bootstrap-theme mark{background:#ff0;color:#000}#bootstrap-theme small{font-size:80%}#bootstrap-theme sub,#bootstrap-theme sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}#bootstrap-theme sup{top:-.5em}#bootstrap-theme sub{bottom:-.25em}#bootstrap-theme img{border:0}#bootstrap-theme svg:not(:root){overflow:hidden}#bootstrap-theme figure{margin:1em 40px}#bootstrap-theme hr{box-sizing:content-box;height:0}#bootstrap-theme pre{overflow:auto}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:monospace,monospace;font-size:1em}#bootstrap-theme button,#bootstrap-theme input,#bootstrap-theme optgroup,#bootstrap-theme select,#bootstrap-theme textarea{color:inherit;font:inherit;margin:0}#bootstrap-theme button{overflow:visible}#bootstrap-theme button,#bootstrap-theme select{text-transform:none}#bootstrap-theme button,#bootstrap-theme html input[type=button],#bootstrap-theme input[type=reset],#bootstrap-theme input[type=submit]{-webkit-appearance:button;cursor:pointer}#bootstrap-theme button[disabled],#bootstrap-theme html input[disabled]{cursor:default}#bootstrap-theme button::-moz-focus-inner,#bootstrap-theme input::-moz-focus-inner{border:0;padding:0}#bootstrap-theme input{line-height:normal}#bootstrap-theme input[type=checkbox],#bootstrap-theme input[type=radio]{box-sizing:border-box;padding:0}#bootstrap-theme input[type=number]::-webkit-inner-spin-button,#bootstrap-theme input[type=number]::-webkit-outer-spin-button{height:auto}#bootstrap-theme input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}#bootstrap-theme input[type=search]::-webkit-search-cancel-button,#bootstrap-theme input[type=search]::-webkit-search-decoration{-webkit-appearance:none}#bootstrap-theme fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}#bootstrap-theme legend{border:0;padding:0}#bootstrap-theme textarea{overflow:auto}#bootstrap-theme optgroup{font-weight:700}#bootstrap-theme table{border-collapse:collapse;border-spacing:0}#bootstrap-theme td,#bootstrap-theme th{padding:0}@media print{#bootstrap-theme *,#bootstrap-theme *:before,#bootstrap-theme *:after{color:#000 !important;text-shadow:none !important;background:0 0 !important;box-shadow:none !important}#bootstrap-theme a,#bootstrap-theme a:visited{text-decoration:underline}#bootstrap-theme a[href]:after{content:" (" attr(href) ")"}#bootstrap-theme abbr[title]:after{content:" (" attr(title) ")"}#bootstrap-theme a[href^="#"]:after,#bootstrap-theme a[href^="javascript:"]:after{content:""}#bootstrap-theme pre,#bootstrap-theme blockquote{border:1px solid #999;page-break-inside:avoid}#bootstrap-theme thead{display:table-header-group}#bootstrap-theme tr,#bootstrap-theme img{page-break-inside:avoid}#bootstrap-theme img{max-width:100% !important}#bootstrap-theme p,#bootstrap-theme h2,#bootstrap-theme h3{orphans:3;widows:3}#bootstrap-theme h2,#bootstrap-theme h3{page-break-after:avoid}#bootstrap-theme .navbar{display:none}#bootstrap-theme .btn>.caret,#bootstrap-theme .dropup>.btn>.caret{border-top-color:#000 !important}#bootstrap-theme .label{border:1px solid #000}#bootstrap-theme .table{border-collapse:collapse !important}#bootstrap-theme .table td,#bootstrap-theme .table th{background-color:#fff !important}#bootstrap-theme .table-bordered th,#bootstrap-theme .table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:"Glyphicons Halflings";src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot");src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff2") format("woff2"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff") format("woff"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}#bootstrap-theme .glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#bootstrap-theme .glyphicon-asterisk:before{content:"*"}#bootstrap-theme .glyphicon-plus:before{content:"+"}#bootstrap-theme .glyphicon-euro:before,#bootstrap-theme .glyphicon-eur:before{content:"€"}#bootstrap-theme .glyphicon-minus:before{content:"−"}#bootstrap-theme .glyphicon-cloud:before{content:"☁"}#bootstrap-theme .glyphicon-envelope:before{content:"✉"}#bootstrap-theme .glyphicon-pencil:before{content:"✏"}#bootstrap-theme .glyphicon-glass:before{content:""}#bootstrap-theme .glyphicon-music:before{content:""}#bootstrap-theme .glyphicon-search:before{content:""}#bootstrap-theme .glyphicon-heart:before{content:""}#bootstrap-theme .glyphicon-star:before{content:""}#bootstrap-theme .glyphicon-star-empty:before{content:""}#bootstrap-theme .glyphicon-user:before{content:""}#bootstrap-theme .glyphicon-film:before{content:""}#bootstrap-theme .glyphicon-th-large:before{content:""}#bootstrap-theme .glyphicon-th:before{content:""}#bootstrap-theme .glyphicon-th-list:before{content:""}#bootstrap-theme .glyphicon-ok:before{content:""}#bootstrap-theme .glyphicon-remove:before{content:""}#bootstrap-theme .glyphicon-zoom-in:before{content:""}#bootstrap-theme .glyphicon-zoom-out:before{content:""}#bootstrap-theme .glyphicon-off:before{content:""}#bootstrap-theme .glyphicon-signal:before{content:""}#bootstrap-theme .glyphicon-cog:before{content:""}#bootstrap-theme .glyphicon-trash:before{content:""}#bootstrap-theme .glyphicon-home:before{content:""}#bootstrap-theme .glyphicon-file:before{content:""}#bootstrap-theme .glyphicon-time:before{content:""}#bootstrap-theme .glyphicon-road:before{content:""}#bootstrap-theme .glyphicon-download-alt:before{content:""}#bootstrap-theme .glyphicon-download:before{content:""}#bootstrap-theme .glyphicon-upload:before{content:""}#bootstrap-theme .glyphicon-inbox:before{content:""}#bootstrap-theme .glyphicon-play-circle:before{content:""}#bootstrap-theme .glyphicon-repeat:before{content:""}#bootstrap-theme .glyphicon-refresh:before{content:""}#bootstrap-theme .glyphicon-list-alt:before{content:""}#bootstrap-theme .glyphicon-lock:before{content:""}#bootstrap-theme .glyphicon-flag:before{content:""}#bootstrap-theme .glyphicon-headphones:before{content:""}#bootstrap-theme .glyphicon-volume-off:before{content:""}#bootstrap-theme .glyphicon-volume-down:before{content:""}#bootstrap-theme .glyphicon-volume-up:before{content:""}#bootstrap-theme .glyphicon-qrcode:before{content:""}#bootstrap-theme .glyphicon-barcode:before{content:""}#bootstrap-theme .glyphicon-tag:before{content:""}#bootstrap-theme .glyphicon-tags:before{content:""}#bootstrap-theme .glyphicon-book:before{content:""}#bootstrap-theme .glyphicon-bookmark:before{content:""}#bootstrap-theme .glyphicon-print:before{content:""}#bootstrap-theme .glyphicon-camera:before{content:""}#bootstrap-theme .glyphicon-font:before{content:""}#bootstrap-theme .glyphicon-bold:before{content:""}#bootstrap-theme .glyphicon-italic:before{content:""}#bootstrap-theme .glyphicon-text-height:before{content:""}#bootstrap-theme .glyphicon-text-width:before{content:""}#bootstrap-theme .glyphicon-align-left:before{content:""}#bootstrap-theme .glyphicon-align-center:before{content:""}#bootstrap-theme .glyphicon-align-right:before{content:""}#bootstrap-theme .glyphicon-align-justify:before{content:""}#bootstrap-theme .glyphicon-list:before{content:""}#bootstrap-theme .glyphicon-indent-left:before{content:""}#bootstrap-theme .glyphicon-indent-right:before{content:""}#bootstrap-theme .glyphicon-facetime-video:before{content:""}#bootstrap-theme .glyphicon-picture:before{content:""}#bootstrap-theme .glyphicon-map-marker:before{content:""}#bootstrap-theme .glyphicon-adjust:before{content:""}#bootstrap-theme .glyphicon-tint:before{content:""}#bootstrap-theme .glyphicon-edit:before{content:""}#bootstrap-theme .glyphicon-share:before{content:""}#bootstrap-theme .glyphicon-check:before{content:""}#bootstrap-theme .glyphicon-move:before{content:""}#bootstrap-theme .glyphicon-step-backward:before{content:""}#bootstrap-theme .glyphicon-fast-backward:before{content:""}#bootstrap-theme .glyphicon-backward:before{content:""}#bootstrap-theme .glyphicon-play:before{content:""}#bootstrap-theme .glyphicon-pause:before{content:""}#bootstrap-theme .glyphicon-stop:before{content:""}#bootstrap-theme .glyphicon-forward:before{content:""}#bootstrap-theme .glyphicon-fast-forward:before{content:""}#bootstrap-theme .glyphicon-step-forward:before{content:""}#bootstrap-theme .glyphicon-eject:before{content:""}#bootstrap-theme .glyphicon-chevron-left:before{content:""}#bootstrap-theme .glyphicon-chevron-right:before{content:""}#bootstrap-theme .glyphicon-plus-sign:before{content:""}#bootstrap-theme .glyphicon-minus-sign:before{content:""}#bootstrap-theme .glyphicon-remove-sign:before{content:""}#bootstrap-theme .glyphicon-ok-sign:before{content:""}#bootstrap-theme .glyphicon-question-sign:before{content:""}#bootstrap-theme .glyphicon-info-sign:before{content:""}#bootstrap-theme .glyphicon-screenshot:before{content:""}#bootstrap-theme .glyphicon-remove-circle:before{content:""}#bootstrap-theme .glyphicon-ok-circle:before{content:""}#bootstrap-theme .glyphicon-ban-circle:before{content:""}#bootstrap-theme .glyphicon-arrow-left:before{content:""}#bootstrap-theme .glyphicon-arrow-right:before{content:""}#bootstrap-theme .glyphicon-arrow-up:before{content:""}#bootstrap-theme .glyphicon-arrow-down:before{content:""}#bootstrap-theme .glyphicon-share-alt:before{content:""}#bootstrap-theme .glyphicon-resize-full:before{content:""}#bootstrap-theme .glyphicon-resize-small:before{content:""}#bootstrap-theme .glyphicon-exclamation-sign:before{content:""}#bootstrap-theme .glyphicon-gift:before{content:""}#bootstrap-theme .glyphicon-leaf:before{content:""}#bootstrap-theme .glyphicon-fire:before{content:""}#bootstrap-theme .glyphicon-eye-open:before{content:""}#bootstrap-theme .glyphicon-eye-close:before{content:""}#bootstrap-theme .glyphicon-warning-sign:before{content:""}#bootstrap-theme .glyphicon-plane:before{content:""}#bootstrap-theme .glyphicon-calendar:before{content:""}#bootstrap-theme .glyphicon-random:before{content:""}#bootstrap-theme .glyphicon-comment:before{content:""}#bootstrap-theme .glyphicon-magnet:before{content:""}#bootstrap-theme .glyphicon-chevron-up:before{content:""}#bootstrap-theme .glyphicon-chevron-down:before{content:""}#bootstrap-theme .glyphicon-retweet:before{content:""}#bootstrap-theme .glyphicon-shopping-cart:before{content:""}#bootstrap-theme .glyphicon-folder-close:before{content:""}#bootstrap-theme .glyphicon-folder-open:before{content:""}#bootstrap-theme .glyphicon-resize-vertical:before{content:""}#bootstrap-theme .glyphicon-resize-horizontal:before{content:""}#bootstrap-theme .glyphicon-hdd:before{content:""}#bootstrap-theme .glyphicon-bullhorn:before{content:""}#bootstrap-theme .glyphicon-bell:before{content:""}#bootstrap-theme .glyphicon-certificate:before{content:""}#bootstrap-theme .glyphicon-thumbs-up:before{content:""}#bootstrap-theme .glyphicon-thumbs-down:before{content:""}#bootstrap-theme .glyphicon-hand-right:before{content:""}#bootstrap-theme .glyphicon-hand-left:before{content:""}#bootstrap-theme .glyphicon-hand-up:before{content:""}#bootstrap-theme .glyphicon-hand-down:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-right:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-left:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-up:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-down:before{content:""}#bootstrap-theme .glyphicon-globe:before{content:""}#bootstrap-theme .glyphicon-wrench:before{content:""}#bootstrap-theme .glyphicon-tasks:before{content:""}#bootstrap-theme .glyphicon-filter:before{content:""}#bootstrap-theme .glyphicon-briefcase:before{content:""}#bootstrap-theme .glyphicon-fullscreen:before{content:""}#bootstrap-theme .glyphicon-dashboard:before{content:""}#bootstrap-theme .glyphicon-paperclip:before{content:""}#bootstrap-theme .glyphicon-heart-empty:before{content:""}#bootstrap-theme .glyphicon-link:before{content:""}#bootstrap-theme .glyphicon-phone:before{content:""}#bootstrap-theme .glyphicon-pushpin:before{content:""}#bootstrap-theme .glyphicon-usd:before{content:""}#bootstrap-theme .glyphicon-gbp:before{content:""}#bootstrap-theme .glyphicon-sort:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-order:before{content:""}#bootstrap-theme .glyphicon-sort-by-order-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes-alt:before{content:""}#bootstrap-theme .glyphicon-unchecked:before{content:""}#bootstrap-theme .glyphicon-expand:before{content:""}#bootstrap-theme .glyphicon-collapse-down:before{content:""}#bootstrap-theme .glyphicon-collapse-up:before{content:""}#bootstrap-theme .glyphicon-log-in:before{content:""}#bootstrap-theme .glyphicon-flash:before{content:""}#bootstrap-theme .glyphicon-log-out:before{content:""}#bootstrap-theme .glyphicon-new-window:before{content:""}#bootstrap-theme .glyphicon-record:before{content:""}#bootstrap-theme .glyphicon-save:before{content:""}#bootstrap-theme .glyphicon-open:before{content:""}#bootstrap-theme .glyphicon-saved:before{content:""}#bootstrap-theme .glyphicon-import:before{content:""}#bootstrap-theme .glyphicon-export:before{content:""}#bootstrap-theme .glyphicon-send:before{content:""}#bootstrap-theme .glyphicon-floppy-disk:before{content:""}#bootstrap-theme .glyphicon-floppy-saved:before{content:""}#bootstrap-theme .glyphicon-floppy-remove:before{content:""}#bootstrap-theme .glyphicon-floppy-save:before{content:""}#bootstrap-theme .glyphicon-floppy-open:before{content:""}#bootstrap-theme .glyphicon-credit-card:before{content:""}#bootstrap-theme .glyphicon-transfer:before{content:""}#bootstrap-theme .glyphicon-cutlery:before{content:""}#bootstrap-theme .glyphicon-header:before{content:""}#bootstrap-theme .glyphicon-compressed:before{content:""}#bootstrap-theme .glyphicon-earphone:before{content:""}#bootstrap-theme .glyphicon-phone-alt:before{content:""}#bootstrap-theme .glyphicon-tower:before{content:""}#bootstrap-theme .glyphicon-stats:before{content:""}#bootstrap-theme .glyphicon-sd-video:before{content:""}#bootstrap-theme .glyphicon-hd-video:before{content:""}#bootstrap-theme .glyphicon-subtitles:before{content:""}#bootstrap-theme .glyphicon-sound-stereo:before{content:""}#bootstrap-theme .glyphicon-sound-dolby:before{content:""}#bootstrap-theme .glyphicon-sound-5-1:before{content:""}#bootstrap-theme .glyphicon-sound-6-1:before{content:""}#bootstrap-theme .glyphicon-sound-7-1:before{content:""}#bootstrap-theme .glyphicon-copyright-mark:before{content:""}#bootstrap-theme .glyphicon-registration-mark:before{content:""}#bootstrap-theme .glyphicon-cloud-download:before{content:""}#bootstrap-theme .glyphicon-cloud-upload:before{content:""}#bootstrap-theme .glyphicon-tree-conifer:before{content:""}#bootstrap-theme .glyphicon-tree-deciduous:before{content:""}#bootstrap-theme .glyphicon-cd:before{content:""}#bootstrap-theme .glyphicon-save-file:before{content:""}#bootstrap-theme .glyphicon-open-file:before{content:""}#bootstrap-theme .glyphicon-level-up:before{content:""}#bootstrap-theme .glyphicon-copy:before{content:""}#bootstrap-theme .glyphicon-paste:before{content:""}#bootstrap-theme .glyphicon-alert:before{content:""}#bootstrap-theme .glyphicon-equalizer:before{content:""}#bootstrap-theme .glyphicon-king:before{content:""}#bootstrap-theme .glyphicon-queen:before{content:""}#bootstrap-theme .glyphicon-pawn:before{content:""}#bootstrap-theme .glyphicon-bishop:before{content:""}#bootstrap-theme .glyphicon-knight:before{content:""}#bootstrap-theme .glyphicon-baby-formula:before{content:""}#bootstrap-theme .glyphicon-tent:before{content:"⛺"}#bootstrap-theme .glyphicon-blackboard:before{content:""}#bootstrap-theme .glyphicon-bed:before{content:""}#bootstrap-theme .glyphicon-apple:before{content:""}#bootstrap-theme .glyphicon-erase:before{content:""}#bootstrap-theme .glyphicon-hourglass:before{content:"⌛"}#bootstrap-theme .glyphicon-lamp:before{content:""}#bootstrap-theme .glyphicon-duplicate:before{content:""}#bootstrap-theme .glyphicon-piggy-bank:before{content:""}#bootstrap-theme .glyphicon-scissors:before{content:""}#bootstrap-theme .glyphicon-bitcoin:before{content:""}#bootstrap-theme .glyphicon-btc:before{content:""}#bootstrap-theme .glyphicon-xbt:before{content:""}#bootstrap-theme .glyphicon-yen:before{content:"¥"}#bootstrap-theme .glyphicon-jpy:before{content:"¥"}#bootstrap-theme .glyphicon-ruble:before{content:"₽"}#bootstrap-theme .glyphicon-rub:before{content:"₽"}#bootstrap-theme .glyphicon-scale:before{content:""}#bootstrap-theme .glyphicon-ice-lolly:before{content:""}#bootstrap-theme .glyphicon-ice-lolly-tasted:before{content:""}#bootstrap-theme .glyphicon-education:before{content:""}#bootstrap-theme .glyphicon-option-horizontal:before{content:""}#bootstrap-theme .glyphicon-option-vertical:before{content:""}#bootstrap-theme .glyphicon-menu-hamburger:before{content:""}#bootstrap-theme .glyphicon-modal-window:before{content:""}#bootstrap-theme .glyphicon-oil:before{content:""}#bootstrap-theme .glyphicon-grain:before{content:""}#bootstrap-theme .glyphicon-sunglasses:before{content:""}#bootstrap-theme .glyphicon-text-size:before{content:""}#bootstrap-theme .glyphicon-text-color:before{content:""}#bootstrap-theme .glyphicon-text-background:before{content:""}#bootstrap-theme .glyphicon-object-align-top:before{content:""}#bootstrap-theme .glyphicon-object-align-bottom:before{content:""}#bootstrap-theme .glyphicon-object-align-horizontal:before{content:""}#bootstrap-theme .glyphicon-object-align-left:before{content:""}#bootstrap-theme .glyphicon-object-align-vertical:before{content:""}#bootstrap-theme .glyphicon-object-align-right:before{content:""}#bootstrap-theme .glyphicon-triangle-right:before{content:""}#bootstrap-theme .glyphicon-triangle-left:before{content:""}#bootstrap-theme .glyphicon-triangle-bottom:before{content:""}#bootstrap-theme .glyphicon-triangle-top:before{content:""}#bootstrap-theme .glyphicon-console:before{content:""}#bootstrap-theme .glyphicon-superscript:before{content:""}#bootstrap-theme .glyphicon-subscript:before{content:""}#bootstrap-theme .glyphicon-menu-left:before{content:""}#bootstrap-theme .glyphicon-menu-right:before{content:""}#bootstrap-theme .glyphicon-menu-down:before{content:""}#bootstrap-theme .glyphicon-menu-up:before{content:""}#bootstrap-theme *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme *:before,#bootstrap-theme *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}#bootstrap-theme body{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff}#bootstrap-theme input,#bootstrap-theme button,#bootstrap-theme select,#bootstrap-theme textarea{font-family:inherit;font-size:inherit;line-height:inherit}#bootstrap-theme a{color:#2786c2;text-decoration:none}#bootstrap-theme a:hover,#bootstrap-theme a:focus{color:#1a5a82;text-decoration:underline}#bootstrap-theme a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme figure{margin:0}#bootstrap-theme img{vertical-align:middle}#bootstrap-theme .img-responsive{display:block;max-width:100%;height:auto}#bootstrap-theme .img-rounded{border-radius:6px}#bootstrap-theme .img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}#bootstrap-theme .img-circle{border-radius:50%}#bootstrap-theme hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}#bootstrap-theme .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}#bootstrap-theme .sr-only-focusable:active,#bootstrap-theme .sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}#bootstrap-theme [role=button]{cursor:pointer}#bootstrap-theme h1,#bootstrap-theme h2,#bootstrap-theme h3,#bootstrap-theme h4,#bootstrap-theme h5,#bootstrap-theme h6,#bootstrap-theme .h1,#bootstrap-theme .h2,#bootstrap-theme .h3,#bootstrap-theme .h4,#bootstrap-theme .h5,#bootstrap-theme .h6{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.2;color:#000}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-weight:400;line-height:1;color:#999}#bootstrap-theme h1,#bootstrap-theme .h1,#bootstrap-theme h2,#bootstrap-theme .h2,#bootstrap-theme h3,#bootstrap-theme .h3{margin-top:20px;margin-bottom:10px}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small{font-size:65%}#bootstrap-theme h4,#bootstrap-theme .h4,#bootstrap-theme h5,#bootstrap-theme .h5,#bootstrap-theme h6,#bootstrap-theme .h6{margin-top:10px;margin-bottom:10px}#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-size:75%}#bootstrap-theme h1,#bootstrap-theme .h1{font-size:36px}#bootstrap-theme h2,#bootstrap-theme .h2{font-size:30px}#bootstrap-theme h3,#bootstrap-theme .h3{font-size:24px}#bootstrap-theme h4,#bootstrap-theme .h4{font-size:18px}#bootstrap-theme h5,#bootstrap-theme .h5{font-size:14px}#bootstrap-theme h6,#bootstrap-theme .h6{font-size:12px}#bootstrap-theme p{margin:0 0 10px}#bootstrap-theme .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){#bootstrap-theme .lead{font-size:21px}}#bootstrap-theme small,#bootstrap-theme .small{font-size:85%}#bootstrap-theme mark,#bootstrap-theme .mark{padding:.2em;background-color:#fcf8e3}#bootstrap-theme .text-left{text-align:left}#bootstrap-theme .text-right{text-align:right}#bootstrap-theme .text-center{text-align:center}#bootstrap-theme .text-justify{text-align:justify}#bootstrap-theme .text-nowrap{white-space:nowrap}#bootstrap-theme .text-lowercase{text-transform:lowercase}#bootstrap-theme .text-uppercase,#bootstrap-theme .initialism{text-transform:uppercase}#bootstrap-theme .text-capitalize{text-transform:capitalize}#bootstrap-theme .text-muted{color:#999}#bootstrap-theme .text-primary{color:#000}#bootstrap-theme a.text-primary:hover,#bootstrap-theme a.text-primary:focus{color:#000}#bootstrap-theme .text-success{color:#468847}#bootstrap-theme a.text-success:hover,#bootstrap-theme a.text-success:focus{color:#356635}#bootstrap-theme .text-info{color:#3a87ad}#bootstrap-theme a.text-info:hover,#bootstrap-theme a.text-info:focus{color:#2d6987}#bootstrap-theme .text-warning{color:#c09853}#bootstrap-theme a.text-warning:hover,#bootstrap-theme a.text-warning:focus{color:#a47e3c}#bootstrap-theme .text-danger{color:#b94a48}#bootstrap-theme a.text-danger:hover,#bootstrap-theme a.text-danger:focus{color:#953b39}#bootstrap-theme .bg-primary{color:#fff}#bootstrap-theme .bg-primary{background-color:#000}#bootstrap-theme a.bg-primary:hover,#bootstrap-theme a.bg-primary:focus{background-color:#000}#bootstrap-theme .bg-success{background-color:#dff0d8}#bootstrap-theme a.bg-success:hover,#bootstrap-theme a.bg-success:focus{background-color:#c1e2b3}#bootstrap-theme .bg-info{background-color:#d9edf7}#bootstrap-theme a.bg-info:hover,#bootstrap-theme a.bg-info:focus{background-color:#afd9ee}#bootstrap-theme .bg-warning{background-color:#fcf8e3}#bootstrap-theme a.bg-warning:hover,#bootstrap-theme a.bg-warning:focus{background-color:#f7ecb5}#bootstrap-theme .bg-danger{background-color:#f2dede}#bootstrap-theme a.bg-danger:hover,#bootstrap-theme a.bg-danger:focus{background-color:#e4b9b9}#bootstrap-theme .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}#bootstrap-theme ul,#bootstrap-theme ol{margin-top:0;margin-bottom:10px}#bootstrap-theme ul ul,#bootstrap-theme ul ol,#bootstrap-theme ol ul,#bootstrap-theme ol ol{margin-bottom:0}#bootstrap-theme .list-unstyled{padding-left:0;list-style:none}#bootstrap-theme .list-inline{padding-left:0;list-style:none;margin-left:-5px}#bootstrap-theme .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}#bootstrap-theme dl{margin-top:0;margin-bottom:20px}#bootstrap-theme dt,#bootstrap-theme dd{line-height:1.428571429}#bootstrap-theme dt{font-weight:700}#bootstrap-theme dd{margin-left:0}#bootstrap-theme .dl-horizontal dd:before,#bootstrap-theme .dl-horizontal dd:after{display:table;content:" "}#bootstrap-theme .dl-horizontal dd:after{clear:both}@media (min-width:768px){#bootstrap-theme .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#bootstrap-theme .dl-horizontal dd{margin-left:180px}}#bootstrap-theme abbr[title],#bootstrap-theme abbr[data-original-title]{cursor:help}#bootstrap-theme .initialism{font-size:90%}#bootstrap-theme blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}#bootstrap-theme blockquote p:last-child,#bootstrap-theme blockquote ul:last-child,#bootstrap-theme blockquote ol:last-child{margin-bottom:0}#bootstrap-theme blockquote footer,#bootstrap-theme blockquote small,#bootstrap-theme blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}#bootstrap-theme blockquote footer:before,#bootstrap-theme blockquote small:before,#bootstrap-theme blockquote .small:before{content:"— "}#bootstrap-theme .blockquote-reverse,#bootstrap-theme blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}#bootstrap-theme .blockquote-reverse footer:before,#bootstrap-theme .blockquote-reverse small:before,#bootstrap-theme .blockquote-reverse .small:before,#bootstrap-theme blockquote.pull-right footer:before,#bootstrap-theme blockquote.pull-right small:before,#bootstrap-theme blockquote.pull-right .small:before{content:""}#bootstrap-theme .blockquote-reverse footer:after,#bootstrap-theme .blockquote-reverse small:after,#bootstrap-theme .blockquote-reverse .small:after,#bootstrap-theme blockquote.pull-right footer:after,#bootstrap-theme blockquote.pull-right small:after,#bootstrap-theme blockquote.pull-right .small:after{content:" —"}#bootstrap-theme address{margin-bottom:20px;font-style:normal;line-height:1.428571429}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}#bootstrap-theme code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}#bootstrap-theme kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}#bootstrap-theme kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}#bootstrap-theme pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;-ms-word-break:break-all;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}#bootstrap-theme pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}#bootstrap-theme .pre-scrollable{max-height:340px;overflow-y:scroll}#bootstrap-theme .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container:before,#bootstrap-theme .container:after{display:table;content:" "}#bootstrap-theme .container:after{clear:both}@media (min-width:768px){#bootstrap-theme .container{width:750px}}@media (min-width:992px){#bootstrap-theme .container{width:970px}}@media (min-width:1200px){#bootstrap-theme .container{width:1170px}}#bootstrap-theme .container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container-fluid:before,#bootstrap-theme .container-fluid:after{display:table;content:" "}#bootstrap-theme .container-fluid:after{clear:both}#bootstrap-theme .row{margin-right:-15px;margin-left:-15px}#bootstrap-theme .row:before,#bootstrap-theme .row:after{display:table;content:" "}#bootstrap-theme .row:after{clear:both}#bootstrap-theme .row-no-gutters{margin-right:0;margin-left:0}#bootstrap-theme .row-no-gutters [class*=col-]{padding-right:0;padding-left:0}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-sm-1,#bootstrap-theme .col-md-1,#bootstrap-theme .col-lg-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-md-2,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-md-3,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-md-4,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-md-5,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-md-6,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-md-7,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-md-8,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-md-9,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-md-10,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-md-11,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-xs-12,#bootstrap-theme .col-sm-12,#bootstrap-theme .col-md-12,#bootstrap-theme .col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-xs-12{float:left}#bootstrap-theme .col-xs-1{width:8.3333333333%}#bootstrap-theme .col-xs-2{width:16.6666666667%}#bootstrap-theme .col-xs-3{width:25%}#bootstrap-theme .col-xs-4{width:33.3333333333%}#bootstrap-theme .col-xs-5{width:41.6666666667%}#bootstrap-theme .col-xs-6{width:50%}#bootstrap-theme .col-xs-7{width:58.3333333333%}#bootstrap-theme .col-xs-8{width:66.6666666667%}#bootstrap-theme .col-xs-9{width:75%}#bootstrap-theme .col-xs-10{width:83.3333333333%}#bootstrap-theme .col-xs-11{width:91.6666666667%}#bootstrap-theme .col-xs-12{width:100%}#bootstrap-theme .col-xs-pull-0{right:auto}#bootstrap-theme .col-xs-pull-1{right:8.3333333333%}#bootstrap-theme .col-xs-pull-2{right:16.6666666667%}#bootstrap-theme .col-xs-pull-3{right:25%}#bootstrap-theme .col-xs-pull-4{right:33.3333333333%}#bootstrap-theme .col-xs-pull-5{right:41.6666666667%}#bootstrap-theme .col-xs-pull-6{right:50%}#bootstrap-theme .col-xs-pull-7{right:58.3333333333%}#bootstrap-theme .col-xs-pull-8{right:66.6666666667%}#bootstrap-theme .col-xs-pull-9{right:75%}#bootstrap-theme .col-xs-pull-10{right:83.3333333333%}#bootstrap-theme .col-xs-pull-11{right:91.6666666667%}#bootstrap-theme .col-xs-pull-12{right:100%}#bootstrap-theme .col-xs-push-0{left:auto}#bootstrap-theme .col-xs-push-1{left:8.3333333333%}#bootstrap-theme .col-xs-push-2{left:16.6666666667%}#bootstrap-theme .col-xs-push-3{left:25%}#bootstrap-theme .col-xs-push-4{left:33.3333333333%}#bootstrap-theme .col-xs-push-5{left:41.6666666667%}#bootstrap-theme .col-xs-push-6{left:50%}#bootstrap-theme .col-xs-push-7{left:58.3333333333%}#bootstrap-theme .col-xs-push-8{left:66.6666666667%}#bootstrap-theme .col-xs-push-9{left:75%}#bootstrap-theme .col-xs-push-10{left:83.3333333333%}#bootstrap-theme .col-xs-push-11{left:91.6666666667%}#bootstrap-theme .col-xs-push-12{left:100%}#bootstrap-theme .col-xs-offset-0{margin-left:0}#bootstrap-theme .col-xs-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-xs-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-xs-offset-3{margin-left:25%}#bootstrap-theme .col-xs-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-xs-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-xs-offset-6{margin-left:50%}#bootstrap-theme .col-xs-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-xs-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-xs-offset-9{margin-left:75%}#bootstrap-theme .col-xs-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-xs-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-xs-offset-12{margin-left:100%}@media (min-width:768px){#bootstrap-theme .col-sm-1,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-sm-12{float:left}#bootstrap-theme .col-sm-1{width:8.3333333333%}#bootstrap-theme .col-sm-2{width:16.6666666667%}#bootstrap-theme .col-sm-3{width:25%}#bootstrap-theme .col-sm-4{width:33.3333333333%}#bootstrap-theme .col-sm-5{width:41.6666666667%}#bootstrap-theme .col-sm-6{width:50%}#bootstrap-theme .col-sm-7{width:58.3333333333%}#bootstrap-theme .col-sm-8{width:66.6666666667%}#bootstrap-theme .col-sm-9{width:75%}#bootstrap-theme .col-sm-10{width:83.3333333333%}#bootstrap-theme .col-sm-11{width:91.6666666667%}#bootstrap-theme .col-sm-12{width:100%}#bootstrap-theme .col-sm-pull-0{right:auto}#bootstrap-theme .col-sm-pull-1{right:8.3333333333%}#bootstrap-theme .col-sm-pull-2{right:16.6666666667%}#bootstrap-theme .col-sm-pull-3{right:25%}#bootstrap-theme .col-sm-pull-4{right:33.3333333333%}#bootstrap-theme .col-sm-pull-5{right:41.6666666667%}#bootstrap-theme .col-sm-pull-6{right:50%}#bootstrap-theme .col-sm-pull-7{right:58.3333333333%}#bootstrap-theme .col-sm-pull-8{right:66.6666666667%}#bootstrap-theme .col-sm-pull-9{right:75%}#bootstrap-theme .col-sm-pull-10{right:83.3333333333%}#bootstrap-theme .col-sm-pull-11{right:91.6666666667%}#bootstrap-theme .col-sm-pull-12{right:100%}#bootstrap-theme .col-sm-push-0{left:auto}#bootstrap-theme .col-sm-push-1{left:8.3333333333%}#bootstrap-theme .col-sm-push-2{left:16.6666666667%}#bootstrap-theme .col-sm-push-3{left:25%}#bootstrap-theme .col-sm-push-4{left:33.3333333333%}#bootstrap-theme .col-sm-push-5{left:41.6666666667%}#bootstrap-theme .col-sm-push-6{left:50%}#bootstrap-theme .col-sm-push-7{left:58.3333333333%}#bootstrap-theme .col-sm-push-8{left:66.6666666667%}#bootstrap-theme .col-sm-push-9{left:75%}#bootstrap-theme .col-sm-push-10{left:83.3333333333%}#bootstrap-theme .col-sm-push-11{left:91.6666666667%}#bootstrap-theme .col-sm-push-12{left:100%}#bootstrap-theme .col-sm-offset-0{margin-left:0}#bootstrap-theme .col-sm-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-sm-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-sm-offset-3{margin-left:25%}#bootstrap-theme .col-sm-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-sm-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-sm-offset-6{margin-left:50%}#bootstrap-theme .col-sm-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-sm-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-sm-offset-9{margin-left:75%}#bootstrap-theme .col-sm-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-sm-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-sm-offset-12{margin-left:100%}}@media (min-width:992px){#bootstrap-theme .col-md-1,#bootstrap-theme .col-md-2,#bootstrap-theme .col-md-3,#bootstrap-theme .col-md-4,#bootstrap-theme .col-md-5,#bootstrap-theme .col-md-6,#bootstrap-theme .col-md-7,#bootstrap-theme .col-md-8,#bootstrap-theme .col-md-9,#bootstrap-theme .col-md-10,#bootstrap-theme .col-md-11,#bootstrap-theme .col-md-12{float:left}#bootstrap-theme .col-md-1{width:8.3333333333%}#bootstrap-theme .col-md-2{width:16.6666666667%}#bootstrap-theme .col-md-3{width:25%}#bootstrap-theme .col-md-4{width:33.3333333333%}#bootstrap-theme .col-md-5{width:41.6666666667%}#bootstrap-theme .col-md-6{width:50%}#bootstrap-theme .col-md-7{width:58.3333333333%}#bootstrap-theme .col-md-8{width:66.6666666667%}#bootstrap-theme .col-md-9{width:75%}#bootstrap-theme .col-md-10{width:83.3333333333%}#bootstrap-theme .col-md-11{width:91.6666666667%}#bootstrap-theme .col-md-12{width:100%}#bootstrap-theme .col-md-pull-0{right:auto}#bootstrap-theme .col-md-pull-1{right:8.3333333333%}#bootstrap-theme .col-md-pull-2{right:16.6666666667%}#bootstrap-theme .col-md-pull-3{right:25%}#bootstrap-theme .col-md-pull-4{right:33.3333333333%}#bootstrap-theme .col-md-pull-5{right:41.6666666667%}#bootstrap-theme .col-md-pull-6{right:50%}#bootstrap-theme .col-md-pull-7{right:58.3333333333%}#bootstrap-theme .col-md-pull-8{right:66.6666666667%}#bootstrap-theme .col-md-pull-9{right:75%}#bootstrap-theme .col-md-pull-10{right:83.3333333333%}#bootstrap-theme .col-md-pull-11{right:91.6666666667%}#bootstrap-theme .col-md-pull-12{right:100%}#bootstrap-theme .col-md-push-0{left:auto}#bootstrap-theme .col-md-push-1{left:8.3333333333%}#bootstrap-theme .col-md-push-2{left:16.6666666667%}#bootstrap-theme .col-md-push-3{left:25%}#bootstrap-theme .col-md-push-4{left:33.3333333333%}#bootstrap-theme .col-md-push-5{left:41.6666666667%}#bootstrap-theme .col-md-push-6{left:50%}#bootstrap-theme .col-md-push-7{left:58.3333333333%}#bootstrap-theme .col-md-push-8{left:66.6666666667%}#bootstrap-theme .col-md-push-9{left:75%}#bootstrap-theme .col-md-push-10{left:83.3333333333%}#bootstrap-theme .col-md-push-11{left:91.6666666667%}#bootstrap-theme .col-md-push-12{left:100%}#bootstrap-theme .col-md-offset-0{margin-left:0}#bootstrap-theme .col-md-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-md-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-md-offset-3{margin-left:25%}#bootstrap-theme .col-md-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-md-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-md-offset-6{margin-left:50%}#bootstrap-theme .col-md-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-md-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-md-offset-9{margin-left:75%}#bootstrap-theme .col-md-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-md-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-md-offset-12{margin-left:100%}}@media (min-width:1200px){#bootstrap-theme .col-lg-1,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-lg-12{float:left}#bootstrap-theme .col-lg-1{width:8.3333333333%}#bootstrap-theme .col-lg-2{width:16.6666666667%}#bootstrap-theme .col-lg-3{width:25%}#bootstrap-theme .col-lg-4{width:33.3333333333%}#bootstrap-theme .col-lg-5{width:41.6666666667%}#bootstrap-theme .col-lg-6{width:50%}#bootstrap-theme .col-lg-7{width:58.3333333333%}#bootstrap-theme .col-lg-8{width:66.6666666667%}#bootstrap-theme .col-lg-9{width:75%}#bootstrap-theme .col-lg-10{width:83.3333333333%}#bootstrap-theme .col-lg-11{width:91.6666666667%}#bootstrap-theme .col-lg-12{width:100%}#bootstrap-theme .col-lg-pull-0{right:auto}#bootstrap-theme .col-lg-pull-1{right:8.3333333333%}#bootstrap-theme .col-lg-pull-2{right:16.6666666667%}#bootstrap-theme .col-lg-pull-3{right:25%}#bootstrap-theme .col-lg-pull-4{right:33.3333333333%}#bootstrap-theme .col-lg-pull-5{right:41.6666666667%}#bootstrap-theme .col-lg-pull-6{right:50%}#bootstrap-theme .col-lg-pull-7{right:58.3333333333%}#bootstrap-theme .col-lg-pull-8{right:66.6666666667%}#bootstrap-theme .col-lg-pull-9{right:75%}#bootstrap-theme .col-lg-pull-10{right:83.3333333333%}#bootstrap-theme .col-lg-pull-11{right:91.6666666667%}#bootstrap-theme .col-lg-pull-12{right:100%}#bootstrap-theme .col-lg-push-0{left:auto}#bootstrap-theme .col-lg-push-1{left:8.3333333333%}#bootstrap-theme .col-lg-push-2{left:16.6666666667%}#bootstrap-theme .col-lg-push-3{left:25%}#bootstrap-theme .col-lg-push-4{left:33.3333333333%}#bootstrap-theme .col-lg-push-5{left:41.6666666667%}#bootstrap-theme .col-lg-push-6{left:50%}#bootstrap-theme .col-lg-push-7{left:58.3333333333%}#bootstrap-theme .col-lg-push-8{left:66.6666666667%}#bootstrap-theme .col-lg-push-9{left:75%}#bootstrap-theme .col-lg-push-10{left:83.3333333333%}#bootstrap-theme .col-lg-push-11{left:91.6666666667%}#bootstrap-theme .col-lg-push-12{left:100%}#bootstrap-theme .col-lg-offset-0{margin-left:0}#bootstrap-theme .col-lg-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-lg-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-lg-offset-3{margin-left:25%}#bootstrap-theme .col-lg-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-lg-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-lg-offset-6{margin-left:50%}#bootstrap-theme .col-lg-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-lg-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-lg-offset-9{margin-left:75%}#bootstrap-theme .col-lg-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-lg-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-lg-offset-12{margin-left:100%}}#bootstrap-theme table{background-color:transparent}#bootstrap-theme table col[class*=col-]{position:static;display:table-column;float:none}#bootstrap-theme table td[class*=col-],#bootstrap-theme table th[class*=col-]{position:static;display:table-cell;float:none}#bootstrap-theme caption{padding-top:8px;padding-bottom:8px;color:#999;text-align:left}#bootstrap-theme th{text-align:left}#bootstrap-theme .table{width:100%;max-width:100%;margin-bottom:20px}#bootstrap-theme .table>thead>tr>th,#bootstrap-theme .table>thead>tr>td,#bootstrap-theme .table>tbody>tr>th,#bootstrap-theme .table>tbody>tr>td,#bootstrap-theme .table>tfoot>tr>th,#bootstrap-theme .table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}#bootstrap-theme .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}#bootstrap-theme .table>caption+thead>tr:first-child>th,#bootstrap-theme .table>caption+thead>tr:first-child>td,#bootstrap-theme .table>colgroup+thead>tr:first-child>th,#bootstrap-theme .table>colgroup+thead>tr:first-child>td,#bootstrap-theme .table>thead:first-child>tr:first-child>th,#bootstrap-theme .table>thead:first-child>tr:first-child>td{border-top:0}#bootstrap-theme .table>tbody+tbody{border-top:2px solid #ddd}#bootstrap-theme .table .table{background-color:#fff}#bootstrap-theme .table-condensed>thead>tr>th,#bootstrap-theme .table-condensed>thead>tr>td,#bootstrap-theme .table-condensed>tbody>tr>th,#bootstrap-theme .table-condensed>tbody>tr>td,#bootstrap-theme .table-condensed>tfoot>tr>th,#bootstrap-theme .table-condensed>tfoot>tr>td{padding:5px}#bootstrap-theme .table-bordered{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td,#bootstrap-theme .table-bordered>tbody>tr>th,#bootstrap-theme .table-bordered>tbody>tr>td,#bootstrap-theme .table-bordered>tfoot>tr>th,#bootstrap-theme .table-bordered>tfoot>tr>td{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td{border-bottom-width:2px}#bootstrap-theme .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}#bootstrap-theme .table-hover>tbody>tr:hover{background-color:#f5f5f5}#bootstrap-theme .table>thead>tr>td.active,#bootstrap-theme .table>thead>tr>th.active,#bootstrap-theme .table>thead>tr.active>td,#bootstrap-theme .table>thead>tr.active>th,#bootstrap-theme .table>tbody>tr>td.active,#bootstrap-theme .table>tbody>tr>th.active,#bootstrap-theme .table>tbody>tr.active>td,#bootstrap-theme .table>tbody>tr.active>th,#bootstrap-theme .table>tfoot>tr>td.active,#bootstrap-theme .table>tfoot>tr>th.active,#bootstrap-theme .table>tfoot>tr.active>td,#bootstrap-theme .table>tfoot>tr.active>th{background-color:#f5f5f5}#bootstrap-theme .table-hover>tbody>tr>td.active:hover,#bootstrap-theme .table-hover>tbody>tr>th.active:hover,#bootstrap-theme .table-hover>tbody>tr.active:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.active,#bootstrap-theme .table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}#bootstrap-theme .table>thead>tr>td.success,#bootstrap-theme .table>thead>tr>th.success,#bootstrap-theme .table>thead>tr.success>td,#bootstrap-theme .table>thead>tr.success>th,#bootstrap-theme .table>tbody>tr>td.success,#bootstrap-theme .table>tbody>tr>th.success,#bootstrap-theme .table>tbody>tr.success>td,#bootstrap-theme .table>tbody>tr.success>th,#bootstrap-theme .table>tfoot>tr>td.success,#bootstrap-theme .table>tfoot>tr>th.success,#bootstrap-theme .table>tfoot>tr.success>td,#bootstrap-theme .table>tfoot>tr.success>th{background-color:#dff0d8}#bootstrap-theme .table-hover>tbody>tr>td.success:hover,#bootstrap-theme .table-hover>tbody>tr>th.success:hover,#bootstrap-theme .table-hover>tbody>tr.success:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.success,#bootstrap-theme .table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}#bootstrap-theme .table>thead>tr>td.info,#bootstrap-theme .table>thead>tr>th.info,#bootstrap-theme .table>thead>tr.info>td,#bootstrap-theme .table>thead>tr.info>th,#bootstrap-theme .table>tbody>tr>td.info,#bootstrap-theme .table>tbody>tr>th.info,#bootstrap-theme .table>tbody>tr.info>td,#bootstrap-theme .table>tbody>tr.info>th,#bootstrap-theme .table>tfoot>tr>td.info,#bootstrap-theme .table>tfoot>tr>th.info,#bootstrap-theme .table>tfoot>tr.info>td,#bootstrap-theme .table>tfoot>tr.info>th{background-color:#d9edf7}#bootstrap-theme .table-hover>tbody>tr>td.info:hover,#bootstrap-theme .table-hover>tbody>tr>th.info:hover,#bootstrap-theme .table-hover>tbody>tr.info:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.info,#bootstrap-theme .table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}#bootstrap-theme .table>thead>tr>td.warning,#bootstrap-theme .table>thead>tr>th.warning,#bootstrap-theme .table>thead>tr.warning>td,#bootstrap-theme .table>thead>tr.warning>th,#bootstrap-theme .table>tbody>tr>td.warning,#bootstrap-theme .table>tbody>tr>th.warning,#bootstrap-theme .table>tbody>tr.warning>td,#bootstrap-theme .table>tbody>tr.warning>th,#bootstrap-theme .table>tfoot>tr>td.warning,#bootstrap-theme .table>tfoot>tr>th.warning,#bootstrap-theme .table>tfoot>tr.warning>td,#bootstrap-theme .table>tfoot>tr.warning>th{background-color:#fcf8e3}#bootstrap-theme .table-hover>tbody>tr>td.warning:hover,#bootstrap-theme .table-hover>tbody>tr>th.warning:hover,#bootstrap-theme .table-hover>tbody>tr.warning:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.warning,#bootstrap-theme .table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}#bootstrap-theme .table>thead>tr>td.danger,#bootstrap-theme .table>thead>tr>th.danger,#bootstrap-theme .table>thead>tr.danger>td,#bootstrap-theme .table>thead>tr.danger>th,#bootstrap-theme .table>tbody>tr>td.danger,#bootstrap-theme .table>tbody>tr>th.danger,#bootstrap-theme .table>tbody>tr.danger>td,#bootstrap-theme .table>tbody>tr.danger>th,#bootstrap-theme .table>tfoot>tr>td.danger,#bootstrap-theme .table>tfoot>tr>th.danger,#bootstrap-theme .table>tfoot>tr.danger>td,#bootstrap-theme .table>tfoot>tr.danger>th{background-color:#f2dede}#bootstrap-theme .table-hover>tbody>tr>td.danger:hover,#bootstrap-theme .table-hover>tbody>tr>th.danger:hover,#bootstrap-theme .table-hover>tbody>tr.danger:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.danger,#bootstrap-theme .table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}#bootstrap-theme .table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){#bootstrap-theme .table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}#bootstrap-theme .table-responsive>.table{margin-bottom:0}#bootstrap-theme .table-responsive>.table>thead>tr>th,#bootstrap-theme .table-responsive>.table>thead>tr>td,#bootstrap-theme .table-responsive>.table>tbody>tr>th,#bootstrap-theme .table-responsive>.table>tbody>tr>td,#bootstrap-theme .table-responsive>.table>tfoot>tr>th,#bootstrap-theme .table-responsive>.table>tfoot>tr>td{white-space:nowrap}#bootstrap-theme .table-responsive>.table-bordered{border:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}#bootstrap-theme fieldset{min-width:0;padding:0;margin:0;border:0}#bootstrap-theme legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#555;border:0;border-bottom:1px solid #e5e5e5}#bootstrap-theme label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}#bootstrap-theme input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}#bootstrap-theme input[type=radio][disabled],#bootstrap-theme input[type=radio].disabled,fieldset[disabled] #bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox][disabled],#bootstrap-theme input[type=checkbox].disabled,fieldset[disabled] #bootstrap-theme input[type=checkbox]{cursor:not-allowed}#bootstrap-theme input[type=file]{display:block}#bootstrap-theme input[type=range]{display:block;width:100%}#bootstrap-theme select[multiple],#bootstrap-theme select[size]{height:auto}#bootstrap-theme input[type=file]:focus,#bootstrap-theme input[type=radio]:focus,#bootstrap-theme input[type=checkbox]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme output{display:block;padding-top:5px;font-size:14px;line-height:1.428571429;color:#555}#bootstrap-theme .form-control{display:block;width:100%;height:30px;padding:4px 8px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}#bootstrap-theme .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}#bootstrap-theme .form-control::-moz-placeholder{color:#999;opacity:1}#bootstrap-theme .form-control:-ms-input-placeholder{color:#999}#bootstrap-theme .form-control::-webkit-input-placeholder{color:#999}#bootstrap-theme .form-control::-ms-expand{background-color:transparent;border:0}#bootstrap-theme .form-control[disabled],#bootstrap-theme .form-control[readonly],fieldset[disabled] #bootstrap-theme .form-control{background-color:#eee;opacity:1}#bootstrap-theme .form-control[disabled],fieldset[disabled] #bootstrap-theme .form-control{cursor:not-allowed}#bootstrap-theme textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){#bootstrap-theme input[type=date].form-control,#bootstrap-theme input[type=time].form-control,#bootstrap-theme input[type=datetime-local].form-control,#bootstrap-theme input[type=month].form-control{line-height:30px}#bootstrap-theme input[type=date].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=date],#bootstrap-theme .input-group-sm>input.input-group-addon[type=date],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=date],.input-group-sm #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=time],#bootstrap-theme .input-group-sm>input.input-group-addon[type=time],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=time],.input-group-sm #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=datetime-local],#bootstrap-theme .input-group-sm>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=datetime-local],.input-group-sm #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=month],#bootstrap-theme .input-group-sm>input.input-group-addon[type=month],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=month],.input-group-sm #bootstrap-theme input[type=month]{line-height:30px}#bootstrap-theme input[type=date].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=date],#bootstrap-theme .input-group-lg>input.input-group-addon[type=date],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=date],.input-group-lg #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=time],#bootstrap-theme .input-group-lg>input.input-group-addon[type=time],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=time],.input-group-lg #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=datetime-local],#bootstrap-theme .input-group-lg>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=datetime-local],.input-group-lg #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=month],#bootstrap-theme .input-group-lg>input.input-group-addon[type=month],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=month],.input-group-lg #bootstrap-theme input[type=month]{line-height:54px}}#bootstrap-theme .form-group{margin-bottom:15px}#bootstrap-theme .radio,#bootstrap-theme .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}#bootstrap-theme .radio.disabled label,fieldset[disabled] #bootstrap-theme .radio label,#bootstrap-theme .checkbox.disabled label,fieldset[disabled] #bootstrap-theme .checkbox label{cursor:not-allowed}#bootstrap-theme .radio label,#bootstrap-theme .checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}#bootstrap-theme .radio input[type=radio],#bootstrap-theme .radio-inline input[type=radio],#bootstrap-theme .checkbox input[type=checkbox],#bootstrap-theme .checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}#bootstrap-theme .radio+.radio,#bootstrap-theme .checkbox+.checkbox{margin-top:-5px}#bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}#bootstrap-theme .radio-inline.disabled,fieldset[disabled] #bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline.disabled,fieldset[disabled] #bootstrap-theme .checkbox-inline{cursor:not-allowed}#bootstrap-theme .radio-inline+.radio-inline,#bootstrap-theme .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}#bootstrap-theme .form-control-static{min-height:34px;padding-top:5px;padding-bottom:5px;margin-bottom:0}#bootstrap-theme .form-control-static.input-lg,#bootstrap-theme .input-group-lg>.form-control-static.form-control,#bootstrap-theme .input-group-lg>.form-control-static.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.form-control-static.btn,#bootstrap-theme .form-control-static.input-sm,#bootstrap-theme .input-group-sm>.form-control-static.form-control,#bootstrap-theme .input-group-sm>.form-control-static.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}#bootstrap-theme .input-sm,#bootstrap-theme .input-group-sm>.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme select.input-sm,#bootstrap-theme .input-group-sm>select.form-control,#bootstrap-theme .input-group-sm>select.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>select.btn{height:30px;line-height:30px}#bootstrap-theme textarea.input-sm,#bootstrap-theme .input-group-sm>textarea.form-control,#bootstrap-theme .input-group-sm>textarea.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-sm,#bootstrap-theme .input-group-sm>select.form-control[multiple],#bootstrap-theme .input-group-sm>select.input-group-addon[multiple],#bootstrap-theme .input-group-sm>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .form-group-sm select.form-control{height:30px;line-height:30px}#bootstrap-theme .form-group-sm textarea.form-control,#bootstrap-theme .form-group-sm select[multiple].form-control{height:auto}#bootstrap-theme .form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .input-lg,#bootstrap-theme .input-group-lg>.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme select.input-lg,#bootstrap-theme .input-group-lg>select.form-control,#bootstrap-theme .input-group-lg>select.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>select.btn{height:54px;line-height:54px}#bootstrap-theme textarea.input-lg,#bootstrap-theme .input-group-lg>textarea.form-control,#bootstrap-theme .input-group-lg>textarea.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-lg,#bootstrap-theme .input-group-lg>select.form-control[multiple],#bootstrap-theme .input-group-lg>select.input-group-addon[multiple],#bootstrap-theme .input-group-lg>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .form-group-lg select.form-control{height:54px;line-height:54px}#bootstrap-theme .form-group-lg textarea.form-control,#bootstrap-theme .form-group-lg select[multiple].form-control{height:auto}#bootstrap-theme .form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .has-feedback{position:relative}#bootstrap-theme .has-feedback .form-control{padding-right:37.5px}#bootstrap-theme .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:30px;height:30px;line-height:30px;text-align:center;pointer-events:none}#bootstrap-theme .input-lg+.form-control-feedback,#bootstrap-theme .input-group-lg>.form-control+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-lg+.form-control-feedback,#bootstrap-theme .form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}#bootstrap-theme .input-sm+.form-control-feedback,#bootstrap-theme .input-group-sm>.form-control+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-sm+.form-control-feedback,#bootstrap-theme .form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}#bootstrap-theme .has-success .help-block,#bootstrap-theme .has-success .control-label,#bootstrap-theme .has-success .radio,#bootstrap-theme .has-success .checkbox,#bootstrap-theme .has-success .radio-inline,#bootstrap-theme .has-success .checkbox-inline,#bootstrap-theme .has-success.radio label,#bootstrap-theme .has-success.checkbox label,#bootstrap-theme .has-success.radio-inline label,#bootstrap-theme .has-success.checkbox-inline label{color:#468847}#bootstrap-theme .has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}#bootstrap-theme .has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}#bootstrap-theme .has-success .form-control-feedback{color:#468847}#bootstrap-theme .has-warning .help-block,#bootstrap-theme .has-warning .control-label,#bootstrap-theme .has-warning .radio,#bootstrap-theme .has-warning .checkbox,#bootstrap-theme .has-warning .radio-inline,#bootstrap-theme .has-warning .checkbox-inline,#bootstrap-theme .has-warning.radio label,#bootstrap-theme .has-warning.checkbox label,#bootstrap-theme .has-warning.radio-inline label,#bootstrap-theme .has-warning.checkbox-inline label{color:#c09853}#bootstrap-theme .has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}#bootstrap-theme .has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}#bootstrap-theme .has-warning .form-control-feedback{color:#c09853}#bootstrap-theme .has-error .help-block,#bootstrap-theme .has-error .control-label,#bootstrap-theme .has-error .radio,#bootstrap-theme .has-error .checkbox,#bootstrap-theme .has-error .radio-inline,#bootstrap-theme .has-error .checkbox-inline,#bootstrap-theme .has-error.radio label,#bootstrap-theme .has-error.checkbox label,#bootstrap-theme .has-error.radio-inline label,#bootstrap-theme .has-error.checkbox-inline label{color:#b94a48}#bootstrap-theme .has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}#bootstrap-theme .has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}#bootstrap-theme .has-error .form-control-feedback{color:#b94a48}#bootstrap-theme .has-feedback label~.form-control-feedback{top:25px}#bootstrap-theme .has-feedback label.sr-only~.form-control-feedback{top:0}#bootstrap-theme .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media (min-width:768px){#bootstrap-theme .form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .form-inline .form-control-static{display:inline-block}#bootstrap-theme .form-inline .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .form-inline .input-group .input-group-addon,#bootstrap-theme .form-inline .input-group .input-group-btn,#bootstrap-theme .form-inline .input-group .form-control{width:auto}#bootstrap-theme .form-inline .input-group>.form-control{width:100%}#bootstrap-theme .form-inline .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio,#bootstrap-theme .form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio label,#bootstrap-theme .form-inline .checkbox label{padding-left:0}#bootstrap-theme .form-inline .radio input[type=radio],#bootstrap-theme .form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .form-inline .has-feedback .form-control-feedback{top:0}}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox,#bootstrap-theme .form-horizontal .radio-inline,#bootstrap-theme .form-horizontal .checkbox-inline{padding-top:5px;margin-top:0;margin-bottom:0}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox{min-height:25px}#bootstrap-theme .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}#bootstrap-theme .form-horizontal .form-group:before,#bootstrap-theme .form-horizontal .form-group:after{display:table;content:" "}#bootstrap-theme .form-horizontal .form-group:after{clear:both}@media (min-width:768px){#bootstrap-theme .form-horizontal .control-label{padding-top:5px;margin-bottom:0;text-align:right}}#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-lg .control-label{padding-top:15px;font-size:18px}}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}#bootstrap-theme .btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:4px 8px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus,#bootstrap-theme .btn:active:focus,#bootstrap-theme .btn:active.focus,#bootstrap-theme .btn.active:focus,#bootstrap-theme .btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme .btn:hover,#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus{color:#fff;text-decoration:none}#bootstrap-theme .btn:active,#bootstrap-theme .btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn.disabled,#bootstrap-theme .btn[disabled],fieldset[disabled] #bootstrap-theme .btn{cursor:not-allowed;-webkit-filter:alpha(opacity=65);filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme a.btn.disabled,fieldset[disabled] #bootstrap-theme a.btn{pointer-events:none}#bootstrap-theme .btn-default{color:#fff;background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:focus,#bootstrap-theme .btn-default.focus{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:hover{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active,#bootstrap-theme .btn-default.active,.open>#bootstrap-theme .btn-default.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active:hover,#bootstrap-theme .btn-default:active:focus,#bootstrap-theme .btn-default:active.focus,#bootstrap-theme .btn-default.active:hover,#bootstrap-theme .btn-default.active:focus,#bootstrap-theme .btn-default.active.focus,.open>#bootstrap-theme .btn-default.dropdown-toggle:hover,.open>#bootstrap-theme .btn-default.dropdown-toggle:focus,.open>#bootstrap-theme .btn-default.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default.disabled:hover,#bootstrap-theme .btn-default.disabled:focus,#bootstrap-theme .btn-default.disabled.focus,#bootstrap-theme .btn-default[disabled]:hover,#bootstrap-theme .btn-default[disabled]:focus,#bootstrap-theme .btn-default[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-default:hover,fieldset[disabled] #bootstrap-theme .btn-default:focus,fieldset[disabled] #bootstrap-theme .btn-default.focus{background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-primary{color:#fff;background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary:focus,#bootstrap-theme .btn-primary.focus{color:#fff;background-color:#565752;border-color:#2f302d}#bootstrap-theme .btn-primary:hover{color:#fff;background-color:#565752;border-color:#51524d}#bootstrap-theme .btn-primary:active,#bootstrap-theme .btn-primary.active,.open>#bootstrap-theme .btn-primary.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:#51524d}#bootstrap-theme .btn-primary:active:hover,#bootstrap-theme .btn-primary:active:focus,#bootstrap-theme .btn-primary:active.focus,#bootstrap-theme .btn-primary.active:hover,#bootstrap-theme .btn-primary.active:focus,#bootstrap-theme .btn-primary.active.focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle:hover,.open>#bootstrap-theme .btn-primary.dropdown-toggle:focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:#2f302d}#bootstrap-theme .btn-primary.disabled:hover,#bootstrap-theme .btn-primary.disabled:focus,#bootstrap-theme .btn-primary.disabled.focus,#bootstrap-theme .btn-primary[disabled]:hover,#bootstrap-theme .btn-primary[disabled]:focus,#bootstrap-theme .btn-primary[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-primary:hover,fieldset[disabled] #bootstrap-theme .btn-primary:focus,fieldset[disabled] #bootstrap-theme .btn-primary.focus{background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-success{color:#fff;background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success:focus,#bootstrap-theme .btn-success.focus{color:#fff;background-color:#59822c;border-color:#324919}#bootstrap-theme .btn-success:hover{color:#fff;background-color:#59822c;border-color:#547a29}#bootstrap-theme .btn-success:active,#bootstrap-theme .btn-success.active,.open>#bootstrap-theme .btn-success.dropdown-toggle{color:#fff;background-color:#59822c;background-image:none;border-color:#547a29}#bootstrap-theme .btn-success:active:hover,#bootstrap-theme .btn-success:active:focus,#bootstrap-theme .btn-success:active.focus,#bootstrap-theme .btn-success.active:hover,#bootstrap-theme .btn-success.active:focus,#bootstrap-theme .btn-success.active.focus,.open>#bootstrap-theme .btn-success.dropdown-toggle:hover,.open>#bootstrap-theme .btn-success.dropdown-toggle:focus,.open>#bootstrap-theme .btn-success.dropdown-toggle.focus{color:#fff;background-color:#476723;border-color:#324919}#bootstrap-theme .btn-success.disabled:hover,#bootstrap-theme .btn-success.disabled:focus,#bootstrap-theme .btn-success.disabled.focus,#bootstrap-theme .btn-success[disabled]:hover,#bootstrap-theme .btn-success[disabled]:focus,#bootstrap-theme .btn-success[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-success:hover,fieldset[disabled] #bootstrap-theme .btn-success:focus,fieldset[disabled] #bootstrap-theme .btn-success.focus{background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success .badge{color:#73a839;background-color:#fff}#bootstrap-theme .btn-info{color:#000;background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info:focus,#bootstrap-theme .btn-info.focus{color:#000;background-color:#9bd1fd;border-color:#50affc}#bootstrap-theme .btn-info:hover{color:#000;background-color:#9bd1fd;border-color:#91ccfd}#bootstrap-theme .btn-info:active,#bootstrap-theme .btn-info.active,.open>#bootstrap-theme .btn-info.dropdown-toggle{color:#000;background-color:#9bd1fd;background-image:none;border-color:#91ccfd}#bootstrap-theme .btn-info:active:hover,#bootstrap-theme .btn-info:active:focus,#bootstrap-theme .btn-info:active.focus,#bootstrap-theme .btn-info.active:hover,#bootstrap-theme .btn-info.active:focus,#bootstrap-theme .btn-info.active.focus,.open>#bootstrap-theme .btn-info.dropdown-toggle:hover,.open>#bootstrap-theme .btn-info.dropdown-toggle:focus,.open>#bootstrap-theme .btn-info.dropdown-toggle.focus{color:#000;background-color:#78c1fc;border-color:#50affc}#bootstrap-theme .btn-info.disabled:hover,#bootstrap-theme .btn-info.disabled:focus,#bootstrap-theme .btn-info.disabled.focus,#bootstrap-theme .btn-info[disabled]:hover,#bootstrap-theme .btn-info[disabled]:focus,#bootstrap-theme .btn-info[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-info:hover,fieldset[disabled] #bootstrap-theme .btn-info:focus,fieldset[disabled] #bootstrap-theme .btn-info.focus{background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info .badge{color:#cde8fe;background-color:#000}#bootstrap-theme .btn-warning{color:#fff;background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning:focus,#bootstrap-theme .btn-warning.focus{color:#fff;background-color:#aa4200;border-color:#5e2400}#bootstrap-theme .btn-warning:hover{color:#fff;background-color:#aa4200;border-color:#a03e00}#bootstrap-theme .btn-warning:active,#bootstrap-theme .btn-warning.active,.open>#bootstrap-theme .btn-warning.dropdown-toggle{color:#fff;background-color:#aa4200;background-image:none;border-color:#a03e00}#bootstrap-theme .btn-warning:active:hover,#bootstrap-theme .btn-warning:active:focus,#bootstrap-theme .btn-warning:active.focus,#bootstrap-theme .btn-warning.active:hover,#bootstrap-theme .btn-warning.active:focus,#bootstrap-theme .btn-warning.active.focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle:hover,.open>#bootstrap-theme .btn-warning.dropdown-toggle:focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle.focus{color:#fff;background-color:#863400;border-color:#5e2400}#bootstrap-theme .btn-warning.disabled:hover,#bootstrap-theme .btn-warning.disabled:focus,#bootstrap-theme .btn-warning.disabled.focus,#bootstrap-theme .btn-warning[disabled]:hover,#bootstrap-theme .btn-warning[disabled]:focus,#bootstrap-theme .btn-warning[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-warning:hover,fieldset[disabled] #bootstrap-theme .btn-warning:focus,fieldset[disabled] #bootstrap-theme .btn-warning.focus{background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning .badge{color:#dd5600;background-color:#fff}#bootstrap-theme .btn-danger{color:#fff;background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger:focus,#bootstrap-theme .btn-danger.focus{color:#fff;background-color:#9a161a;border-color:#570c0f}#bootstrap-theme .btn-danger:hover{color:#fff;background-color:#9a161a;border-color:#911419}#bootstrap-theme .btn-danger:active,#bootstrap-theme .btn-danger.active,.open>#bootstrap-theme .btn-danger.dropdown-toggle{color:#fff;background-color:#9a161a;background-image:none;border-color:#911419}#bootstrap-theme .btn-danger:active:hover,#bootstrap-theme .btn-danger:active:focus,#bootstrap-theme .btn-danger:active.focus,#bootstrap-theme .btn-danger.active:hover,#bootstrap-theme .btn-danger.active:focus,#bootstrap-theme .btn-danger.active.focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle:hover,.open>#bootstrap-theme .btn-danger.dropdown-toggle:focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle.focus{color:#fff;background-color:#7b1115;border-color:#570c0f}#bootstrap-theme .btn-danger.disabled:hover,#bootstrap-theme .btn-danger.disabled:focus,#bootstrap-theme .btn-danger.disabled.focus,#bootstrap-theme .btn-danger[disabled]:hover,#bootstrap-theme .btn-danger[disabled]:focus,#bootstrap-theme .btn-danger[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-danger:hover,fieldset[disabled] #bootstrap-theme .btn-danger:focus,fieldset[disabled] #bootstrap-theme .btn-danger.focus{background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger .badge{color:#c71c22;background-color:#fff}#bootstrap-theme .btn-link{font-weight:400;color:#2786c2;border-radius:0}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:active,#bootstrap-theme .btn-link.active,#bootstrap-theme .btn-link[disabled],fieldset[disabled] #bootstrap-theme .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus,#bootstrap-theme .btn-link:active{border-color:transparent}#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus{color:#1a5a82;text-decoration:underline;background-color:transparent}#bootstrap-theme .btn-link[disabled]:hover,#bootstrap-theme .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .btn-link:hover,fieldset[disabled] #bootstrap-theme .btn-link:focus{color:#999;text-decoration:none}#bootstrap-theme .btn-lg,#bootstrap-theme .btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .btn-sm,#bootstrap-theme .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-xs,#bootstrap-theme .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-block{display:block;width:100%}#bootstrap-theme .btn-block+.btn-block{margin-top:5px}#bootstrap-theme input[type=submit].btn-block,#bootstrap-theme input[type=reset].btn-block,#bootstrap-theme input[type=button].btn-block{width:100%}#bootstrap-theme .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}#bootstrap-theme .fade.in{opacity:1}#bootstrap-theme .collapse{display:none}#bootstrap-theme .collapse.in{display:block}#bootstrap-theme tr.collapse.in{display:table-row}#bootstrap-theme tbody.collapse.in{display:table-row-group}#bootstrap-theme .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}#bootstrap-theme .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}#bootstrap-theme .dropup,#bootstrap-theme .dropdown{position:relative}#bootstrap-theme .dropdown-toggle:focus{outline:0}#bootstrap-theme .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}#bootstrap-theme .dropdown-menu.pull-right{right:0;left:auto}#bootstrap-theme .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}#bootstrap-theme .dropdown-menu>li>a:hover,#bootstrap-theme .dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#000}#bootstrap-theme .dropdown-menu>.active>a,#bootstrap-theme .dropdown-menu>.active>a:hover,#bootstrap-theme .dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;outline:0}#bootstrap-theme .dropdown-menu>.disabled>a,#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{color:#999}#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;-webkit-filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}#bootstrap-theme .open>.dropdown-menu{display:block}#bootstrap-theme .open>a{outline:0}#bootstrap-theme .dropdown-menu-right{right:0;left:auto}#bootstrap-theme .dropdown-menu-left{right:auto;left:0}#bootstrap-theme .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999;white-space:nowrap}#bootstrap-theme .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}#bootstrap-theme .pull-right>.dropdown-menu{right:0;left:auto}#bootstrap-theme .dropup .caret,#bootstrap-theme .navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9}#bootstrap-theme .dropup .dropdown-menu,#bootstrap-theme .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){#bootstrap-theme .navbar-right .dropdown-menu{right:0;left:auto}#bootstrap-theme .navbar-right .dropdown-menu-left{left:0;right:auto}}#bootstrap-theme .btn-group,#bootstrap-theme .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}#bootstrap-theme .btn-group>.btn,#bootstrap-theme .btn-group-vertical>.btn{position:relative;float:left}#bootstrap-theme .btn-group>.btn:hover,#bootstrap-theme .btn-group>.btn:focus,#bootstrap-theme .btn-group>.btn:active,#bootstrap-theme .btn-group>.btn.active,#bootstrap-theme .btn-group-vertical>.btn:hover,#bootstrap-theme .btn-group-vertical>.btn:focus,#bootstrap-theme .btn-group-vertical>.btn:active,#bootstrap-theme .btn-group-vertical>.btn.active{z-index:2}#bootstrap-theme .btn-group .btn+.btn,#bootstrap-theme .btn-group .btn+.btn-group,#bootstrap-theme .btn-group .btn-group+.btn,#bootstrap-theme .btn-group .btn-group+.btn-group{margin-left:-1px}#bootstrap-theme .btn-toolbar{margin-left:-5px}#bootstrap-theme .btn-toolbar:before,#bootstrap-theme .btn-toolbar:after{display:table;content:" "}#bootstrap-theme .btn-toolbar:after{clear:both}#bootstrap-theme .btn-toolbar .btn,#bootstrap-theme .btn-toolbar .btn-group,#bootstrap-theme .btn-toolbar .input-group{float:left}#bootstrap-theme .btn-toolbar>.btn,#bootstrap-theme .btn-toolbar>.btn-group,#bootstrap-theme .btn-toolbar>.input-group{margin-left:5px}#bootstrap-theme .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}#bootstrap-theme .btn-group>.btn:first-child{margin-left:0}#bootstrap-theme .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn:last-child:not(:first-child),#bootstrap-theme .btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group>.btn-group{float:left}#bootstrap-theme .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group .dropdown-toggle:active,#bootstrap-theme .btn-group.open .dropdown-toggle{outline:0}#bootstrap-theme .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}#bootstrap-theme .btn-group>.btn-lg+.dropdown-toggle,#bootstrap-theme .btn-group-lg.btn-group>.btn+.dropdown-toggle,#bootstrap-theme .btn-group-lg>.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}#bootstrap-theme .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn .caret{margin-left:0}#bootstrap-theme .btn-lg .caret,#bootstrap-theme .btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}#bootstrap-theme .dropup .btn-lg .caret,#bootstrap-theme .dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}#bootstrap-theme .btn-group-vertical>.btn,#bootstrap-theme .btn-group-vertical>.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}#bootstrap-theme .btn-group-vertical>.btn-group:before,#bootstrap-theme .btn-group-vertical>.btn-group:after{display:table;content:" "}#bootstrap-theme .btn-group-vertical>.btn-group:after{clear:both}#bootstrap-theme .btn-group-vertical>.btn-group>.btn{float:none}#bootstrap-theme .btn-group-vertical>.btn+.btn,#bootstrap-theme .btn-group-vertical>.btn+.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group+.btn,#bootstrap-theme .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}#bootstrap-theme .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}#bootstrap-theme .btn-group-justified>.btn,#bootstrap-theme .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}#bootstrap-theme .btn-group-justified>.btn-group .btn{width:100%}#bootstrap-theme .btn-group-justified>.btn-group .dropdown-menu{left:auto}#bootstrap-theme [data-toggle=buttons]>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn input[type=checkbox],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}#bootstrap-theme .input-group{position:relative;display:table;border-collapse:separate}#bootstrap-theme .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}#bootstrap-theme .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}#bootstrap-theme .input-group .form-control:focus{z-index:3}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn,#bootstrap-theme .input-group .form-control{display:table-cell}#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child),#bootstrap-theme .input-group-btn:not(:first-child):not(:last-child),#bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}#bootstrap-theme .input-group-addon{padding:4px 8px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}#bootstrap-theme .input-group-addon.input-sm,#bootstrap-theme .input-group-sm>.input-group-addon.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:12px;border-radius:3px}#bootstrap-theme .input-group-addon.input-lg,#bootstrap-theme .input-group-lg>.input-group-addon.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.input-group-addon.btn{padding:14px 16px;font-size:18px;border-radius:6px}#bootstrap-theme .input-group-addon input[type=radio],#bootstrap-theme .input-group-addon input[type=checkbox]{margin-top:0}#bootstrap-theme .input-group .form-control:first-child,#bootstrap-theme .input-group-addon:first-child,#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:first-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),#bootstrap-theme .input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .input-group-addon:first-child{border-right:0}#bootstrap-theme .input-group .form-control:last-child,#bootstrap-theme .input-group-addon:last-child,#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:last-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:first-child>.btn:not(:first-child),#bootstrap-theme .input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .input-group-addon:last-child{border-left:0}#bootstrap-theme .input-group-btn{position:relative;font-size:0;white-space:nowrap}#bootstrap-theme .input-group-btn>.btn{position:relative}#bootstrap-theme .input-group-btn>.btn+.btn{margin-left:-1px}#bootstrap-theme .input-group-btn>.btn:hover,#bootstrap-theme .input-group-btn>.btn:focus,#bootstrap-theme .input-group-btn>.btn:active{z-index:2}#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group{margin-right:-1px}#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}#bootstrap-theme .nav{padding-left:0;margin-bottom:0;list-style:none}#bootstrap-theme .nav:before,#bootstrap-theme .nav:after{display:table;content:" "}#bootstrap-theme .nav:after{clear:both}#bootstrap-theme .nav>li{position:relative;display:block}#bootstrap-theme .nav>li>a{position:relative;display:block;padding:10px 15px}#bootstrap-theme .nav>li>a:hover,#bootstrap-theme .nav>li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .nav>li.disabled>a{color:#999}#bootstrap-theme .nav>li.disabled>a:hover,#bootstrap-theme .nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}#bootstrap-theme .nav .open>a,#bootstrap-theme .nav .open>a:hover,#bootstrap-theme .nav .open>a:focus{background-color:#eee;border-color:#2786c2}#bootstrap-theme .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .nav>li>a>img{max-width:none}#bootstrap-theme .nav-tabs{border-bottom:1px solid #ddd}#bootstrap-theme .nav-tabs>li{float:left;margin-bottom:-1px}#bootstrap-theme .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}#bootstrap-theme .nav-tabs>li.active>a,#bootstrap-theme .nav-tabs>li.active>a:hover,#bootstrap-theme .nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}#bootstrap-theme .nav-pills>li{float:left}#bootstrap-theme .nav-pills>li>a{border-radius:4px}#bootstrap-theme .nav-pills>li+li{margin-left:2px}#bootstrap-theme .nav-pills>li.active>a,#bootstrap-theme .nav-pills>li.active>a:hover,#bootstrap-theme .nav-pills>li.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .nav-stacked>li{float:none}#bootstrap-theme .nav-stacked>li+li{margin-top:2px;margin-left:0}#bootstrap-theme .nav-justified,#bootstrap-theme .nav-tabs.nav-justified{width:100%}#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{float:none}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}#bootstrap-theme .nav-justified>.dropdown .dropdown-menu,#bootstrap-theme .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{display:table-cell;width:1%}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:0}}#bootstrap-theme .nav-tabs-justified,#bootstrap-theme .nav-tabs.nav-justified{border-bottom:0}#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}#bootstrap-theme .tab-content>.tab-pane{display:none}#bootstrap-theme .tab-content>.active{display:block}#bootstrap-theme .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}#bootstrap-theme .navbar:before,#bootstrap-theme .navbar:after{display:table;content:" "}#bootstrap-theme .navbar:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar{border-radius:4px}}#bootstrap-theme .navbar-header:before,#bootstrap-theme .navbar-header:after{display:table;content:" "}#bootstrap-theme .navbar-header:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar-header{float:left}}#bootstrap-theme .navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}#bootstrap-theme .navbar-collapse:before,#bootstrap-theme .navbar-collapse:after{display:table;content:" "}#bootstrap-theme .navbar-collapse:after{clear:both}#bootstrap-theme .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){#bootstrap-theme .navbar-collapse{width:auto;border-top:0;box-shadow:none}#bootstrap-theme .navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}#bootstrap-theme .navbar-collapse.in{overflow-y:visible}.navbar-fixed-top #bootstrap-theme .navbar-collapse,.navbar-static-top #bootstrap-theme .navbar-collapse,.navbar-fixed-bottom #bootstrap-theme .navbar-collapse{padding-right:0;padding-left:0}}#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:200px}}@media (min-width:768px){#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{border-radius:0}}#bootstrap-theme .navbar-fixed-top{top:0;border-width:0 0 1px}#bootstrap-theme .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}#bootstrap-theme .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){#bootstrap-theme .navbar-static-top{border-radius:0}}#bootstrap-theme .navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}#bootstrap-theme .navbar-brand:hover,#bootstrap-theme .navbar-brand:focus{text-decoration:none}#bootstrap-theme .navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container #bootstrap-theme .navbar-brand,.navbar>.container-fluid #bootstrap-theme .navbar-brand{margin-left:-15px}}#bootstrap-theme .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}#bootstrap-theme .navbar-toggle:focus{outline:0}#bootstrap-theme .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}#bootstrap-theme .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){#bootstrap-theme .navbar-toggle{display:none}}#bootstrap-theme .navbar-nav{margin:7.5px -15px}#bootstrap-theme .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){#bootstrap-theme .navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a,#bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a{line-height:20px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){#bootstrap-theme .navbar-nav{float:left;margin:0}#bootstrap-theme .navbar-nav>li{float:left}#bootstrap-theme .navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}#bootstrap-theme .navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:10px;margin-bottom:10px}@media (min-width:768px){#bootstrap-theme .navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .navbar-form .form-control-static{display:inline-block}#bootstrap-theme .navbar-form .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .navbar-form .input-group .input-group-addon,#bootstrap-theme .navbar-form .input-group .input-group-btn,#bootstrap-theme .navbar-form .input-group .form-control{width:auto}#bootstrap-theme .navbar-form .input-group>.form-control{width:100%}#bootstrap-theme .navbar-form .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio,#bootstrap-theme .navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio label,#bootstrap-theme .navbar-form .checkbox label{padding-left:0}#bootstrap-theme .navbar-form .radio input[type=radio],#bootstrap-theme .navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){#bootstrap-theme .navbar-form .form-group{margin-bottom:5px}#bootstrap-theme .navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){#bootstrap-theme .navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}#bootstrap-theme .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .navbar-btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-sm,#bootstrap-theme .btn-group-sm>.navbar-btn.btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-xs,#bootstrap-theme .btn-group-xs>.navbar-btn.btn{margin-top:14px;margin-bottom:14px}#bootstrap-theme .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){#bootstrap-theme .navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){#bootstrap-theme .navbar-left{float:left !important}#bootstrap-theme .navbar-right{float:right !important;margin-right:-15px}#bootstrap-theme .navbar-right~.navbar-right{margin-right:0}}#bootstrap-theme .navbar-default{background-color:#000;border-color:#000}#bootstrap-theme .navbar-default .navbar-brand{color:#fff}#bootstrap-theme .navbar-default .navbar-brand:hover,#bootstrap-theme .navbar-default .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-default .navbar-text{color:#ddd}#bootstrap-theme .navbar-default .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.active>a,#bootstrap-theme .navbar-default .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:focus{color:#ddd;background-color:transparent}#bootstrap-theme .navbar-default .navbar-nav>.open>a,#bootstrap-theme .navbar-default .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#000}@media (max-width:767px){#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ddd;background-color:transparent}}#bootstrap-theme .navbar-default .navbar-toggle{border-color:#000}#bootstrap-theme .navbar-default .navbar-toggle:hover,#bootstrap-theme .navbar-default .navbar-toggle:focus{background-color:#000}#bootstrap-theme .navbar-default .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-default .navbar-collapse,#bootstrap-theme .navbar-default .navbar-form{border-color:#000}#bootstrap-theme .navbar-default .navbar-link{color:#fff}#bootstrap-theme .navbar-default .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-default .btn-link{color:#fff}#bootstrap-theme .navbar-default .btn-link:hover,#bootstrap-theme .navbar-default .btn-link:focus{color:#fff}#bootstrap-theme .navbar-default .btn-link[disabled]:hover,#bootstrap-theme .navbar-default .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus{color:#ddd}#bootstrap-theme .navbar-inverse{background-color:#cde8fe;border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-brand{color:#fff}#bootstrap-theme .navbar-inverse .navbar-brand:hover,#bootstrap-theme .navbar-inverse .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-inverse .navbar-text{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}#bootstrap-theme .navbar-inverse .navbar-nav>.open>a,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#b4ddfe}@media (max-width:767px){#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}#bootstrap-theme .navbar-inverse .navbar-toggle{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle:hover,#bootstrap-theme .navbar-inverse .navbar-toggle:focus{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-inverse .navbar-collapse,#bootstrap-theme .navbar-inverse .navbar-form{border-color:#aad8fd}#bootstrap-theme .navbar-inverse .navbar-link{color:#fff}#bootstrap-theme .navbar-inverse .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-inverse .btn-link{color:#fff}#bootstrap-theme .navbar-inverse .btn-link:hover,#bootstrap-theme .navbar-inverse .btn-link:focus{color:#fff}#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover,#bootstrap-theme .navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus{color:#ccc}#bootstrap-theme .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}#bootstrap-theme .breadcrumb>li{display:inline-block}#bootstrap-theme .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/ "}#bootstrap-theme .breadcrumb>.active{color:#999}#bootstrap-theme .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}#bootstrap-theme .pagination>li{display:inline}#bootstrap-theme .pagination>li>a,#bootstrap-theme .pagination>li>span{position:relative;float:left;padding:4px 8px;margin-left:-1px;line-height:1.428571429;color:#2786c2;text-decoration:none;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .pagination>li>a:hover,#bootstrap-theme .pagination>li>a:focus,#bootstrap-theme .pagination>li>span:hover,#bootstrap-theme .pagination>li>span:focus{z-index:2;color:#1a5a82;background-color:#eee;border-color:#ddd}#bootstrap-theme .pagination>li:first-child>a,#bootstrap-theme .pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .pagination>li:last-child>a,#bootstrap-theme .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}#bootstrap-theme .pagination>.active>a,#bootstrap-theme .pagination>.active>a:hover,#bootstrap-theme .pagination>.active>a:focus,#bootstrap-theme .pagination>.active>span,#bootstrap-theme .pagination>.active>span:hover,#bootstrap-theme .pagination>.active>span:focus{z-index:3;color:#999;cursor:default;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .pagination>.disabled>span,#bootstrap-theme .pagination>.disabled>span:hover,#bootstrap-theme .pagination>.disabled>span:focus,#bootstrap-theme .pagination>.disabled>a,#bootstrap-theme .pagination>.disabled>a:hover,#bootstrap-theme .pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}#bootstrap-theme .pagination-lg>li>a,#bootstrap-theme .pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .pagination-lg>li:first-child>a,#bootstrap-theme .pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}#bootstrap-theme .pagination-lg>li:last-child>a,#bootstrap-theme .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}#bootstrap-theme .pagination-sm>li>a,#bootstrap-theme .pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .pagination-sm>li:first-child>a,#bootstrap-theme .pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .pagination-sm>li:last-child>a,#bootstrap-theme .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}#bootstrap-theme .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}#bootstrap-theme .pager:before,#bootstrap-theme .pager:after{display:table;content:" "}#bootstrap-theme .pager:after{clear:both}#bootstrap-theme .pager li{display:inline}#bootstrap-theme .pager li>a,#bootstrap-theme .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}#bootstrap-theme .pager li>a:hover,#bootstrap-theme .pager li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .pager .next>a,#bootstrap-theme .pager .next>span{float:right}#bootstrap-theme .pager .previous>a,#bootstrap-theme .pager .previous>span{float:left}#bootstrap-theme .pager .disabled>a,#bootstrap-theme .pager .disabled>a:hover,#bootstrap-theme .pager .disabled>a:focus,#bootstrap-theme .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}#bootstrap-theme .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}#bootstrap-theme .label:empty{display:none}.btn #bootstrap-theme .label{position:relative;top:-1px}#bootstrap-theme a.label:hover,#bootstrap-theme a.label:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .label-default{background-color:#999}#bootstrap-theme .label-default[href]:hover,#bootstrap-theme .label-default[href]:focus{background-color:gray}#bootstrap-theme .label-primary{background-color:#000}#bootstrap-theme .label-primary[href]:hover,#bootstrap-theme .label-primary[href]:focus{background-color:#000}#bootstrap-theme .label-success{background-color:#73a839}#bootstrap-theme .label-success[href]:hover,#bootstrap-theme .label-success[href]:focus{background-color:#59822c}#bootstrap-theme .label-info{background-color:#cde8fe}#bootstrap-theme .label-info[href]:hover,#bootstrap-theme .label-info[href]:focus{background-color:#9bd1fd}#bootstrap-theme .label-warning{background-color:#dd5600}#bootstrap-theme .label-warning[href]:hover,#bootstrap-theme .label-warning[href]:focus{background-color:#aa4200}#bootstrap-theme .label-danger{background-color:#c71c22}#bootstrap-theme .label-danger[href]:hover,#bootstrap-theme .label-danger[href]:focus{background-color:#9a161a}#bootstrap-theme .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#000;border-radius:10px}#bootstrap-theme .badge:empty{display:none}.btn #bootstrap-theme .badge{position:relative;top:-1px}.btn-xs #bootstrap-theme .badge,#bootstrap-theme .btn-group-xs>.btn #bootstrap-theme .badge,.btn-group-xs>.btn #bootstrap-theme .badge{top:0;padding:1px 5px}.list-group-item.active>#bootstrap-theme .badge,.nav-pills>.active>a>#bootstrap-theme .badge{color:#2786c2;background-color:#fff}.list-group-item>#bootstrap-theme .badge{float:right}.list-group-item>#bootstrap-theme .badge+#bootstrap-theme .badge{margin-right:5px}.nav-pills>li>a>#bootstrap-theme .badge{margin-left:3px}#bootstrap-theme a.badge:hover,#bootstrap-theme a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{color:inherit}#bootstrap-theme .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}#bootstrap-theme .jumbotron>hr{border-top-color:#d5d5d5}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}#bootstrap-theme .jumbotron .container{max-width:100%}@media screen and (min-width:768px){#bootstrap-theme .jumbotron{padding-top:48px;padding-bottom:48px}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:60px;padding-left:60px}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{font-size:63px}}#bootstrap-theme .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}#bootstrap-theme .thumbnail>img,#bootstrap-theme .thumbnail a>img{display:block;max-width:100%;height:auto;margin-right:auto;margin-left:auto}#bootstrap-theme .thumbnail .caption{padding:9px;color:#555}#bootstrap-theme a.thumbnail:hover,#bootstrap-theme a.thumbnail:focus,#bootstrap-theme a.thumbnail.active{border-color:#2786c2}#bootstrap-theme .alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}#bootstrap-theme .alert h4{margin-top:0;color:inherit}#bootstrap-theme .alert .alert-link{font-weight:700}#bootstrap-theme .alert>p,#bootstrap-theme .alert>ul{margin-bottom:0}#bootstrap-theme .alert>p+p{margin-top:5px}#bootstrap-theme .alert-dismissable,#bootstrap-theme .alert-dismissible{padding-right:35px}#bootstrap-theme .alert-dismissable .close,#bootstrap-theme .alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}#bootstrap-theme .alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}#bootstrap-theme .alert-success hr{border-top-color:#c9e2b3}#bootstrap-theme .alert-success .alert-link{color:#356635}#bootstrap-theme .alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#bootstrap-theme .alert-info hr{border-top-color:#a6e1ec}#bootstrap-theme .alert-info .alert-link{color:#2d6987}#bootstrap-theme .alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}#bootstrap-theme .alert-warning hr{border-top-color:#f8e5be}#bootstrap-theme .alert-warning .alert-link{color:#a47e3c}#bootstrap-theme .alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}#bootstrap-theme .alert-danger hr{border-top-color:#e6c1c7}#bootstrap-theme .alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}#bootstrap-theme .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}#bootstrap-theme .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#000;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}#bootstrap-theme .progress-striped .progress-bar,#bootstrap-theme .progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}#bootstrap-theme .progress.active .progress-bar,#bootstrap-theme .progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}#bootstrap-theme .progress-bar-success{background-color:#73a839}.progress-striped #bootstrap-theme .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-info{background-color:#cde8fe}.progress-striped #bootstrap-theme .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-warning{background-color:#dd5600}.progress-striped #bootstrap-theme .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-danger{background-color:#c71c22}.progress-striped #bootstrap-theme .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .media{margin-top:15px}#bootstrap-theme .media:first-child{margin-top:0}#bootstrap-theme .media,#bootstrap-theme .media-body{overflow:hidden;zoom:1}#bootstrap-theme .media-body{width:10000px}#bootstrap-theme .media-object{display:block}#bootstrap-theme .media-object.img-thumbnail{max-width:none}#bootstrap-theme .media-right,#bootstrap-theme .media>.pull-right{padding-left:10px}#bootstrap-theme .media-left,#bootstrap-theme .media>.pull-left{padding-right:10px}#bootstrap-theme .media-left,#bootstrap-theme .media-right,#bootstrap-theme .media-body{display:table-cell;vertical-align:top}#bootstrap-theme .media-middle{vertical-align:middle}#bootstrap-theme .media-bottom{vertical-align:bottom}#bootstrap-theme .media-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .media-list{padding-left:0;list-style:none}#bootstrap-theme .list-group{padding-left:0;margin-bottom:20px}#bootstrap-theme .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}#bootstrap-theme .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .list-group-item.disabled,#bootstrap-theme .list-group-item.disabled:hover,#bootstrap-theme .list-group-item.disabled:focus{color:#999;cursor:not-allowed;background-color:#eee}#bootstrap-theme .list-group-item.disabled .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading{color:inherit}#bootstrap-theme .list-group-item.disabled .list-group-item-text,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-text,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-text{color:#999}#bootstrap-theme .list-group-item.active,#bootstrap-theme .list-group-item.active:hover,#bootstrap-theme .list-group-item.active:focus{z-index:2;color:#fff;background-color:#000;border-color:#000}#bootstrap-theme .list-group-item.active .list-group-item-heading,#bootstrap-theme .list-group-item.active .list-group-item-heading>small,#bootstrap-theme .list-group-item.active .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>.small{color:inherit}#bootstrap-theme .list-group-item.active .list-group-item-text,#bootstrap-theme .list-group-item.active:hover .list-group-item-text,#bootstrap-theme .list-group-item.active:focus .list-group-item-text{color:#666}#bootstrap-theme a.list-group-item,#bootstrap-theme button.list-group-item{color:#555}#bootstrap-theme a.list-group-item .list-group-item-heading,#bootstrap-theme button.list-group-item .list-group-item-heading{color:#333}#bootstrap-theme a.list-group-item:hover,#bootstrap-theme a.list-group-item:focus,#bootstrap-theme button.list-group-item:hover,#bootstrap-theme button.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}#bootstrap-theme button.list-group-item{width:100%;text-align:left}#bootstrap-theme .list-group-item-success{color:#468847;background-color:#dff0d8}#bootstrap-theme a.list-group-item-success,#bootstrap-theme button.list-group-item-success{color:#468847}#bootstrap-theme a.list-group-item-success .list-group-item-heading,#bootstrap-theme button.list-group-item-success .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-success:hover,#bootstrap-theme a.list-group-item-success:focus,#bootstrap-theme button.list-group-item-success:hover,#bootstrap-theme button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}#bootstrap-theme a.list-group-item-success.active,#bootstrap-theme a.list-group-item-success.active:hover,#bootstrap-theme a.list-group-item-success.active:focus,#bootstrap-theme button.list-group-item-success.active,#bootstrap-theme button.list-group-item-success.active:hover,#bootstrap-theme button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}#bootstrap-theme .list-group-item-info{color:#3a87ad;background-color:#d9edf7}#bootstrap-theme a.list-group-item-info,#bootstrap-theme button.list-group-item-info{color:#3a87ad}#bootstrap-theme a.list-group-item-info .list-group-item-heading,#bootstrap-theme button.list-group-item-info .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-info:hover,#bootstrap-theme a.list-group-item-info:focus,#bootstrap-theme button.list-group-item-info:hover,#bootstrap-theme button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}#bootstrap-theme a.list-group-item-info.active,#bootstrap-theme a.list-group-item-info.active:hover,#bootstrap-theme a.list-group-item-info.active:focus,#bootstrap-theme button.list-group-item-info.active,#bootstrap-theme button.list-group-item-info.active:hover,#bootstrap-theme button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}#bootstrap-theme .list-group-item-warning{color:#c09853;background-color:#fcf8e3}#bootstrap-theme a.list-group-item-warning,#bootstrap-theme button.list-group-item-warning{color:#c09853}#bootstrap-theme a.list-group-item-warning .list-group-item-heading,#bootstrap-theme button.list-group-item-warning .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-warning:hover,#bootstrap-theme a.list-group-item-warning:focus,#bootstrap-theme button.list-group-item-warning:hover,#bootstrap-theme button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}#bootstrap-theme a.list-group-item-warning.active,#bootstrap-theme a.list-group-item-warning.active:hover,#bootstrap-theme a.list-group-item-warning.active:focus,#bootstrap-theme button.list-group-item-warning.active,#bootstrap-theme button.list-group-item-warning.active:hover,#bootstrap-theme button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}#bootstrap-theme .list-group-item-danger{color:#b94a48;background-color:#f2dede}#bootstrap-theme a.list-group-item-danger,#bootstrap-theme button.list-group-item-danger{color:#b94a48}#bootstrap-theme a.list-group-item-danger .list-group-item-heading,#bootstrap-theme button.list-group-item-danger .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-danger:hover,#bootstrap-theme a.list-group-item-danger:focus,#bootstrap-theme button.list-group-item-danger:hover,#bootstrap-theme button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}#bootstrap-theme a.list-group-item-danger.active,#bootstrap-theme a.list-group-item-danger.active:hover,#bootstrap-theme a.list-group-item-danger.active:focus,#bootstrap-theme button.list-group-item-danger.active,#bootstrap-theme button.list-group-item-danger.active:hover,#bootstrap-theme button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}#bootstrap-theme .list-group-item-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .list-group-item-text{margin-bottom:0;line-height:1.3}#bootstrap-theme .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .panel-body{padding:15px}#bootstrap-theme .panel-body:before,#bootstrap-theme .panel-body:after{display:table;content:" "}#bootstrap-theme .panel-body:after{clear:both}#bootstrap-theme .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel-heading>.dropdown .dropdown-toggle{color:inherit}#bootstrap-theme .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}#bootstrap-theme .panel-title>a,#bootstrap-theme .panel-title>small,#bootstrap-theme .panel-title>.small,#bootstrap-theme .panel-title>small>a,#bootstrap-theme .panel-title>.small>a{color:inherit}#bootstrap-theme .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.list-group,#bootstrap-theme .panel>.panel-collapse>.list-group{margin-bottom:0}#bootstrap-theme .panel>.list-group .list-group-item,#bootstrap-theme .panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}#bootstrap-theme .panel>.list-group:first-child .list-group-item:first-child,#bootstrap-theme .panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.list-group:last-child .list-group-item:last-child,#bootstrap-theme .panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}#bootstrap-theme .list-group+.panel-footer{border-top-width:0}#bootstrap-theme .panel>.table,#bootstrap-theme .panel>.table-responsive>.table,#bootstrap-theme .panel>.panel-collapse>.table{margin-bottom:0}#bootstrap-theme .panel>.table caption,#bootstrap-theme .panel>.table-responsive>.table caption,#bootstrap-theme .panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}#bootstrap-theme .panel>.table:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}#bootstrap-theme .panel>.table:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}#bootstrap-theme .panel>.panel-body+.table,#bootstrap-theme .panel>.panel-body+.table-responsive,#bootstrap-theme .panel>.table+.panel-body,#bootstrap-theme .panel>.table-responsive+.panel-body{border-top:1px solid #ddd}#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child th,#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child td{border-top:0}#bootstrap-theme .panel>.table-bordered,#bootstrap-theme .panel>.table-responsive>.table-bordered{border:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}#bootstrap-theme .panel>.table-responsive{margin-bottom:0;border:0}#bootstrap-theme .panel-group{margin-bottom:20px}#bootstrap-theme .panel-group .panel{margin-bottom:0;border-radius:4px}#bootstrap-theme .panel-group .panel+.panel{margin-top:5px}#bootstrap-theme .panel-group .panel-heading{border-bottom:0}#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.panel-body,#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}#bootstrap-theme .panel-group .panel-footer{border-top:0}#bootstrap-theme .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}#bootstrap-theme .panel-default{border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading{color:#555;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#555}#bootstrap-theme .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-primary{border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading{color:#fff;background-color:#000;border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading .badge{color:#000;background-color:#fff}#bootstrap-theme .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-success{border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading{color:#468847;background-color:#73a839;border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-success>.panel-heading .badge{color:#73a839;background-color:#468847}#bootstrap-theme .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-info{border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading{color:#3a87ad;background-color:#cde8fe;border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-info>.panel-heading .badge{color:#cde8fe;background-color:#3a87ad}#bootstrap-theme .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-warning{border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading{color:#c09853;background-color:#dd5600;border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading .badge{color:#dd5600;background-color:#c09853}#bootstrap-theme .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-danger{border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading{color:#b94a48;background-color:#c71c22;border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading .badge{color:#c71c22;background-color:#b94a48}#bootstrap-theme .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}#bootstrap-theme .embed-responsive .embed-responsive-item,#bootstrap-theme .embed-responsive iframe,#bootstrap-theme .embed-responsive embed,#bootstrap-theme .embed-responsive object,#bootstrap-theme .embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}#bootstrap-theme .embed-responsive-16by9{padding-bottom:56.25%}#bootstrap-theme .embed-responsive-4by3{padding-bottom:75%}#bootstrap-theme .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}#bootstrap-theme .well-lg{padding:24px;border-radius:6px}#bootstrap-theme .well-sm{padding:9px;border-radius:3px}#bootstrap-theme .close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;-webkit-filter:alpha(opacity=20);filter:alpha(opacity=20);opacity:.2}#bootstrap-theme .close:hover,#bootstrap-theme .close:focus{color:#000;text-decoration:none;cursor:pointer;-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme .modal-open{overflow:hidden}#bootstrap-theme .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}#bootstrap-theme .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-ms-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out}#bootstrap-theme .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}#bootstrap-theme .modal-open .modal{overflow-x:hidden;overflow-y:auto}#bootstrap-theme .modal-dialog{position:relative;width:auto;margin:10px}#bootstrap-theme .modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}#bootstrap-theme .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}#bootstrap-theme .modal-backdrop.fade{-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .modal-backdrop.in{-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .modal-header{padding:15px;border-bottom:1px solid #e5e5e5}#bootstrap-theme .modal-header:before,#bootstrap-theme .modal-header:after{display:table;content:" "}#bootstrap-theme .modal-header:after{clear:both}#bootstrap-theme .modal-header .close{margin-top:-2px}#bootstrap-theme .modal-title{margin:0;line-height:1.428571429}#bootstrap-theme .modal-body{position:relative;padding:20px}#bootstrap-theme .modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}#bootstrap-theme .modal-footer:before,#bootstrap-theme .modal-footer:after{display:table;content:" "}#bootstrap-theme .modal-footer:after{clear:both}#bootstrap-theme .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}#bootstrap-theme .modal-footer .btn-group .btn+.btn{margin-left:-1px}#bootstrap-theme .modal-footer .btn-block+.btn-block{margin-left:0}#bootstrap-theme .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){#bootstrap-theme .modal-dialog{width:600px;margin:30px auto}#bootstrap-theme .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}#bootstrap-theme .modal-sm{width:300px}}@media (min-width:992px){#bootstrap-theme .modal-lg{width:900px}}#bootstrap-theme .tooltip{position:absolute;z-index:1070;display:block;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .tooltip.in{-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .tooltip.top{padding:5px 0;margin-top:-3px}#bootstrap-theme .tooltip.right{padding:0 5px;margin-left:3px}#bootstrap-theme .tooltip.bottom{padding:5px 0;margin-top:3px}#bootstrap-theme .tooltip.left{padding:0 5px;margin-left:-3px}#bootstrap-theme .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}#bootstrap-theme .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}#bootstrap-theme .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}#bootstrap-theme .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}#bootstrap-theme .popover.top{margin-top:-10px}#bootstrap-theme .popover.right{margin-left:10px}#bootstrap-theme .popover.bottom{margin-top:10px}#bootstrap-theme .popover.left{margin-left:-10px}#bootstrap-theme .popover>.arrow{border-width:11px}#bootstrap-theme .popover>.arrow,#bootstrap-theme .popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover>.arrow:after{content:"";border-width:10px}#bootstrap-theme .popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}#bootstrap-theme .popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}#bootstrap-theme .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}#bootstrap-theme .popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}#bootstrap-theme .popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}#bootstrap-theme .popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}#bootstrap-theme .popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}#bootstrap-theme .popover-content{padding:9px 14px}#bootstrap-theme .carousel{position:relative}#bootstrap-theme .carousel-inner{position:relative;width:100%;overflow:hidden}#bootstrap-theme .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}#bootstrap-theme .carousel-inner>.item>img,#bootstrap-theme .carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}@media (transform-3d),(-webkit-transform-3d){#bootstrap-theme .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-ms-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}#bootstrap-theme .carousel-inner>.item.next,#bootstrap-theme .carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.prev,#bootstrap-theme .carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.next.left,#bootstrap-theme .carousel-inner>.item.prev.right,#bootstrap-theme .carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}#bootstrap-theme .carousel-inner>.active,#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{display:block}#bootstrap-theme .carousel-inner>.active{left:0}#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{position:absolute;top:0;width:100%}#bootstrap-theme .carousel-inner>.next{left:100%}#bootstrap-theme .carousel-inner>.prev{left:-100%}#bootstrap-theme .carousel-inner>.next.left,#bootstrap-theme .carousel-inner>.prev.right{left:0}#bootstrap-theme .carousel-inner>.active.left{left:-100%}#bootstrap-theme .carousel-inner>.active.right{left:100%}#bootstrap-theme .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control:hover,#bootstrap-theme .carousel-control:focus{color:#fff;text-decoration:none;outline:0;-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:20px;height:20px;font-family:serif;line-height:1}#bootstrap-theme .carousel-control .icon-prev:before{content:"‹"}#bootstrap-theme .carousel-control .icon-next:before{content:"›"}#bootstrap-theme .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}#bootstrap-theme .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}#bootstrap-theme .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}#bootstrap-theme .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}#bootstrap-theme .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .icon-prev{margin-left:-10px}#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-next{margin-right:-10px}#bootstrap-theme .carousel-caption{right:20%;left:20%;padding-bottom:30px}#bootstrap-theme .carousel-indicators{bottom:20px}}#bootstrap-theme .clearfix:before,#bootstrap-theme .clearfix:after{display:table;content:" "}#bootstrap-theme .clearfix:after{clear:both}#bootstrap-theme .center-block{display:block;margin-right:auto;margin-left:auto}#bootstrap-theme .pull-right{float:right !important}#bootstrap-theme .pull-left{float:left !important}#bootstrap-theme .hide{display:none !important}#bootstrap-theme .show{display:block !important}#bootstrap-theme .invisible{visibility:hidden}#bootstrap-theme .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}#bootstrap-theme .hidden{display:none !important}#bootstrap-theme .affix{position:fixed}@-ms-viewport{width:device-width}#bootstrap-theme .visible-sm{display:none !important}#bootstrap-theme .visible-md{display:none !important}#bootstrap-theme .visible-lg{display:none !important}#bootstrap-theme .visible-xs-block,#bootstrap-theme .visible-xs-inline,#bootstrap-theme .visible-xs-inline-block,#bootstrap-theme .visible-sm-block,#bootstrap-theme .visible-sm-inline,#bootstrap-theme .visible-sm-inline-block,#bootstrap-theme .visible-md-block,#bootstrap-theme .visible-md-inline,#bootstrap-theme .visible-md-inline-block,#bootstrap-theme .visible-lg-block,#bootstrap-theme .visible-lg-inline,#bootstrap-theme .visible-lg-inline-block{display:none !important}@media (max-width:767px){#bootstrap-theme .visible-xs{display:block !important}#bootstrap-theme table.visible-xs{display:table !important}#bootstrap-theme tr.visible-xs{display:table-row !important}#bootstrap-theme th.visible-xs,#bootstrap-theme td.visible-xs{display:table-cell !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-block{display:block !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline{display:inline !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm{display:block !important}#bootstrap-theme table.visible-sm{display:table !important}#bootstrap-theme tr.visible-sm{display:table-row !important}#bootstrap-theme th.visible-sm,#bootstrap-theme td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md{display:block !important}#bootstrap-theme table.visible-md{display:table !important}#bootstrap-theme tr.visible-md{display:table-row !important}#bootstrap-theme th.visible-md,#bootstrap-theme td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg{display:block !important}#bootstrap-theme table.visible-lg{display:table !important}#bootstrap-theme tr.visible-lg{display:table-row !important}#bootstrap-theme th.visible-lg,#bootstrap-theme td.visible-lg{display:table-cell !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-block{display:block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline{display:inline !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){#bootstrap-theme .hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .hidden-md{display:none !important}}@media (min-width:1200px){#bootstrap-theme .hidden-lg{display:none !important}}#bootstrap-theme .visible-print{display:none !important}@media print{#bootstrap-theme .visible-print{display:block !important}#bootstrap-theme table.visible-print{display:table !important}#bootstrap-theme tr.visible-print{display:table-row !important}#bootstrap-theme th.visible-print,#bootstrap-theme td.visible-print{display:table-cell !important}}#bootstrap-theme .visible-print-block{display:none !important}@media print{#bootstrap-theme .visible-print-block{display:block !important}}#bootstrap-theme .visible-print-inline{display:none !important}@media print{#bootstrap-theme .visible-print-inline{display:inline !important}}#bootstrap-theme .visible-print-inline-block{display:none !important}@media print{#bootstrap-theme .visible-print-inline-block{display:inline-block !important}}@media print{#bootstrap-theme .hidden-print{display:none !important}}#bootstrap-theme ul,#bootstrap-theme ol{margin-left:0;margin-right:0}#bootstrap-theme .form-control.checkbox-inline>label{margin-left:9px}#bootstrap-theme label input[type=checkbox]:not(:checked)+*{font-weight:400}#bootstrap-theme .select2-choices{margin-bottom:0}#bootstrap-theme input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}#bootstrap-theme .select2-container .select2-choice>.select2-chosen{font-size:inherit;font-weight:400}#bootstrap-theme summary{display:list-item}#bootstrap-theme legend{position:initial;text-transform:inherit;float:none}#bootstrap-theme .form-control .select2-choice{border:0;border-radius:2px}#bootstrap-theme .form-control .select2-choice .select2-arrow{border-radius:0 2px 2px 0}#bootstrap-theme .form-control.select2-container{height:auto !important;padding:0}#bootstrap-theme .form-control.select2-container.select2-dropdown-open{border-color:#5897fb;border-radius:3px 3px 0 0}#bootstrap-theme .form-control .select2-container.select2-dropdown-open .select2-choices{border-radius:3px 3px 0 0}#bootstrap-theme .form-control.select2-container .select2-choices{border:0 !important;border-radius:3px}#bootstrap-theme .control-group.warning .select2-container .select2-choice,#bootstrap-theme .control-group.warning .select2-container .select2-choices,#bootstrap-theme .control-group.warning .select2-container-active .select2-choice,#bootstrap-theme .control-group.warning .select2-container-active .select2-choices,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.warning .select2-container-multi.select2-container-active .select2-choices{border:1px solid #c09853 !important}#bootstrap-theme .control-group.warning .select2-container .select2-choice div{border-left:1px solid #c09853 !important;background:#fcf8e3 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice,#bootstrap-theme .control-group.error .select2-container .select2-choices,#bootstrap-theme .control-group.error .select2-container-active .select2-choice,#bootstrap-theme .control-group.error .select2-container-active .select2-choices,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.error .select2-container-multi.select2-container-active .select2-choices{border:1px solid #b94a48 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice div{border-left:1px solid #b94a48 !important;background:#f2dede !important}#bootstrap-theme .control-group.info .select2-container .select2-choice,#bootstrap-theme .control-group.info .select2-container .select2-choices,#bootstrap-theme .control-group.info .select2-container-active .select2-choice,#bootstrap-theme .control-group.info .select2-container-active .select2-choices,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.info .select2-container-multi.select2-container-active .select2-choices{border:1px solid #3a87ad !important}#bootstrap-theme .control-group.info .select2-container .select2-choice div{border-left:1px solid #3a87ad !important;background:#d9edf7 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice,#bootstrap-theme .control-group.success .select2-container .select2-choices,#bootstrap-theme .control-group.success .select2-container-active .select2-choice,#bootstrap-theme .control-group.success .select2-container-active .select2-choices,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.success .select2-container-multi.select2-container-active .select2-choices{border:1px solid #468847 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice div{border-left:1px solid #468847 !important;background:#dff0d8 !important}
\ No newline at end of file
diff --git a/civicrm/ext/greenwich/scss/_tweaks.scss b/civicrm/ext/greenwich/scss/_tweaks.scss
index e472c7e5e416723b7aa1ad194624756a6a0f11a3..22133269e86f40747a5a07c90d8bb7a412949c7a 100644
--- a/civicrm/ext/greenwich/scss/_tweaks.scss
+++ b/civicrm/ext/greenwich/scss/_tweaks.scss
@@ -29,3 +29,9 @@ input[type="search"]::-webkit-search-cancel-button {
 summary {
   display: list-item;
 }
+/* Reset breaky stuff from some cms themes: https://lab.civicrm.org/dev/core/-/issues/5561 */
+legend {
+  position: initial;
+  text-transform: inherit;
+  float: none;
+}
diff --git a/civicrm/ext/oauth-client/info.xml b/civicrm/ext/oauth-client/info.xml
index ba7d1b14abac1b1e2fad53ce8d2146fe639f28ce..4a31ba1f351d230f5f2502cc031a39b70445e700 100644
--- a/civicrm/ext/oauth-client/info.xml
+++ b/civicrm/ext/oauth-client/info.xml
@@ -35,6 +35,7 @@
     <mixin>setting-php@1.0.0</mixin>
     <mixin>smarty@1.0.0</mixin>
     <mixin>entity-types-php@1.0.0</mixin>
+    <mixin>scan-classes@1.0.0</mixin>
   </mixins>
   <civix>
     <namespace>CRM/OAuth</namespace>
diff --git a/civicrm/ext/riverlea/.gitignore b/civicrm/ext/riverlea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..68ae180729e60bdf427c56ff9ad5fbf1c9f0c660
--- /dev/null
+++ b/civicrm/ext/riverlea/.gitignore
@@ -0,0 +1,2 @@
+css/.DS_store
+.DS_store
diff --git a/civicrm/ext/riverlea/CHANGELOG.md b/civicrm/ext/riverlea/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..968ea498f879f832fcb5ccdca99da2b41526a477
--- /dev/null
+++ b/civicrm/ext/riverlea/CHANGELOG.md
@@ -0,0 +1,544 @@
+1.80.14
+ - FIXED - regression caused by trying to reset clipping in Thames (ref: https://lab.civicrm.org/extensions/riverlea/-/issues/91)
+
+1.80.13
+ - FIXED - removed margin on ul.nav that's added by browser/CMS theme ul styling (seen on Message Template Afform)
+ - FIXED - extra box-shadow from .panel-heading (was creating an odd dble shadow)
+ - FIXED - clipped overflowing responsive tables in Thames (ref https://lab.civicrm.org/extensions/riverlea/-/issues/90)
+ - FIXED - .crm-pager padding/positioning (ref https://lab.civicrm.org/extensions/riverlea/-/issues/11#note_173013) - also removed hidden top pager from some results.
+ - FIXED - Joomla4+ Atum admin theme bug that adds underline on dropdown menu links
+ - CHANGED - removed second drop-shadow on BS .panel inside a .panel (visible in Walbrook, e.g. Message Template Afform).
+ - CHANGED - more balanced padding in panel-heading.
+ - ADDED - .nav.nav-pills style based on buttons Message Template Afform.
+
+1.80.12
+ - CHANGED - CRM Status Update page - added drop-shadow to dropdowns, made dropdown button border transparent, made h3 text colour match background variable.
+ - CHANGED - Minetta active accordion tab and panel bg colour now matches Greenwich
+ - FIXED - Accordion summary label colour inaccessible - needed !important, plus margin reset.
+ - FIXED - Accordion regression for Bootstrap accordions using .collapse, not summary/details (ref https://lab.civicrm.org/extensions/riverlea/-/issues/89). Also better namespaced Bootstrap collapse functions, and added support for BS4+ '.show'.
+ - REPLACED - replaced Inter font with font downloaded from https://gwfh.mranftl.com/fonts (the same place as Lato for Thames) and updated Walbrook's reference to it.
+
+1.80.11
+ - FIXED - Wallbrook avatar image returned to 100px as had created a gap (ext/riverlea/#87)
+ - FIXED - Double icon on .messages.crm-empty-table
+ - FIXED - changed specificity of .hiddenElement (ext/riverlea/#11) to ensure unhidden elements are unhidden.
+ - CHANGED - version numbering again. See note in ReadMe: the 2nd number represents the Civi version tested against, the 3rd number is the RL version number for that Civi version.
+ - CHANGED - Alert colour bg for .messages.crm-empty-table now matches icon colour ('info' range)
+ - CHANGED - streams/empty/_variables.css to match core variables.css
+ - CHANGED - reduce verbose Bootstrap table styling css in tables.css
+ - CHANGED - cascade order of table colours to put .crm-row-selected class last
+ - ADDED - contact merge screen error/ok/selected background colours (ext/riverlea/#88)
+ - ADDED - margin (`--crm-flex-gap`) to bottom of .description text.
+ - ADDED - accordion with error text and border colour to fix contrast ratio issues
+ - ADDED - D9 Claro .action-link margin reset
+
+1.1.10 / 5.80.9
+ - FIXED - D7 Seven theme .button style overwriting colours
+ - CHANGED - D7 Seven, matched page-padding.
+ - FIXED - Responsive contact dashboard, below 768px: wrapped contact-summary label/data, wrap action links.
+ - FIXED - Responsive contact dashboard, below 500px: improve hidden text and sidetabs width.
+ - MOVED - Responsive contact dashboard css from tabs.css to contactSummary.css
+ - CHANGED - Walbrook avatar image - made a little larger and thiner border
+ - FIXED - better name-spaced AFform padding for front-end vs backend
+
+1.1.9 / 5.80.8
+ - CHANGED - CiviLint - further lint adjustments (tabs for double space, missing semi-colons)
+ - FIXED - SearchKit button group hierarchy wrapping button groups
+ - FIXED - removed button styling for another (x)-type cancel-only button in SearchKit builder
+ - FIXED - avatar positioning works to an extent (floats right in dashboard header for Walbrook / Hackney) (#87)
+ - REMOVED - avatar flexbox positioning and simplified css, as not being applied
+ - ADDED - dash image border in Walbrook
+ - ADDED CSS VARIABLES (3)
+    --crm-dash-image-right (distance from right for avatar)
+    --crm-dash-image-top (distance from top)
+    --crm-dash-image-border (optional border)
+ - REMOVED CSS VARIABLES (2)
+    --crm-dash-image-justify
+    --crm-dash-image-direction
+
+1.1.8 / 5.80.7
+ - CHANGED - CiviLint - made Thames CSS more verbose (#84)
+ - CHANGED - CiviLint - reduced four char spaces to two
+ - CHANGED - CiviLint - changes to PHP files
+ - CHANGED - CiviLint - no empty variables
+ - CHANGED - .gitignore file updated
+ - REMOVED - Duplicate BoostrapJS files
+
+1.1.7 / 5.80.6
+ - FIXED - trailing comma (merge_requests/42)
+ - FIXED - FormBuilder customise options doesn't show icons on Wallbrook (#83)
+ - FIXED - FormBuilder customise options grab region background doesn't show
+ - CHANGED - Background colours for customise options alternating rows
+ - CHANGED - CSS tidying around FormBuilder customise options
+ - REMOVED - responsive tables - fix being used wasn't responsive and had some usability questions (#82)
+
+1.1.6 / 5.80.5
+ - FIXED - reset checkbox margin in checkbox lists (that shrunk the checkbox size)
+ - FIXED - changed td.label to table-cell to address sizing inconsistencies (#68)
+ - CHANGED - apply `--crm-c-page-background` to WordPress body, not only .crm-container (#77)
+ - FIXED - right column inline edit on contact dashboard was positioned left (#76)
+
+1.1.5 / 5.80.4
+ - CHANGED - CSS Variable '--crm-flex-gap' moved from core css into variables (fixed scenarios where it wasn't loading)
+ - ADDED - right/bottom margin to SK grid buttons to create space in SK displays (#81)
+ - CHANGED - multi-select select2, use input padding variable
+ - FIXES - action menu dropdown icon hover colour (#78)
+ - FIXES - radio buttons and checkboxes had a min-width applied causing layout problems (#80)
+
+1.1.4 / 5.80.3
+ - FIXED tooltip dropdown: double shadow, gap next to arrow, padding/border on bottom (ref #74)
+ - ADDED float: none for FormBuilder legends
+ - FIXED added 'important' to 'hiddenElement' as it's getting lost in some cascades, (ref dev/core/#5598)
+ - FIXED td.label width not being applied, creating various other quirks; changed display type to inline-table.
+ - ADDED small inline margin to help icons to separate from label text
+ - ADDED min-height of 100vh to avoid block of white-space below #crm-container (same as Thames)
+ - CHANGED Readme - simplified some wording, expanded description, removed roadmap, changed order, created 'customisation' section.
+ - ADDED instructions for creating a subtheme/stream extension pointing to RiverLea.
+
+1.1.3 / 5.80.2
+ - FIXED z-index for date-picker in modals
+ - FIXED Open Street Map tiles not loading
+
+1.1.2 / 5.80.1
+ - FIXED padding in event config dropdown
+ - CHANGED padding in HackneyBrook dialogs from 0 to --crm-s.
+ - FIXED reset of table-scrolling with dropdowns (e.g. Event dashboard dropdown was clipping the dropdown)
+ - FIXED dropdown link width (reset in WordPress)
+ - FIXED contact dashboard action links dropdown delete icon color
+ - FIXED contact dashboard inline name edit overflow hidden reset
+ - FIXED contact dashboard white text on white bg for contact name inline edit in Walbrook
+ - CHANGED crm-accordion-settings body padding changed from 0 to match crm-accordion-bold
+ - FIXED focus colour on Select2 now should display on tab/focus (github.com/31433)
+
+1.1.1 / 5.80.0
+ - FIXED metadata - RiverLea version numbering in variables file & info.xml
+
+1.1.0 / 5.80.0
+ - CHANGED info.xml version to 5.80 to synch with CiviCRM core (github.com/31389)
+ - FIXED clipping of dropdown on sidescroll tables (#73).
+ - FIXED Wallbrook, table header bg, should be white.
+ - CHANGED readme.
+ - ADDED front-end type across all Streams is reset to 'inherit', over-riding the Stream's font to instead use the CMS front-end theme font(s). For Standalone, inherit will default to the System font stack.
+
+1.0.12
+ - ADDED z-index to sticky table headers: ref github/#31396
+ - ADDED crm-accordion-settings ref github/#31293
+ - CHANGED accordion file layout (order/headings)
+ - ADDED 5.80 version compatability to info.xml
+ - FIXED Font Awesome icon spinner off-center
+ - FIXED missing bg images in Form Builder dropdown (#71)
+ - FIXED front-end select2 dropdown input search too wide
+ - FIXED front-end date/time wrapping issue (#72)
+ - FIXED front-end date/time height inconsistent
+ - FIXED front-end FB fieldset titles beaten by Bootstrap - colour & padding
+ - FIXED stops FB flexbox front-end for inline column collapsing
+ - FIXED dropdown table select checkbox wrapping in Walbrook
+
+1.0.11
+ - ADDED inline block for code tags inside paragraphs (#69)
+ - ADDED fixed width for WordPress checkbox/radios (#68)
+ - CHANGED checkbox list alignment to use grid align rather than pixels
+ - CHANGED font-weight on input labels in Minetta to 600, not 'bold' (#66)
+ - ADDED gap between two inline buttons
+ - ADDED credit card FA icons for contribution pages (originally image sprites)
+ - FIXED padding on table form label cells didn't match form input cells
+ - FIXED flexbox with help icons breaking table structure (#68)
+ - ADDED bg colour and border for pay later options in events/contribution creation to help differentiate
+ - CHANGED bootstrap small button icon height is fixed to keep button groups matching heights
+ - FIXED hover issue on cancel icon buttons (#67)
+
+1.0.10
+ - CHANGED sort icons on SK tables to sit inline for wrapping labels.
+ - FIXED checkbox for SK table header padding so shouldn't wrap.
+ - CHANGED explicitly set text-decoration to none for buttons
+ - REMOVED broken link to _font.css in Walbrook.
+
+1.0.9
+ - FIXES text-wrapping on recently viewed block (D7)
+ - ADDED opacity / hover for view/edit links on recently viewed block
+ - FIXED Garland/D7 li margin reset blocking tab formatting.
+ - FIXED Garland/D7 input label width reset
+ - FIXED Contact summary label width on narrower screens.
+ - ADDED More table overflow scrolls (e.g. Membership table on contact dashboard).
+ - FIXED Link colour for some primary/secondary background coloured regions.
+
+1.0.8
+ - FIXES further regressions caused by 1.0.4: removes new #bootstrap-theme applications on input fields
+ - ADDED background colour for SearchKit admin panel to match active tab.
+ - ADDED matches height for SearchKit admin title
+ - ADDED inline flexbox for FormBuilder form-inline.
+ - CHANGED footer status link underline.
+
+1.0.7
+ - FIXES further regressions caused by 1.0.4.
+
+1.0.6
+ - FIXED regressions caused by 1.0.4.
+
+1.0.5
+ - ADDED nowrap to action links (#64)
+
+1.0.4
+ - ADDED and swapped #bootstrap-theme prefix to button, background and input elements in response to issues with front-end specificity against 3rd party themes #61
+
+1.0.3
+ - FIXED WordPress FormBuilder checkboxes weren't square
+ - CHANGED WordPress checkbox and radio alignment no longer reset with other WP resets
+ - ADDED flex wrapping to FormBuilder for responsive.
+ - FIXED regression from 1.0.2 on select.form-control elements.
+ - FIXED FormBuilder dropdown arrow alignment.
+ - FIXED FormBuilder flex wrap and input overflow. Various other FormBuider front-end responsive tweaks (ref #62)
+ - CHANGED Multiple Thames fixes, including darkmode and alerts (see !34 and !35)
+
+1.0.2
+ - REMOVED WordPress select list appearance reset (https://lab.civicrm.org/extensions/riverlea/-/issues/60)
+
+1.0.1
+ - CHANGED updated streams/empty/_variables.css to reflect latest variables list.
+
+1.0.0
+ - CHANGED status to stable
+
+1.0.0beta3
+ - REMOVED narrow front-end form width for all Streams other than Hackney
+ - FIXED inline edit button alignment for SearchKit output
+ - CHANGED readme.
+ - REMOVED border from form builder fieldset
+ - CHANGED Hackney button icon background to tint to support button colouring
+ - CHANGED Minetta tab body and active state to another value than --crm-page-background
+
+1.0.0beta2
+ - ADDED padding to FormBuilder dashlets
+ - ADDED tabs border fixes to FormBuilder, and SK/FB listings
+ - FIXED inconsistent tabs display
+ - FIXED bold font setting for extensions list accordion
+ - FIXED transparent background for tabs
+ - ADDED separate styling for the 'danger' delete links in dropdowns, created Thames override for default
+ - NEW CSS VARIABLE
+    --crm-tabs-radius
+    --crm-dropdown-alert-bg
+
+1.0.0beta
+ - CHANGED fonts are in shared directory rather than streams' directory
+ - REMOVED duplicate parts of Thames
+
+0.10.20
+ - NEW STREAM - Thames, by Rich Lott, @artfulrobot.
+
+0.10.19
+ - FIXED FormBuilder List to match SearchKit list (better fix would harmonise markup)
+ - FIXED padding on SearchKit Dashlets
+ - ADDED front-end Legend realignment to SK/FB fieldset/legends (all three issues in #5)
+ - FIXED contribution page tabs/button alignment/offset
+
+0.10.18
+ - CHANGED better front-end handling of form-builder pages
+ - FIXED alert message handling (all was treated as .help, including .error and .warning)
+ - CHANGED alignment of icons in alerts
+ - FIXED - inline edit alignment, styling (https://lab.civicrm.org/extensions/riverlea/-/issues/5#note_170713)
+
+0.10.17
+ - ADDED civicrm.css to core with default settings. This is primarily to support separate theme extensions using RiverLea as a parent theme.
+ - REMOVED civicrm.css from streams where not custom (e.g. Minetta but not Walbrook)
+ - CHANGED front-end form layout, including hiding Stream name/version on front-end
+
+0.10.16
+ - ADDED CiviMail custom CSS override (civi_mail-ang/crmMailing.css)
+ - CHANGED CiviMail custom CSS to integrate with override file, replace fixed values with variables
+ - ADDED crmStatusPage custom CSS override ang/crmStatusPage.css
+ - CHANGED Status page customisations and integration (e.g. colours, dropdwon settings), plus inline flexbox
+
+0.10.15
+ - REMOVED Wallbrook SemiBoldItalic font (unused)
+ - REMOVED Wallbrook font.css - moved font family definitions into civicrm.css
+ - FIXED min width issue in contact dashboard tabs
+ - CHANGED Wallbrook fonts file removed
+ - REMOVED 2 CSS VARIABLES  (simplification / drops Blackberry, iOS1 support)
+    --crm-italic-style
+    --crm-bold-weight
+
+0.10.14
+ - FIXED table header/sort colour issues #57
+ - FIXED drop shadown css variable in alpha filter not used
+ - ADDED label colour
+ - ADDED label bold/weight variables to contact dashboard label
+ - ADDED CSS VARIABLE:
+    --crm-input-label-color
+    --crm-btn-margin (for spacing between buttons)
+
+0.10.13
+ - CHANGED radio/checkbox handling for WordPress to inherit more of the WordPress styling.
+ - REMOVED unused CSS variable
+ - ADDED joomla.css into /core/css - and removed Joomla specific css from _cms.css (shrinking the two together)
+
+0.10.12
+ - CHANGED - empty.css file to reflect recent changes, removed empty variables from darkmode
+ - FIXED - --crm-table-sort-active-col is set but wasn't being called, ref #57 2
+ - REMOVED 1 CSS VARIABLE:
+    --crm-tabs-2-border
+ - ADDED 1 CSS VARIABLE:
+    --crm-table-header-col (to set a custom colour for a table header, ref #57 1)
+
+0.10.11
+ - CHANGED - major tabs refactor and simplify (see - https://lab.civicrm.org/extensions/riverlea/-/issues/54)
+ - REMOVED - quite a bit of now redundant tab-related css.
+ - REMOVED 8 CSS VARIABLES:
+    --crm-dashlet-tabs-bg
+    --crm-dashlet-tab-bg
+    --crm-dashlet-tab-border
+    --crm-dashlet-tab-color
+    --crm-dashlet-tab-active
+    --crm-dashlet-tab-border-active
+    --crm-dashlet-tab-body-border
+    --crm-dashlet-tab-body-padding  (NB - it was adding these variables that forced the tab rethink)
+
+0.10.10
+ - FIXED - date time input simplified
+ - CHANGED - Select2 dropdown advanced: border line between list elements, smaller description, simplified padding.
+ - FIXED - various issues flagged in https://lab.civicrm.org/extensions/riverlea/-/issues/46
+
+0.10.9
+ - FIXED - issue 46.1 - configuration checklist contrast ratio
+ - CHANGED - issue 46.3 - radio and checkbox labels are no longer bold if 'label' is bold
+ - FIXED - issue 46.4 - legibility issue
+ - FIXED - issue 46.5 - positioning issue
+
+0.10.8
+- CHANGED - Button height handling to allow wrapping double line buttons to keep their padding, but also protect streams that have full-height icon backgrounds (ref: https://lab.civicrm.org/extensions/riverlea/-/issues/55).
+- FIXED - Issue with icon backgrounds on buttons not stretching full height on double-height buttons.
+- NEW CSS VARIABLE -
+    added: --crm-btn-icon-padding (defaults to 'var(--crm-btn-padding-block)'). NB: fine to ignore this variable unless you want distinct button icon backgrounds, when you should set it to `0px`.
+
+0.10.7
+- FIXED - Number field is narrower than browser width.
+- CHANGED - WordPress font-size not set to 100%, padding variable moved.
+- ADDED - line-height to .crm-container
+- REMOVED - removed prefers-color-scheme setting from variables (as it seems to be unncessary from the packaged dark mode approach)
+- CHANGED - WordPress settings made more specific
+
+0.10.6
+- ADDED - HackneyBrook primary & secondary hover text variables (ref 0.10.4)
+- ADDED - Advanced search layout optimisations (brings closer to original Greenwich/Shoreditch)
+- ADDED - table select-icon padding (https://lab.civicrm.org/artfulrobot/riverlea/-/blob/thames/streams/thames/css/civicrm.css#L363)
+- FIXED - focus state causes layout shift: https://lab.civicrm.org/extensions/riverlea/-/issues/49
+- FIXED - table cell alignment issue for form layouts
+- FIXED - hover state for even table rows in SearchKit: https://lab.civicrm.org/extensions/riverlea/-/issues/50
+- NEW CSS VARIABLE - for alpha-filter spacing (Thames inspired)
+    added: --crm-filter-spacing (defaults 'start')
+
+0.10.5
+- FIXED - issue with CSS rewrite happening even if the theme isn't selected: https://lab.civicrm.org/extensions/riverlea/-/merge_requests/26
+
+0.10.4
+- NEW CSS VARIABLES to support different text hover colour, and allow contact dashboard roundness of tabs to work left/right as well as top/bottom
+    added: --crm-c-primary-hover-text
+    added: --crm-c-secondary-hover-text
+    added: --crm-dash-tabs-roundness - for the tabs group radius on the contact dashboard
+    added: --crn-dash-panel-radius - for the tab panel radius on the contact dashboard
+- FIXED text area 100% width
+
+0.10.3
+ - ADDED - JQueery spinner styling (number counter with arrows used on pagination)
+ - FIXED - contact tooltip position in search results
+ - FIXED - pagination/etc on search results
+ - FIXED - button wrapping on dialogs https://lab.civicrm.org/extensions/riverlea/-/issues/5
+ - ADDED - hover state for contact dashboard main name
+ - NEW CSS VARIABLES - for alpha-filter (Wellow inspired)
+    added: --crm-filter-bg
+    added: --crm-filter-padding
+    added: --crm-filter-item-bg
+    added: --crm-filter-item-shadow
+
+0.10.2
+ - FIXES - alignment of table sort headers
+ - ADDED - min height to body (via Thames)
+ - CHANGED - Significant change to variables (described https://lab.civicrm.org/extensions/riverlea/-/issues/43). Minetta variables put in core as default variables. Stream variables loaded only when they are different to Minetta, shrinking those files. Empty ('starter') stream variables now copy of core _variables.css, but with everything commented out (build a stream by gradually uncommenting).
+
+0.10.1
+ - ADDED - accordion summary background colour changes if it contains a required input error message (to help find input errors on forms with multiple accordions, such as add new contact)
+ - FIXES - overflow scroll on import screens due to margin resets on import screens
+ - FIXES - padding on Mailing screen wizard (walbrook)
+ - FIXES - next/previous button order on dashboard (https://lab.civicrm.org/extensions/riverlea/-/issues/48)
+ - FIXES - inlines contact dashboard editor button, handles hover state better
+ - FIXES - icon bg colour for Hackney.
+ - CHANGED - buttons from flex to inline-flex with related cleanups (https://lab.civicrm.org/extensions/riverlea/-/issues/45)
+
+0.10.0
+ - version jump to reflect functional maturity, shift to focus on integrating two new streams, and preparation for stable 1.0.0 release.
+ - REMOVED - contact dashboard page padding distinct from other pages
+ - CHANGED - Walbrook buttons text no longer uppercase.
+ - ADDED - styling for the extensions dbse upgrade 'queue runner' screen
+ - FIXES - missing action button styling for links on contact dashboard header (e.g. contact dashboard editor)
+
+0.9.56
+ - CHANGED - reworking of dashlets, modals and tabs to support more style variations
+ - NEW CSS VARIABLES (11)
+    added: --crm-dashlet-header-border
+    added: --crm-dashlet-header-border-width
+    added: --crm-dashlet-header-font-size
+    added: --crm-dashlet-box-shadow
+    added: --crm-dashlet-dashlets-bg
+    added: --crm-dialog-inner-shadow
+    added: --crm-dropdown-radius
+    added: --crm-dashlet-tab-color
+    added: --crm-dashlet-tab-body-border
+    added: --crm-dashlet-tab-body-padding
+    added: --crm-dashlet-tabs-border
+
+0.9.55
+ - ADDED - functional darkmode settings screen for front and backend. This includes multiple changes, described on the MR: https://lab.civicrm.org/extensions/riverlea/-/merge_requests/22
+ - ADDED - each stream has a _dark.css file for darkmode variables, which no longer appear in _variables.css
+ - FIXED - page title on Drupal 10 doesn't match dark-mode.
+
+0.9.54
+ - CHANGED - reworking of accordions with new variables to support full .crm-accordion-light styling.
+ - CHANGED - listing of new CSS variables in changelog
+ - NEW CSS VARIABLES (8 new, 6 renamed):
+    added: --crm-expand-radius (border radius for accordion)
+    added: --crm-expand-header-font (for setting bold/font pair)
+    added: --crm-expand2-header-bg-active
+    added: --crm-expand2-header-font
+    added: --crm-expand2-header-border
+    added: --crm-expand2-header-border-width
+    added: --crm-expand2-header-padding
+    added: --crm-expand2-border-width
+    renamed: --crm-expand-header2-bg => --crm-expand2-header-bg
+    renamed: --crm-expand-header2-weight => --crm-expand2-header-weight
+    renamed: --crm-expand-header2-color => --crm-expand2-header-color
+    renamed: --crm-expand-2-border => --crm-expand2-border
+    renamed: --crm-expand-body2-bg => --crm-expand2-body-bg
+    renamed: --crm-expand-2-body-padding => --crm-expand2-body-padding
+
+0.9.53
+ - ADDED - BG colour for standalone login screen
+ - FIXED - Hackney icon alignment on .button, z-index on tabs.
+ - FIXED - dashlet close icon inheriting wrong color
+ - REMOVED - resets on input in base.css
+ - FIXED - colour of lists on notify alerts matches alert colour
+ - FIXED - restored list bullets to notification lists
+ - ADDED - margin reset to top element in notification text, to remove extra padding.
+ - ADDED - block padding to crm-section divs to separate form elements
+
+0.9.52
+ - FIXED - contact summary dashboard, hidden popup - https://lab.civicrm.org/extensions/riverlea/-/issues/41. Removed unnecessary definition and adjusted caret colour.
+ - FIXED - Mosaico wizard uses custom markup, but the wizard now matches the stream wizard settings - https://lab.civicrm.org/extensions/riverlea/-/issues/12. Also makes the hover buttons always visible for accessibility.
+
+0.9.51
+ - CHANGED - cleans-up & merges two Bootstrap files: removes some un-used/duplicates, adds CSS variables, sorts into sub-headings
+ - REMOVES - bootstrap3.css file
+
+0.9.50
+ - FIXES - more icon button padding issues
+ - ADDED - text colour to headings so H1, H2, etc display correctly in darkmode
+ - FIXES - WordPress override
+ - FIXES - Epic empty line spacing 'pink shears' cleanup https://lab.civicrm.org/extensions/riverlea/-/merge_requests/19
+
+0.9.49
+ - CHANGED - Button icon colour scope broaden - for any stream that sets them, e.g. Hackney Brook (https://lab.civicrm.org/extensions/riverlea/-/issues/37)
+ - FIXES - multiple button padding & alignment fixes, all streams
+ - FIXES - multiple button icon padding/alignment fixes, all streams
+
+0.9.48
+ - CHANGED - Minetta input styles to be closer to Bootstrap (ref https://lab.civicrm.org/extensions/riverlea/-/issues/18)
+ - ADDED - input size modifiers (e.g. for shorter inputs, such as 'prefix')
+
+0.9.47
+ - ADDED - page padding for database upgrade screens. minor type fixes to upgrade complete screen
+ - FIXES - missing bg on dashlet selector, table padding for dashlet filter table, grab cursor on dashlet header.
+ - FIXES - notifcation alert type colour.
+ - FIXES - removes text decoration from notification icon links
+ - ADDED - icon spinner for select2 loading (https://lab.civicrm.org/extensions/riverlea/-/issues/35#note_169442)
+
+0.9.46
+ - ADDED - basics for dark-mode settings screen (menu link, navigation menu / setting.php, etc). Not yet functioning
+ - REVERTS - button icon spacing fix from 0.9.43 as it caused new problems.
+
+0.9.45
+ - FIXES - missing delete icon in SK admin table editor
+ - CHANGED - multiple SK admin editor UI improvements
+ - FIXES - crm-iconPicker.css isn't being loaded by theme, so overwrites added to _icon.css
+
+0.9.44
+ - CHANGED logo icon in navbar to SVG image (higher resolution).
+ - CHANGED Standalone inline padding set to 3vw, matching default (https://lab.civicrm.org/extensions/riverlea/-/issues/26#note_169213).
+ - ADDED alert background colour to delete link on contact summary action dropdown (https://lab.civicrm.org/dev/user-interface/-/issues/54#note_169299).
+ - ADDED matching bg colour for SK 'select all' checkbox and dropdown
+ - REMOVES column line for contact summary action dropdown
+ - REMOVES bounding border for SearchKit tables, other than the main SK admin list (https://lab.civicrm.org/extensions/riverlea/-/issues/36)
+ - FIXES double border on SK admin list (https://lab.civicrm.org/extensions/riverlea/-/issues/36)
+ - FIXES SK table head 'select all' checkbox padding (differed for checked/unchecked)
+ - ADDED crm-iconPicker.css theme override
+ - FIXES icon picker layout
+ - CHANGED SK editor layout view table: align drag icons, add padding to details body
+ - FIXES multiple contrast issues with info/success/warning/danger button + background colour/text combos (https://lab.civicrm.org/extensions/riverlea/-/issues/38)
+ - NEW CSS VARIABLES (5) - 5 new variables for above fix:
+    added: --crm-btn-cancel-text
+    added: --crm-btn-info-text
+    added: --crm-btn-warning-text
+    added: --crm-btn-success-text
+    added: --crm-btn-alert-text
+
+0.9.43
+ - ADDED Operating System font fallbacks for Hackney Brook
+ - FIXES Second conditional dropdown not showing: https://lab.civicrm.org/extensions/riverlea/-/issues/35
+ - FIXES JQuery UI background images appearing on some UI icon classes. NB - this fix remvoes all JQuery UI icon background images so if icons vanish, it'll be linked to this, and need further work.
+ - FIXES select2 inplace search too wide
+ - FIXES notification dialog 'restore' button matches theme style rather than JQueryUI.
+ - FIXES removes webkit font-smoothing on .button in Drupal8+
+ - FIXES icon padding when button has an internal span
+ - CHANGED .pull-right handling: removes from Bootstrap & adds to base, creates Flexbox override for SearchKit: https://lab.civicrm.org/extensions/riverlea/-/issues/5#note_169180.
+ - FIXES Mosaico: wizard button padding, inactive colour and thumbnail bg (last two fix darkmode issue: https://lab.civicrm.org/extensions/riverlea/-/issues/34)
+
+0.9.42
+ - CHANGED metadata files (readme, info.xml). Package released
+ - ADDED history to changelog
+
+0.9.41
+ - ADDED changelog
+ - ADDED Drupal 7 Garland support
+
+0.9.0 - 0.9.40
+ - ADDED overwrites for civi core CSS, e.g. SearchKit & FormBuilder. (Works on 5.75+ only as it uses Angular css overwrites added in https://github.com/civicrm/civicrm-core/pull/30397 to replace the css for Search Kit, Form Builder and some other files, so that CSS variables can be applied to them, fewer '!important' tags used and file size is shurnk).
+ - ADDED avatar support on contact dashboard
+ - ADDED visible version-numbering to support development
+ - FIXED many issues. Adds on-screen commit-version-numbering.
+ - NEW CSS VARIBLES:
+    added: --crm-c-code-background
+    added: --crm-dash-image-size
+    added: --crm-dash-image-radius
+    added: --crm-dash-image-justify
+    added: --crm-dash-image-direction
+    added: --crm-version (metadata)
+    added: --crm-release (meetadata)
+
+0.8
+
+Front-end layouts. Adds front-end support for each stream.  Adds CiviCRM logo for front-end pages as inline SVG. Adds CSS Variables for front end with --crm-f prefix, including to choose between inline and stacked label/inputs, to create a focus background, to limit the form width and adjust the logo size.Some fixes. NB v0.8 will be the last major version of RiverLea to work on CiviCRM < 5.75, due to file structure changes enabled by that release. Small fixes can be added as v0.8.1, v0.8.2, etc. NEW VARIBLES
+
+0.7
+
+Dark-mode. Improves dark-mode across all three streams. Improves Hackney Brook. More responsive tables. Many small fixes. Thanks SarahFG, Rich Lott & Guillaume Sorel. NEW VARIBLES
+
+0.6
+
+Adds third stream (Finsbury Park / Hackney Brook). Adds basic dark-mode support. Adds new stream: Hackney Brook, based on Finsbury Park (~90% port). Adds new CSS variables to all streams to support Finsbury Park's two main differences to Shoreditch and Greenwich: button icon styling (unique colours, background, border), and contact dashboard side tabs with active/hover border, similar to the 5.72 SearchKit UI, as well as some extra useful variables (e.g. dialog header border, notification border radius, etc). NEW VARIBLES
+
+0.5
+
+Extensive UI and accessibility fixes following testing in CiviCamp Hamburg - with many thanks to Guillaume Sorel, Thomas Renner, Rositza Dikova, Luciano Spiegel & Peter Reck and the organisers - as well as Rich Lott and the Core Team. Instances of #crm-container removed or replaced with .crm-container which changes some cascade order. Preparation for overwriting other core CiviCRM CSS files from v0.6 which will require CiviCRM 5.75. Version compatibility raised to 5.72 from 5.69 because of Search Kit Builder interface changes: if that interface isn't used then compatibility before 5.69 should be fine.
+
+0.4
+
+CSS files restructure into /core/css and /streams/[stream-name]/css/ with stream variables defined in [stream-name]/css/_variables.css. Variables files are version-numbered - 0.4 with this version. Version numbers should only increase when the CSS Variables in these files change name, are removed or added.
+
+0.3
+
+Two streams, 6 CMS setups tested: Backdrop, Drupal7 + Seven, Drupal9 + Claro/Seven, Joomla 4, Standalone, WordPress. Loads with two theme variations/streams: Minetta and Walbrook. Does not cover: front-end layouts, < 1000px screens, Joomla 3, other Drupal admin themes, light/dark modes.
+
+0.2
+
+Establishes structure, adds a bunch of css variables for testing/dev, adds the entirity of the current Greenwich Bootstrap 3 build to start cutting it back, and adds a components directory with initial component 'accordions' (with animated exapnd/close + CSS variables). Separate components files will likely be merged when the extension is moving to testing, to reduce http requests.
+
+0.1
+
+Proof-of-concept, Brunswick, empty theme structure doing just two things: for older CMS interfaces enforces a 100% font-size default to cascade the browser default font-size, and demonstrates a 1rem variable on top of that for some Civi body text sizes. The computed font-size of Civi paragraph and table text should show as 16px in Inspector (for standard setups).
diff --git a/civicrm/ext/riverlea/Civi/riverlea/DynamicCss.php b/civicrm/ext/riverlea/Civi/riverlea/DynamicCss.php
new file mode 100644
index 0000000000000000000000000000000000000000..683636b6ea0424edc8540fd520f490272601b5d5
--- /dev/null
+++ b/civicrm/ext/riverlea/Civi/riverlea/DynamicCss.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Civi\riverlea;
+
+use CRM_riverlea_ExtensionUtil as E;
+
+/**
+ * This class generates a `river.css` file for Riverlea themes containing
+ * dynamically generated css content
+ *
+ * At the moment this is used to serve the right vars for a given dark mode setting
+ *
+ * In the future it might allow other dynamic tweaks
+ *
+ * @service riverlea.dynamic_css
+ */
+class DynamicCss implements \Symfony\Component\EventDispatcher\EventSubscriberInterface, \Civi\Core\Service\AutoServiceInterface {
+
+  use \Civi\Core\Service\AutoServiceTrait;
+
+  public const CSS_FILE = 'river.css';
+
+  public static function getSubscribedEvents() {
+    return [
+      'hook_civicrm_buildAsset' => ['buildAssetCss', 0],
+    ];
+  }
+
+  public static function getCssParams(): array {
+    $darkModeSetting = \CRM_Utils_System::isFrontendPage() ?
+      \Civi::settings()->get('riverlea_dark_mode_frontend') :
+      \Civi::settings()->get('riverlea_dark_mode_backend');
+
+    return [
+      'stream' => \Civi::service('themes')->getActiveThemeKey(),
+      'dark' => $darkModeSetting,
+    ];
+  }
+
+  /**
+   * Generate asset content (when accessed via AssetBuilder).
+   *
+   * @param \Civi\Core\Event\GenericHookEvent $e
+   *
+   * @see CRM_Utils_hook::buildAsset()
+   * @see \Civi\Core\AssetBuilder
+   */
+  public static function buildAssetCss($e) {
+    if ($e->asset !== static::CSS_FILE) {
+      return;
+    }
+    $e->mimeType = 'text/css';
+
+    $params = $e->params;
+
+    $stream = $params['stream'] ?? 'empty';
+
+    $content = [];
+
+    // add base vars for the stream
+    $content[] = self::getCSSFromFile('_variables.css', $stream);
+
+    switch ($params['dark'] ?? NULL) {
+      case 'light':
+        // nothing more to do
+        break;
+
+      case 'dark':
+        // add dark vars unconditionally
+        $content[] = self::getCSSFromFile('_dark.css', $stream);
+        break;
+
+      case 'inherit':
+      default:
+        // add dark vars wrapped inside a media query
+        $content[] = '@media (prefers-color-scheme: dark) {';
+        $content[] = self::getCSSFromFile('_dark.css', $stream);
+        $content[] = '}';
+        break;
+    }
+
+    $e->content = implode("\n", $content);
+  }
+
+  /**
+   * Check file exists and return contents or empty string
+   *
+   * @param string $cssFileName The name of the css file (eg. _variables.css)
+   * @param string $stream The name of the riverlea stream (eg. walbrook)
+   *
+   * @return string
+   */
+  private static function getCSSFromFile(string $cssFileName, string $stream): string {
+    $res = \Civi::resources();
+    $theme = \Civi::service('themes')->get($stream);
+    $file = '';
+    // For riverlea themes CSS should be located in stream/streamname/css - prefix="stream/streamname/"
+    if (isset($theme['prefix'])) {
+      $file .= $theme['prefix'];
+    }
+    // Append css dir and filename so we end up with stream/streamname/css/filename.css
+    $file .= 'css/' . $cssFileName;
+    $file = $res->filterMinify($theme['ext'], $file);
+
+    // Now get the full path for the css file
+    $filePath = $res->getPath($theme['ext'], $file);
+    if (is_file($filePath)) {
+      // File exists and is a file? Return it!
+      return file_get_contents($filePath) ?? '';
+    }
+    return '';
+  }
+
+}
diff --git a/civicrm/ext/riverlea/LICENSE.txt b/civicrm/ext/riverlea/LICENSE.txt
new file mode 100755
index 0000000000000000000000000000000000000000..1a5847b2a0b042af51dbe482164c16f6539bf3ab
--- /dev/null
+++ b/civicrm/ext/riverlea/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: riverlea
+Copyright (C) 2024, Nicol Wistreich
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/riverlea/README.md b/civicrm/ext/riverlea/README.md
new file mode 100755
index 0000000000000000000000000000000000000000..3535ca5f9822464d7739a5f669edf827313ebe94
--- /dev/null
+++ b/civicrm/ext/riverlea/README.md
@@ -0,0 +1,151 @@
+# RiverLea Theme Framework
+
+This Framework separates CiviCRM's visual/UI CSS from structural CSS, using CSS variables. Installing it provides you with four subthemes or 'Streams' which are entirely created with CSS variables (other than Thames, which uses a little bit of CSS as well):
+ - Minetta, named after the river that runs under Greenwich, NYC. It is based on Civi's default 'Greenwich' theme.
+ - Walbrook, named after the river that runs under Shoreditch, London. It is based on Shoreditch/TheIsland theme.
+ - Hackney, named after the river that runs under Finsbury Park, based on Finsbury Park theme.
+ - Thames, named after the river that runs close to Artful Robot HQ, based on their Aah theme.
+ You can chose between these subthemes via Display Settings, where you can also set dark-mode preferences.
+
+ The extension is licensed under [AGPL-3.0](LICENSE.txt).
+
+ ## Use in Front-End CiviCRM
+
+**USE WITH CAUTION AND TESTING** While RiverLea has been widely tested in the backend of CiviCRM, be very careful to use in front-end. Given the wide number of themes and scenarios for front-end pages, for existing sites we recommend only applying it to an existing web front-end after comprehensive testing on a dev site.
+
+Overwriting CSS variables for the front is straightforward (they can be nested within `.crm-container.crm-public` and there's a number of front-end specific variables, prefixed `--crm-f-`), but **testing is essential**.
+
+## [Changelog](CHANGELOG.md)
+
+- 1.80 (5.80) - Release for packaging with CiviCRM core, v5.80 (see note on numbering below)
+- 1.0 - **Release candidate**, with ongoing testing and fixes.
+- 0.10 - **Adds fourth stream**. Thames (Aah), as well as extensive fixes & adjustments.
+- 0.9 - **Overwrites civi core CSS**. 5.75 only - overwrites core css like SearchKit & FormBuilder with extensive work on both. D7 Garland support.
+- 0.8 - **Front-end layouts**. Front-end support for each stream.
+- 0.7 - **Dark-mode**. Dark-mode working across all three streams.
+- 0.6 - **Adds third stream** Hackney Brook (Finsbury Park).
+- 0.5 - **Extensive UI and accessibility fixes** following testing in/around CiviCamp Hamburg.
+- 0.4 - **CSS files restructure** core and stream directories, version numbering of variables files with new variables.
+- 0.3 - **Two streams, 6 CMS setups tested:** adds Minetta and Walbrook streams. Backdrop, D7 (Seven), D9 (Claro + Seven), Joomla 4, Standalone & WordPress.
+- 0.2 - **Establishes structure**, adds Bootstrap3, components - accordion.
+- 0.1 - **Proof-of-concept**, basic variables.
+
+### Version numbering
+RiverLea has its own version number and confusingly this has changed a few times while we figured out the best approach. It is also different in the core-extension info.xml which in core will always match the Civi version its shipped with, but as a standalone extension has its own numbering.
+
+The pattern is `1.x.y` where x = the CiviCRM version it is developed against and y = the version number of of RiverLea for that Civi version. So `1.80.11` is the 11th version of RiverLea v1 built against CiviCRM `5.80.x`. Some previous versions tried to match the CiviCRM core version number and build on that (ie RiverLea 5.80.11), but this caused problems with upgrade prompts.
+
+## Installation
+
+### With (CLI, Zip)
+
+Sysadmins and developers may download the `.zip` file for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+cd <extension-dir>
+wget https://lab.civicrm.org/extensions/riverlea/-/archive/main/riverlea-main.zip
+unzip riverlea-main.zip
+```
+
+### With (CLI, Git)
+
+Sysadmins and developers may clone the [Git](https://en.wikipedia.org/wiki/Git) repo for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+git clone https://lab.civicrm.org/extensions/riverlea.git
+cv en riverlea
+```
+
+### After installation
+
+After installing the extension, go to Nav menu > Administer > Customize Data and Screens > Display Preferences, and select which subtheme/stream you want.
+
+## Extension Structure
+
+### Core variables
+A list of all base variables used on all streams is at `core/css/_variables.css`.
+
+### Stream/subtheme directories
+Each ‘stream’ or subtheme directory must contain a further directory `css` with a `_variables.css`file and a `_dark.css` if darkmode is supported. Variables in this `_variables.css` file will overrule any variables in the core list above. The subtheme can also include fonts, images and other CSS files, which can be loaded from the `_variables.css` file as an import.
+
+### Core directory
+Contains CSS files in:
+- In the **core/css** directory are theme files marked with an underscore:
+  - core/css/_base.css – resets, basic type, colours, links, positioning
+  - core/css/_bootstrap.css – a Bootstrap subset
+  - core/css/_cms.css – resets and fixes specific to different CMSs
+  - core/css/_core.css - links to the UI components in the components directory:
+  - core/css/_fixes.css - CSS that’s necessary *for now* but one day could go.
+  - core/css/_variables.css - a list of all base variables
+- in the **components** directory are reusable  UI elements, such as `_accordions` or `_tables.css`;
+- civicrm.css - the core theme css file which loads the other files
+- other files here without underscore (`admin.css`, `api4-explorer.css`, `contactSummary.css` etc) overrides civicrm's CSS core directory with files of the same name that are called by templates and only load in certain parts of Civi. E.g. `dashboard.css` loads on the CiviCRM main dashboard, and no-where else.
+- three directories: `org.civicrm.afform-ang` for Afform output, `org.civicrm.afform_admin-ang` for FormBuilder and `org.civicrm.search_kit-css` for SearchKit replace css files in core Civi extensions.
+
+## Customising
+
+Adding a customiser is on the roadmap, with a working prototype, but until its issues are resolved customising can be done through one of the three following methods:
+
+### 1. Add CSS variables to your parent theme
+
+For instance, to give all contribution page buttons rounded corners, you could add to your CMS theme:
+
+```
+--crm-btn-radius: 2rem;
+```
+
+Exploring the _variables.css file will give you idea of how much can be overwritten.
+
+### 2. Create a subtheme 'stream'
+
+1. Inside the `/streams/` directory is an example stream called `empty`. Duplicate this and rename it the name of your stream.
+2. In riverlea.php add a theme array to the function `riverlea_civicrm_themes(&$themes)`.
+3. Edit `/streams/[streamname]/css/_variables.css` with your custom css variables. You can link to other CSS files, fonts or images in this file - inside the stream.
+
+E.g. to add a stream called "Vimur", you would name the directory 'vimur', and add the following:
+
+```
+ function riverlea_civicrm_themes(&$themes) {
+  $themes['vimur'] = array(
+    'ext' => 'riverlea',
+    'title' => 'Riverlea: Vimur',
+    'prefix' => 'streams/vimur/',
+  );
+  $themes['minetta'] = array(
+    'ext' => 'riverlea',
+    'title' => 'Riverlea: Minetta (~Greenwich)',
+    'prefix' => 'streams/minetta/',
+  );
+  …
+ }
+```
+
+Use of the [ThemeTest extension](https://lab.civicrm.org/extensions/themetest) is recommended to more quickly identify which CSS variables match which UI element, and test multiple variations for each.
+
+IMPORTANT NOTE: Every time you upgrade RiverLea you will need to add your Stream again. This is obviously less than ideal, so for produciton you may prefer option 3:
+
+### 3. Create a subtheme extension
+
+NB: this approach has had very limited testing
+
+1. Create a theme extension using Civix, following the [instructions in the CiviCRM Developer Guide](https://docs.civicrm.org/dev/en/latest/framework/theme/).
+2. Create a subtheme of RiverLea using the instructions in **2. Create a subtheme 'stream'** above.
+3. Copy the subtheme into the root of your new theme extenion.
+4. Edit its main php file, enable both extensions and select your stream.
+E.g. for a stream called 'styx', with a theme extension called 'ocean', then in ocean.php you would write:
+
+```
+function ocean_civicrm_themes(&$themes) {
+  $themes['styx'] = array(
+    'ext' => 'ocean',
+    'title' => 'River Styx',
+    'prefix' => 'styx/',
+    'search_order' => array('_riverlea_core_', 'styx',  '_fallback_'),
+  );
+}
+
+## Troubleshooting
+- Unless you really need it (e.g. applying an urgent fix, or running a test), delete the custom/ext version of RiverLea, once you are on CiviCRM 5.80 or later.
+- After removing the custom/ext RiverLea directory, the civicrm/ext version should load automatically. It may appear to be enabled, but normally you will need to disable and re-enable it before RiverLea streams appear in Display Settings.
\ No newline at end of file
diff --git a/civicrm/ext/riverlea/composer.json b/civicrm/ext/riverlea/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..7de13c491aeecfb725ea3be4bf2805157336fa07
--- /dev/null
+++ b/civicrm/ext/riverlea/composer.json
@@ -0,0 +1,5 @@
+{
+    "name": "civicrm/riverlea",
+    "description": "CiviCRM Theme Framework",
+    "type": "civicrm-ext"
+}
diff --git a/civicrm/ext/riverlea/core/ang/crmStatusPage.css b/civicrm/ext/riverlea/core/ang/crmStatusPage.css
new file mode 100644
index 0000000000000000000000000000000000000000..acaa65c3aa9b594560c225495876a4d719ff0902
--- /dev/null
+++ b/civicrm/ext/riverlea/core/ang/crmStatusPage.css
@@ -0,0 +1,91 @@
+/* CSS rules for Angular module "statuspage" */
+
+#crm-status-list h3 {
+  color: inherit;
+  opacity: .85;
+  display: flex;
+  justify-content: space-between;
+  gap: var(--crm-r);
+  align-items: center;
+  padding: var(--crm-padding-small) var(--crm-padding-small) var(--crm-padding-small) var(--crm-r);
+}
+#crm-status-list h3:hover,
+#crm-status-list h3.menuopen {
+  opacity: 1;
+}
+/* Error Severity */
+#crm-status-list .crm-severity-emergency,
+#crm-status-list .crm-severity-alert,
+#crm-status-list .crm-severity-critical,
+#crm-status-list .crm-severity-error {
+  background-color: var(--crm-c-alert);
+  color: var(--crm-c-alert-text);
+}
+/* Warning Severity */
+#crm-status-list .crm-severity-warning {
+  background-color: var(--crm-c-warning);
+  color: var(--crm-c-warning-text);
+}
+/* Not Okay - Not Warning */
+#crm-status-list .crm-severity-notice {
+  background-color: var(--crm-c-info);
+  color: var(--crm-c-info-text);
+}
+/* All OK Severity */
+#crm-status-list .crm-severity-info,
+#crm-status-list .crm-severity-debug {
+  background-color: var(--crm-c-success);
+  color: var(--crm-c-success-text);
+}
+#crm-status-list .crm-status-message-body {
+  margin: var(--crm-r) 0;
+}
+#crm-status-list .hidden-until {
+  font-weight: normal;
+  font-size: var(--crm-small-font-size);
+  margin-right: var(--crm-r);
+}
+#crm-status-list .hush-menu {
+  margin-left: auto;
+}
+#crm-status-list .hush-menu > div {
+  position: relative;
+}
+#crm-status-list .hush-menu button {
+  background-color: rgba(256,256,256,0.6);
+  color: var(--crm-c-text);
+  font-size: initial;
+  border-color: transparent;
+}
+#crm-status-list .hush-menu ul {
+  position: absolute;
+  top: 1.5em;
+  right: 0;
+  width: calc(1.5 * var(--crm-dropdown-width));
+  margin: 0;
+  padding: 0;
+  z-index: 99;
+  background: var(--crm-dropdown-bg);
+  padding: var(--crm-dropdown-padding);
+  border-radius: var(--crm-dropdown-radius);
+  font-size: var(--crm-font-size);
+  box-shadow: var(--crm-popup-shadow);
+}
+#crm-status-list .hush-menu li {
+  padding: var(--crm-dropdown-padding);
+  color: var(--crm-dropdown-col);
+  background-color: var(--crm-dropdown-bg);
+  font-weight: normal;
+  border-radius: var(--crm-dropdown-radius);
+}
+#crm-status-list .hush-menu li:hover,
+#crm-status-list .hush-menu li:focus {
+  background-color: var(--crm-dropdown-hover-bg);
+  color: var(--crm-dropdown-hover);
+}
+.status-debug-information {
+  font-size: var(--crm-small-font-size);
+}
+.crm-status-message-body ul {
+  list-style: inherit;
+}
diff --git a/civicrm/ext/riverlea/core/civi_mail-ang/crmMailing.css b/civicrm/ext/riverlea/core/civi_mail-ang/crmMailing.css
new file mode 100644
index 0000000000000000000000000000000000000000..1e592a5dae97537bc619c14eb3703028acb5bcf5
--- /dev/null
+++ b/civicrm/ext/riverlea/core/civi_mail-ang/crmMailing.css
@@ -0,0 +1,62 @@
+.crmMailing select,
+.crmMailing input[type=text] {
+  width: 36em;
+}
+.crmMailing textarea {
+  height: 20em;
+}
+.crmMailing-recip-est {
+  background: var(--crm-c-yellow-less-light);
+  font-size: var(--crm-small-font-size);
+  padding: var(--crm-padding-small);
+  margin: 0 0 0 var(--crm-m);
+  width: var(--crm-big-input);
+  text-align: center;
+}
+.crmMailing input.crm-form-date,
+.crmMailing input[name=preview_test_email],
+.crmMailing-preview select[name=preview_test_group] {
+  width: var(--crm-big-input);
+}
+.crmMailing .crmMailing-preview {
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+}
+.crm-container .crmMailing-preview .preview-popup,
+.crm-container .crmMailing-preview .preview-contact,
+.crm-container .crmMailing-preview .preview-group {
+  display: flex;
+  flex-direction: column;
+  height: auto;
+  align-items: center;
+  gap: var(--crm-m);
+  width: 100%;
+}
+.crmMailing .preview-popup,
+.crmMailing .preview-contact {
+  border-right: var(--crm-c-divider);
+}
+.crmMailing .preview-popup,
+.crmMailing .preview-contact {
+  text-align: center;
+  border-right: var(--crm-c-divider);
+}
+.crmMailing .crmMailing-schedule-inner {
+  width: var(--crm-huge-input);
+  margin: auto;
+}
+input[name=preview_test_email]::placeholder {
+  text-align: center;
+}
+.crmMailing-inactive {
+  text-decoration: line-through;
+}
+.crm-container #crm-main-content-wrapper a.crmMailing-submit-button {
+  margin-top: var(--crm-r);
+  font-size: var(--crm-r1);
+}
+.crm-container a.crmMailing-submit-button.disabled,
+.crm-container a.crmMailing-submit-button.blocking {
+  opacity: .6;
+  cursor: default;
+}
diff --git a/civicrm/ext/riverlea/core/css/_base.css b/civicrm/ext/riverlea/core/css/_base.css
new file mode 100755
index 0000000000000000000000000000000000000000..d5d1e81e73c28a7296e50a90a90fdecde09d4af4
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/_base.css
@@ -0,0 +1,436 @@
+/******************
+   VARIABLES
+*******************/
+
+@import url(_variables.css); /* default variables */
+
+/******************
+   RESETS
+*******************/
+
+body {
+  min-height: 100vh;
+}
+.crm-container *,
+.crm-container *::before,
+.crm-container *::after {
+  box-sizing: border-box;
+}
+#crm-container .hiddenElement,
+.crm-container .hiddenElement,
+#bootstrap-theme .collapse {
+  display: none
+}
+#bootstrap-theme .collapse.in,
+#bootstrap-theme .collapse.show /* BS4 */ {
+  display: block;
+}
+.crm-container .clear {
+  clear: both;
+}
+.crm-container table,
+.crm-container th,
+.crm-container tr,
+.crm-container td,
+.crm-container details {
+  background-color: transparent;
+  background: transparent;
+  border: 0;
+  padding: 0;
+  margin: 0;
+  border-radius: unset;
+  height: unset;
+  color: inherit;
+  line-height: inherit;
+  font-family: inherit;
+  font: inherit;
+  font-size: inherit;
+}
+.crm-container tr:hover,
+.crm-container tr:focus,
+.crm-container table.dataTable.hover tbody tr:hover,
+.crm-container table.dataTable.display tbody tr:hover {
+  background-color: transparent;
+}
+/* Remove list styles (bullets/numbers) */
+.crm-container ol,
+.crm-container ul,
+.crm-container menu {
+  list-style: none;
+}
+/* For images to not be able to exceed their container */
+.crm-container img {
+  max-inline-size: 100%;
+  max-block-size: 100%;
+}
+.crm-container img.olTileImage {
+  max-block-size: unset; /* open street map exception */
+}
+.crm-container table {
+  border-collapse: collapse;
+}
+
+/* JQueryUI resets (!important vs JQuery UI css) */
+
+.crm-container .ui-tabs .ui-tabs-panel,
+.crm-container .ui-tabs {
+  padding: 0;
+}
+.crm-container .ui-widget,
+.crm-container .ui-widget input,
+.crm-container.ui-widget input,
+.crm-container .ui-widget select,
+.crm-container.ui-widget select,
+.crm-container .ui-widget textarea,
+.crm-container .ui-widget select,
+.crm-container.ui-widget button,
+.crm-container .ui-widget button,
+.ui-widget.ui-autocomplete,
+.crm-quickSearch-results .ui-widget {
+  font-family: inherit !important;
+  font-size: inherit;
+}
+.crm-container .ui-icon {
+  width: inherit;
+  background-image: none !important;
+}
+.crm-container .ui-icon:hover {
+  background-image: none;
+}
+.crm-container .ui-corner-all {
+  border-radius: 0;
+}
+.crm-container .ui-button-icon-only .ui-icon {
+  position: initial;
+  top: auto;
+  left: auto;
+  margin-top: auto;
+  margin-left: auto;
+  float: right;
+}
+.crm-container .ui-widget-content {
+  color: inherit;
+}
+.crm-container .ui-widget,
+.crm-container .ui-widget-content,
+.ui-tabs .ui-tabs-nav li {
+  border: 0;
+  background: transparent;
+  white-space: unset;
+}
+.crm-container .ui-helper-clearfix::before,
+.crm-container .ui-helper-clearfix::after {
+  display: none;
+}
+
+/******************
+   ACCESSIBILITY
+*******************/
+
+.sr-only { /* text exclusively for screen readers */
+  border: 0;
+  clip: rect(1px, 1px, 1px, 1px);
+  clip-path: inset(50%);
+  height: 1px;
+  width: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+}
+.crm-container .crm-draggable {
+  cursor: move;
+}
+
+/******************
+   TYPE
+*******************/
+
+/* Set Default Type */
+
+.crm-container {
+  font-family: var(--crm-font);
+  font-size: var(--crm-font-size);
+  line-height: 1.4;
+  color: var(--crm-c-text);
+  background: var(--crm-c-page-background);
+}
+.crm-container table,
+.crm-container tr,
+.crm-container tr td,
+.crm-container p,
+.crm-container ul {
+  font-size: var(--crm-font-size);
+  line-height: var(--crm-type-line-height);
+  color: var(--crm-c-text);
+}
+
+/* Core type */
+
+.crm-container strong,
+.crm-container b,
+.crm-container .bold,
+.crm-container .font-bold {
+  font-family: var(--crm-font-bold);
+  font-weight: bold;
+}
+.crm-container em,
+.crm-container .font-italic {
+  font-family: var(--crm-font-italic);
+  font-style: italic;
+}
+.crm-container strong em,
+.crm-container em strong {
+  font-family: var(--crm-font-bold-italic);
+  font-weight: bold;
+  font-style: italic;
+}
+.crm-container .strikethrough {
+  text-decoration: line-through;
+}
+.crm-container .upper {
+  text-transform: uppercase;
+}
+.crm-container h3,
+#bootstrap-theme h3 {
+  background-color: var(--crm-heading-bg);
+  font-size: var(--crm-r1);
+  font-family: var(--crm-font-bold);
+  font-weight: bold;
+  color: var(--crm-heading-col);
+  padding: var(--crm-heading-padding);
+  border-radius: var(--crm-heading-radius);
+  margin: var(--crm-heading-margin);
+}
+
+/* Definition lists */
+
+dl dd,
+dl dl {
+  margin-block-end: var(--crm-m1);
+  margin-inline-start: var(--crm-r1);
+}
+
+/* Practical colors */
+
+.crm-container .del,
+.crm-container .crm-is_deleted,
+.crm-container table.caseSelector td.status-urgent,
+.crm-container p.error,
+.crm-container .status-removed,
+.crm-container .status-overdue,
+.crm-container .status-fatal,
+.crm-container .status-hold,
+.crm-container .status-past,
+.crm-container .crmMailing-error-link .crm-contact-deceased,
+.crm-container .status-warning,
+.crm-container .crm-error,
+.crm-container td.tasklist a:link,
+#bootstrap-theme .has-error .help-block,
+#bootstrap-theme .has-error .control-label,
+#bootstrap-theme .has-error .radio,
+#bootstrap-theme .has-error .checkbox,
+#bootstrap-theme .has-error .radio-inline,
+#bootstrap-theme .has-error .checkbox-inline,
+#bootstrap-theme .has-error.radio label,
+#bootstrap-theme .has-error.checkbox label,
+#bootstrap-theme .has-error.radio-inline label,
+#bootstrap-theme .has-error.checkbox-inline label {
+  color: var(--crm-c-alert);
+}
+.crm-container .font-red {
+  color: var(--crm-c-red-dark);
+}
+.crm-container td.tasklist a:visited,
+#bootstrap-theme .has-success .help-block,
+#bootstrap-theme .has-success .control-label,
+#bootstrap-theme .has-success .radio,
+#bootstrap-theme .has-success .checkbox,
+#bootstrap-theme .has-success .radio-inline,
+#bootstrap-theme .has-success .checkbox-inline,
+#bootstrap-theme .has-success.radio label,
+#bootstrap-theme .has-success.checkbox label,
+#bootstrap-theme .has-success.radio-inline label,
+#bootstrap-theme .has-success.checkbox-inline label {
+  color: var(--crm-c-success);
+}
+#bootstrap-theme .has-warning .help-block,
+#bootstrap-theme .has-warning .control-label,
+#bootstrap-theme .has-warning .radio,
+#bootstrap-theme .has-warning .checkbox,
+#bootstrap-theme .has-warning .radio-inline,
+#bootstrap-theme .has-warning .checkbox-inline,
+#bootstrap-theme .has-warning.radio label,
+#bootstrap-theme .has-warning.checkbox label,
+#bootstrap-theme .has-warning.radio-inline label,
+#bootstrap-theme .has-warning.checkbox-inline label {
+  color: var(--crm-c-warning);
+}
+.crm-container .disabled,
+.crm-container .crm-disabled,
+.crm-container .disabled *,
+.crm-container .cancelled,
+.crm-container .cancelled td,
+.crm-container li.disabled a.ui-tabs-anchor {
+  color: var(--crm-c-inactive);
+}
+
+/* BS3 type styles */
+
+.crm-container .text-left {
+  text-align: left;
+}
+.crm-container .text-right,
+.crm-container td.right {
+  text-align: right;
+}
+.crm-container .text-center {
+  text-align: center;
+}
+.crm-container .text-justify {
+  text-align: justify;
+}
+.crm-container .text-nowrap {
+  white-space: nowrap;
+}
+.crm-container .text-lowercase {
+  text-transform: lowercase;
+}
+.crm-container .text-uppercase,
+.crm-container .initialism {
+  text-transform: uppercase;
+}
+.crm-container .text-capitalize {
+  text-transform: capitalize;
+}
+.crm-container .text-muted,
+.crm-container .diasbled {
+  color: var(--crm-c-inactive);
+}
+.crm-container .text-primary {
+  color: var(--crm-c-primary);
+}
+.crm-container a.text-primary:hover,
+.crm-container a.text-primary:focus {
+  color: var(--crm-c-primary-hover);
+}
+.crm-container .text-success {
+  color: var(--crm-c-success);
+}
+.crm-container .text-info {
+  color: var(--crm-c-info);
+}
+.crm-container .text-warning {
+  color: var(--crm-c-warning);
+}
+.crm-container .text-danger {
+  color: var(--crm-c-alert);
+}
+.crm-container h1,
+.crm-container h2,
+.crm-container h4,
+.crm-container h5,
+.crm-container h6 {
+  color: var(--crm-c-text);
+}
+.crm-container code,
+.crm-container kbd,
+.crm-container samp,
+.crm-container pre {
+  display: block;
+  padding: var(--crm-padding-small);
+  margin: 0 0 var(--crm-padding-small);
+  font-size: var(--crm-font-size) !important /* vs inline css on api3 */;
+  line-height: 1.4  !important /* vs inline css on api3 */;
+  color: var(--crm-c-text);
+  word-break: break-all;
+  word-wrap: break-word;
+  background-color: var(--crm-c-code-background);
+  border: 1px solid var(--crm-c-background4);
+  border-radius: var(--crm-roundness);
+}
+.crm-container pre {
+  white-space: normal;
+  word-break: normal;
+}
+.crm-container pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
+}
+.crm-container p code {
+  display: inline-block;
+}
+.crm-container .pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+/******************
+   LINK
+*******************/
+
+.crm-container a {
+  color: var(--crm-c-link);
+  text-decoration: var(--crm-link-decoration);
+}
+.crm-container a:hover,
+.crm-container a:focus {
+  color: var(--crm-c-link-hover);
+  text-decoration: var(--crm-link-decoration-hover);
+}
+.crm-container a:focus {
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+/******************
+   POSITION
+*******************/
+
+#crm-container /* applied to #crm not .crm to apply only once */ {
+  max-width: 100%;
+  min-height: 100vh;
+  padding: var(--crm-page-padding);
+}
+.crm-container .crm-flex-box {
+  display: flex;
+  flex-wrap: wrap;
+}
+.crm-container .crm-flex-box > * {
+  gap: var(--crm-flex-gap);
+  flex: 1;
+  min-width: 0;
+}
+.crm-container .crm-flex-1 {
+  flex: 1;
+}
+.crm-container .crm-flex-2 {
+  flex: 2;
+}
+.crm-container .crm-flex-3 {
+  flex: 3;
+}
+.crm-container .crm-flex-4 {
+  flex: 4;
+}
+.crm-container .crm-flex-5 {
+  flex: 5;
+}
+.crm-container .css_right,
+.crm-container .float-right,
+.crm-container .pull-right,
+.crm-container .element-right {
+  float: right;
+}
+/* Responsive  */
+
+@media (max-width: 989px) {
+  .crm-container .crm-flex-box,
+  .api4-input /* sections/api4-explorer */ {
+    flex-direction: column;
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/_bootstrap.css b/civicrm/ext/riverlea/core/css/_bootstrap.css
new file mode 100644
index 0000000000000000000000000000000000000000..3f6182d1eca4ee434d3386647c93f86bff438461
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/_bootstrap.css
@@ -0,0 +1,3886 @@
+/* The Bootstrap typically bundled has been re-structured in River Lea:
+    - Some of it that wasn't being used (e.g. Glyphicons, Carousels) is deleted / commented out
+    - Some of it is taken out of the #bootstrap-theme namespace and added to /components/ typically marked, e.g. 'BS buttons'
+    - Some of it has been taken out and put below with as much integration with the rest of River Lea's CSS variables.
+  It is structured as:
+   - Type
+   - Print
+   - Image
+   - Alerts
+   - Screenreader
+   - Lists
+   - Definition lists
+   - Blockquote
+   - Various HTML elements
+   - Container
+   - Column system
+   - Table
+   - Input
+   - Buttons
+   - Nav
+   - Breadcrumb
+   - Pager
+   - Jumbotron
+   - Media
+   - List group
+   - Embed
+   - Well
+   - Close
+   - Modal
+   - Tooltip
+   - Popover
+   - Labels
+   - Panels (with tables & list elements)
+   - Hiding elements
+   */
+
+/* Type */
+
+#bootstrap-theme p {
+  margin: 0 0 10px;
+}
+#bootstrap-theme .lead {
+  margin-bottom: 20px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4;
+}
+#bootstrap-theme small,
+#bootstrap-theme .small {
+  font-size: 85%;
+}
+#bootstrap-theme sub,
+#bootstrap-theme sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+#bootstrap-theme sup {
+  top: -.5em;
+}
+#bootstrap-theme sub {
+  bottom: -.25em;
+}
+#bootstrap-theme h1 {
+  font-size: 2em;
+  margin: .67em 0;
+}
+#bootstrap-theme .help-block {
+  display: block;
+  color: var(--crm-c-text);
+  font-style: italic;
+  font-family: var(--crm-font-italic);
+  margin: var(--crm-s) 0 var(--crm-m);
+  font-size: var(--crm-font-small-size);
+}
+#bootstrap-theme h4,
+#bootstrap-theme .h4,
+#bootstrap-theme h5,
+#bootstrap-theme .h5,
+#bootstrap-theme h6,
+#bootstrap-theme .h6 {
+  margin-top: var(--crm-m1);
+  margin-bottom: var(--crm-m1);
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+  color: var(--crm-c-text);
+  line-height: 1.2;
+}
+#bootstrap-theme h1,
+#bootstrap-theme h2,
+#bootstrap-theme h3,
+#bootstrap-theme .h1,
+#bootstrap-theme .h2,
+#bootstrap-theme .h3 {
+  line-height: 1.2;
+}
+#bootstrap-theme h1 small,
+#bootstrap-theme h1 .small,
+#bootstrap-theme .h1 small,
+#bootstrap-theme .h1 .small,
+#bootstrap-theme h2 small,
+#bootstrap-theme h2 .small,
+#bootstrap-theme .h2 small,
+#bootstrap-theme .h2 .small,
+#bootstrap-theme h3 small,
+#bootstrap-theme h3 .small,
+#bootstrap-theme .h3 small,
+#bootstrap-theme .h3 .small {
+  font-size: 65%;
+  line-height: 1;
+}
+#bootstrap-theme h4 small,
+#bootstrap-theme h4 .small,
+#bootstrap-theme .h4 small,
+#bootstrap-theme .h4 .small,
+#bootstrap-theme h5 small,
+#bootstrap-theme h5 .small,
+#bootstrap-theme .h5 small,
+#bootstrap-theme .h5 .small,
+#bootstrap-theme h6 small,
+#bootstrap-theme h6 .small,
+#bootstrap-theme .h6 small,
+#bootstrap-theme .h6 .small {
+  font-size: 75%;
+  line-height: 1;
+}
+#bootstrap-theme mark,
+#bootstrap-theme .mark {
+  background: var(--crm-c-yellow);
+  color: var(--crm-c-text);
+  padding: .2rem;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .lead {
+    font-size: 21px;
+  }
+}
+
+/* Print */
+
+@media print {
+  #bootstrap-theme *,
+  #bootstrap-theme *:before,
+  #bootstrap-theme *:after {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important;
+  }
+  #bootstrap-theme a,
+  #bootstrap-theme a:visited {
+    text-decoration: underline;
+  }
+  #bootstrap-theme a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  #bootstrap-theme abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  #bootstrap-theme a[href^="#"]:after,
+  #bootstrap-theme a[href^="javascript:"]:after {
+    content: "";
+  }
+  #bootstrap-theme pre,
+  #bootstrap-theme blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+  #bootstrap-theme thead {
+    display: table-header-group;
+  }
+  #bootstrap-theme tr,
+  #bootstrap-theme img {
+    page-break-inside: avoid;
+  }
+  #bootstrap-theme img {
+    max-width: 100% !important;
+  }
+  #bootstrap-theme p,
+  #bootstrap-theme h2,
+  #bootstrap-theme h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  #bootstrap-theme h2,
+  #bootstrap-theme h3 {
+    page-break-after: avoid;
+  }
+  #bootstrap-theme .navbar {
+    display: none;
+  }
+  #bootstrap-theme .btn > .caret,
+  #bootstrap-theme .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  #bootstrap-theme .label {
+    border: 1px solid #000;
+  }
+  #bootstrap-theme .table {
+    border-collapse: collapse !important;
+  }
+  #bootstrap-theme .table td,
+  #bootstrap-theme .table th {
+    background-color: #fff !important;
+  }
+  #bootstrap-theme .table-bordered th,
+  #bootstrap-theme .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+
+/* Image */
+
+#bootstrap-theme svg:not(:root) {
+  overflow: hidden;
+}
+#bootstrap-theme img {
+  vertical-align: middle;
+}
+#bootstrap-theme .img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+#bootstrap-theme .img-rounded {
+  border-radius: 6px;
+}
+#bootstrap-theme .img-thumbnail {
+  padding: 4px;
+  line-height: 1.428571429;
+  background-color: white;
+  border: var(--crm-c-divider);
+  border-radius: var(--crm-c-roundness);
+  transition: all .2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+#bootstrap-theme .img-circle {
+  border-radius: 50%;
+}
+
+/* Alerts */
+
+#bootstrap-theme .alert h4 {
+  margin-top: 0;
+  color: inherit;
+}
+#bootstrap-theme .alert .alert-link {
+  font-weight: bold;
+}
+#bootstrap-theme .alert > p,
+#bootstrap-theme .alert > ul {
+  margin-bottom: 0;
+}
+#bootstrap-theme .alert > p + p {
+  margin-top: 5px;
+}
+#bootstrap-theme .alert-success hr {
+  border-top-color: var(--crm-alert-border-help);
+}
+#bootstrap-theme .alert-success .alert-link {
+  color: var(--crm-alert-text-help);
+}
+#bootstrap-theme .alert-info hr {
+  border-top-color: var(--crm-alert-border-info);
+}
+#bootstrap-theme .alert-info .alert-link {
+  color: var(--crm-alert-text-info);
+}
+#bootstrap-theme .alert-warning hr {
+  border-top-color: var(--crm-alert-border-warning);
+}
+#bootstrap-theme .alert-warning .alert-link {
+  color: var(--crm-alert-text-warning);
+}
+#bootstrap-theme .alert-danger hr {
+  border-top-color: var(--crm-alert-border-danger);
+}
+#bootstrap-theme .alert-danger .alert-link {
+  color: var(--crm-alert-text-danger);
+}
+
+/* Screen reader */
+
+#bootstrap-theme .sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+#bootstrap-theme .sr-only-focusable:active,
+#bootstrap-theme .sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+
+/* List */
+
+#bootstrap-theme ul ul,
+#bootstrap-theme ul ol,
+#bootstrap-theme ol ul,
+#bootstrap-theme ol ol {
+  margin-bottom: 0;
+}
+#bootstrap-theme .list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+#bootstrap-theme .list-inline {
+  padding-left: 0;
+  list-style: none;
+  margin-left: -5px;
+}
+#bootstrap-theme .list-inline > li {
+  display: inline-block;
+  padding-right: 5px;
+  padding-left: 5px;
+}
+
+/* Definition lists */
+
+#bootstrap-theme dl {
+  margin-top: 0;
+  margin-bottom: 20px;
+}
+#bootstrap-theme dt,
+#bootstrap-theme dd {
+  line-height: 1.428571429;
+}
+#bootstrap-theme dt {
+  font-weight: 700;
+}
+#bootstrap-theme dd {
+  margin-left: 0;
+}
+#bootstrap-theme .dl-horizontal dd:before,
+#bootstrap-theme .dl-horizontal dd:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .dl-horizontal dd:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    clear: left;
+    text-align: right;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  #bootstrap-theme .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+
+/* Blockquote */
+
+#bootstrap-theme blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eee;
+}
+#bootstrap-theme blockquote p:last-child,
+#bootstrap-theme blockquote ul:last-child,
+#bootstrap-theme blockquote ol:last-child {
+  margin-bottom: 0;
+}
+#bootstrap-theme blockquote footer,
+#bootstrap-theme blockquote small,
+#bootstrap-theme blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.428571429;
+  color: #999;
+}
+#bootstrap-theme blockquote footer:before,
+#bootstrap-theme blockquote small:before,
+#bootstrap-theme blockquote .small:before {
+  content: "— ";
+}
+#bootstrap-theme .blockquote-reverse,
+#bootstrap-theme blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  text-align: right;
+  border-right: 5px solid #eee;
+  border-left: 0;
+}
+#bootstrap-theme .blockquote-reverse footer:before,
+#bootstrap-theme .blockquote-reverse small:before,
+#bootstrap-theme .blockquote-reverse .small:before,
+#bootstrap-theme blockquote.pull-right footer:before,
+#bootstrap-theme blockquote.pull-right small:before,
+#bootstrap-theme blockquote.pull-right .small:before {
+  content: "";
+}
+#bootstrap-theme .blockquote-reverse footer:after,
+#bootstrap-theme .blockquote-reverse small:after,
+#bootstrap-theme .blockquote-reverse .small:after,
+#bootstrap-theme blockquote.pull-right footer:after,
+#bootstrap-theme blockquote.pull-right small:after,
+#bootstrap-theme blockquote.pull-right .small:after {
+  content: " —";
+}
+
+/* Various Html elements */
+
+#bootstrap-theme abbr[title],
+#bootstrap-theme abbr[data-original-title] {
+  cursor: help;
+  border-bottom: none;
+  text-decoration: underline;
+  text-decoration: underline dotted;
+}
+#bootstrap-theme .initialism {
+  font-size: 90%;
+}
+#bootstrap-theme dfn {
+  font-family: var(--crm-font-italic);
+  font-style: italic;
+}
+#bootstrap-theme hr {
+  box-sizing: content-box;
+  height: 0;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: var(--crm-c-divider);
+}
+#bootstrap-theme address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.428571429;
+}
+#bootstrap-theme kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: white;
+  background-color: #333;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+#bootstrap-theme kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  font-weight: 700;
+  box-shadow: none;
+}
+
+/* Container */
+
+#bootstrap-theme .container {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+#bootstrap-theme .container:before,
+#bootstrap-theme .container:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .container:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .container {
+    width: 750px;
+  }
+}
+@media (min-width: 992px) {
+  #bootstrap-theme .container {
+    width: 970px;
+  }
+}
+@media (min-width: 1200px) {
+  #bootstrap-theme .container {
+    width: 1170px;
+  }
+}
+#bootstrap-theme .container-fluid {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+#bootstrap-theme .container-fluid:before,
+#bootstrap-theme .container-fluid:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .container-fluid:after {
+  clear: both;
+}
+#bootstrap-theme .row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+#bootstrap-theme .row:before,
+#bootstrap-theme .row:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .row:after {
+  clear: both;
+}
+#bootstrap-theme .row-no-gutters {
+  margin-right: 0;
+  margin-left: 0;
+}
+#bootstrap-theme .row-no-gutters [class*="col-"] {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+/* Column system */
+
+#bootstrap-theme .col-xs-1,
+#bootstrap-theme .col-sm-1,
+#bootstrap-theme .col-md-1,
+#bootstrap-theme .col-lg-1,
+#bootstrap-theme .col-xs-2,
+#bootstrap-theme .col-sm-2,
+#bootstrap-theme .col-md-2,
+#bootstrap-theme .col-lg-2,
+#bootstrap-theme .col-xs-3,
+#bootstrap-theme .col-sm-3,
+#bootstrap-theme .col-md-3,
+#bootstrap-theme .col-lg-3,
+#bootstrap-theme .col-xs-4,
+#bootstrap-theme .col-sm-4,
+#bootstrap-theme .col-md-4,
+#bootstrap-theme .col-lg-4,
+#bootstrap-theme .col-xs-5,
+#bootstrap-theme .col-sm-5,
+#bootstrap-theme .col-md-5,
+#bootstrap-theme .col-lg-5,
+#bootstrap-theme .col-xs-6,
+#bootstrap-theme .col-sm-6,
+#bootstrap-theme .col-md-6,
+#bootstrap-theme .col-lg-6,
+#bootstrap-theme .col-xs-7,
+#bootstrap-theme .col-sm-7,
+#bootstrap-theme .col-md-7,
+#bootstrap-theme .col-lg-7,
+#bootstrap-theme .col-xs-8,
+#bootstrap-theme .col-sm-8,
+#bootstrap-theme .col-md-8,
+#bootstrap-theme .col-lg-8,
+#bootstrap-theme .col-xs-9,
+#bootstrap-theme .col-sm-9,
+#bootstrap-theme .col-md-9,
+#bootstrap-theme .col-lg-9,
+#bootstrap-theme .col-xs-10,
+#bootstrap-theme .col-sm-10,
+#bootstrap-theme .col-md-10,
+#bootstrap-theme .col-lg-10,
+#bootstrap-theme .col-xs-11,
+#bootstrap-theme .col-sm-11,
+#bootstrap-theme .col-md-11,
+#bootstrap-theme .col-lg-11,
+#bootstrap-theme .col-xs-12,
+#bootstrap-theme .col-sm-12,
+#bootstrap-theme .col-md-12,
+#bootstrap-theme .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+#bootstrap-theme .col-xs-1,
+#bootstrap-theme .col-xs-2,
+#bootstrap-theme .col-xs-3,
+#bootstrap-theme .col-xs-4,
+#bootstrap-theme .col-xs-5,
+#bootstrap-theme .col-xs-6,
+#bootstrap-theme .col-xs-7,
+#bootstrap-theme .col-xs-8,
+#bootstrap-theme .col-xs-9,
+#bootstrap-theme .col-xs-10,
+#bootstrap-theme .col-xs-11,
+#bootstrap-theme .col-xs-12 {
+  float: left;
+}
+#bootstrap-theme .col-xs-1 {
+  width: 8.3333333333%;
+}
+#bootstrap-theme .col-xs-2 {
+  width: 16.6666666667%;
+}
+#bootstrap-theme .col-xs-3 {
+  width: 25%;
+}
+#bootstrap-theme .col-xs-4 {
+  width: 33.3333333333%;
+}
+#bootstrap-theme .col-xs-5 {
+  width: 41.6666666667%;
+}
+#bootstrap-theme .col-xs-6 {
+  width: 50%;
+}
+#bootstrap-theme .col-xs-7 {
+  width: 58.3333333333%;
+}
+#bootstrap-theme .col-xs-8 {
+  width: 66.6666666667%;
+}
+#bootstrap-theme .col-xs-9 {
+  width: 75%;
+}
+#bootstrap-theme .col-xs-10 {
+  width: 83.3333333333%;
+}
+#bootstrap-theme .col-xs-11 {
+  width: 91.6666666667%;
+}
+#bootstrap-theme .col-xs-12 {
+  width: 100%;
+}
+#bootstrap-theme .col-xs-pull-0 {
+  right: auto;
+}
+#bootstrap-theme .col-xs-pull-1 {
+  right: 8.3333333333%;
+}
+#bootstrap-theme .col-xs-pull-2 {
+  right: 16.6666666667%;
+}
+#bootstrap-theme .col-xs-pull-3 {
+  right: 25%;
+}
+#bootstrap-theme .col-xs-pull-4 {
+  right: 33.3333333333%;
+}
+#bootstrap-theme .col-xs-pull-5 {
+  right: 41.6666666667%;
+}
+#bootstrap-theme .col-xs-pull-6 {
+  right: 50%;
+}
+#bootstrap-theme .col-xs-pull-7 {
+  right: 58.3333333333%;
+}
+#bootstrap-theme .col-xs-pull-8 {
+  right: 66.6666666667%;
+}
+#bootstrap-theme .col-xs-pull-9 {
+  right: 75%;
+}
+#bootstrap-theme .col-xs-pull-10 {
+  right: 83.3333333333%;
+}
+#bootstrap-theme .col-xs-pull-11 {
+  right: 91.6666666667%;
+}
+#bootstrap-theme .col-xs-pull-12 {
+  right: 100%;
+}
+#bootstrap-theme .col-xs-push-0 {
+  left: auto;
+}
+#bootstrap-theme .col-xs-push-1 {
+  left: 8.3333333333%;
+}
+#bootstrap-theme .col-xs-push-2 {
+  left: 16.6666666667%;
+}
+#bootstrap-theme .col-xs-push-3 {
+  left: 25%;
+}
+#bootstrap-theme .col-xs-push-4 {
+  left: 33.3333333333%;
+}
+#bootstrap-theme .col-xs-push-5 {
+  left: 41.6666666667%;
+}
+#bootstrap-theme .col-xs-push-6 {
+  left: 50%;
+}
+#bootstrap-theme .col-xs-push-7 {
+  left: 58.3333333333%;
+}
+#bootstrap-theme .col-xs-push-8 {
+  left: 66.6666666667%;
+}
+#bootstrap-theme .col-xs-push-9 {
+  left: 75%;
+}
+#bootstrap-theme .col-xs-push-10 {
+  left: 83.3333333333%;
+}
+#bootstrap-theme .col-xs-push-11 {
+  left: 91.6666666667%;
+}
+#bootstrap-theme .col-xs-push-12 {
+  left: 100%;
+}
+#bootstrap-theme .col-xs-offset-0 {
+  margin-left: 0%;
+}
+#bootstrap-theme .col-xs-offset-1 {
+  margin-left: 8.3333333333%;
+}
+#bootstrap-theme .col-xs-offset-2 {
+  margin-left: 16.6666666667%;
+}
+#bootstrap-theme .col-xs-offset-3 {
+  margin-left: 25%;
+}
+#bootstrap-theme .col-xs-offset-4 {
+  margin-left: 33.3333333333%;
+}
+#bootstrap-theme .col-xs-offset-5 {
+  margin-left: 41.6666666667%;
+}
+#bootstrap-theme .col-xs-offset-6 {
+  margin-left: 50%;
+}
+#bootstrap-theme .col-xs-offset-7 {
+  margin-left: 58.3333333333%;
+}
+#bootstrap-theme .col-xs-offset-8 {
+  margin-left: 66.6666666667%;
+}
+#bootstrap-theme .col-xs-offset-9 {
+  margin-left: 75%;
+}
+#bootstrap-theme .col-xs-offset-10 {
+  margin-left: 83.3333333333%;
+}
+#bootstrap-theme .col-xs-offset-11 {
+  margin-left: 91.6666666667%;
+}
+#bootstrap-theme .col-xs-offset-12 {
+  margin-left: 100%;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .col-sm-1,
+  #bootstrap-theme .col-sm-2,
+  #bootstrap-theme .col-sm-3,
+  #bootstrap-theme .col-sm-4,
+  #bootstrap-theme .col-sm-5,
+  #bootstrap-theme .col-sm-6,
+  #bootstrap-theme .col-sm-7,
+  #bootstrap-theme .col-sm-8,
+  #bootstrap-theme .col-sm-9,
+  #bootstrap-theme .col-sm-10,
+  #bootstrap-theme .col-sm-11,
+  #bootstrap-theme .col-sm-12 {
+    float: left;
+  }
+  #bootstrap-theme .col-sm-1 {
+    width: 8.3333333333%;
+  }
+  #bootstrap-theme .col-sm-2 {
+    width: 16.6666666667%;
+  }
+  #bootstrap-theme .col-sm-3 {
+    width: 25%;
+  }
+  #bootstrap-theme .col-sm-4 {
+    width: 33.3333333333%;
+  }
+  #bootstrap-theme .col-sm-5 {
+    width: 41.6666666667%;
+  }
+  #bootstrap-theme .col-sm-6 {
+    width: 50%;
+  }
+  #bootstrap-theme .col-sm-7 {
+    width: 58.3333333333%;
+  }
+  #bootstrap-theme .col-sm-8 {
+    width: 66.6666666667%;
+  }
+  #bootstrap-theme .col-sm-9 {
+    width: 75%;
+  }
+  #bootstrap-theme .col-sm-10 {
+    width: 83.3333333333%;
+  }
+  #bootstrap-theme .col-sm-11 {
+    width: 91.6666666667%;
+  }
+  #bootstrap-theme .col-sm-12 {
+    width: 100%;
+  }
+  #bootstrap-theme .col-sm-pull-0 {
+    right: auto;
+  }
+  #bootstrap-theme .col-sm-pull-1 {
+    right: 8.3333333333%;
+  }
+  #bootstrap-theme .col-sm-pull-2 {
+    right: 16.6666666667%;
+  }
+  #bootstrap-theme .col-sm-pull-3 {
+    right: 25%;
+  }
+  #bootstrap-theme .col-sm-pull-4 {
+    right: 33.3333333333%;
+  }
+  #bootstrap-theme .col-sm-pull-5 {
+    right: 41.6666666667%;
+  }
+  #bootstrap-theme .col-sm-pull-6 {
+    right: 50%;
+  }
+  #bootstrap-theme .col-sm-pull-7 {
+    right: 58.3333333333%;
+  }
+  #bootstrap-theme .col-sm-pull-8 {
+    right: 66.6666666667%;
+  }
+  #bootstrap-theme .col-sm-pull-9 {
+    right: 75%;
+  }
+  #bootstrap-theme .col-sm-pull-10 {
+    right: 83.3333333333%;
+  }
+  #bootstrap-theme .col-sm-pull-11 {
+    right: 91.6666666667%;
+  }
+  #bootstrap-theme .col-sm-pull-12 {
+    right: 100%;
+  }
+  #bootstrap-theme .col-sm-push-0 {
+    left: auto;
+  }
+  #bootstrap-theme .col-sm-push-1 {
+    left: 8.3333333333%;
+  }
+  #bootstrap-theme .col-sm-push-2 {
+    left: 16.6666666667%;
+  }
+  #bootstrap-theme .col-sm-push-3 {
+    left: 25%;
+  }
+  #bootstrap-theme .col-sm-push-4 {
+    left: 33.3333333333%;
+  }
+  #bootstrap-theme .col-sm-push-5 {
+    left: 41.6666666667%;
+  }
+  #bootstrap-theme .col-sm-push-6 {
+    left: 50%;
+  }
+  #bootstrap-theme .col-sm-push-7 {
+    left: 58.3333333333%;
+  }
+  #bootstrap-theme .col-sm-push-8 {
+    left: 66.6666666667%;
+  }
+  #bootstrap-theme .col-sm-push-9 {
+    left: 75%;
+  }
+  #bootstrap-theme .col-sm-push-10 {
+    left: 83.3333333333%;
+  }
+  #bootstrap-theme .col-sm-push-11 {
+    left: 91.6666666667%;
+  }
+  #bootstrap-theme .col-sm-push-12 {
+    left: 100%;
+  }
+  #bootstrap-theme .col-sm-offset-0 {
+    margin-left: 0%;
+  }
+  #bootstrap-theme .col-sm-offset-1 {
+    margin-left: 8.3333333333%;
+  }
+  #bootstrap-theme .col-sm-offset-2 {
+    margin-left: 16.6666666667%;
+  }
+  #bootstrap-theme .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  #bootstrap-theme .col-sm-offset-4 {
+    margin-left: 33.3333333333%;
+  }
+  #bootstrap-theme .col-sm-offset-5 {
+    margin-left: 41.6666666667%;
+  }
+  #bootstrap-theme .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  #bootstrap-theme .col-sm-offset-7 {
+    margin-left: 58.3333333333%;
+  }
+  #bootstrap-theme .col-sm-offset-8 {
+    margin-left: 66.6666666667%;
+  }
+  #bootstrap-theme .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  #bootstrap-theme .col-sm-offset-10 {
+    margin-left: 83.3333333333%;
+  }
+  #bootstrap-theme .col-sm-offset-11 {
+    margin-left: 91.6666666667%;
+  }
+  #bootstrap-theme .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+}
+@media (min-width: 992px) {
+  #bootstrap-theme .col-md-1,
+  #bootstrap-theme .col-md-2,
+  #bootstrap-theme .col-md-3,
+  #bootstrap-theme .col-md-4,
+  #bootstrap-theme .col-md-5,
+  #bootstrap-theme .col-md-6,
+  #bootstrap-theme .col-md-7,
+  #bootstrap-theme .col-md-8,
+  #bootstrap-theme .col-md-9,
+  #bootstrap-theme .col-md-10,
+  #bootstrap-theme .col-md-11,
+  #bootstrap-theme .col-md-12 {
+    float: left;
+  }
+  #bootstrap-theme .col-md-1 {
+    width: 8.3333333333%;
+  }
+  #bootstrap-theme .col-md-2 {
+    width: 16.6666666667%;
+  }
+  #bootstrap-theme .col-md-3 {
+    width: 25%;
+  }
+  #bootstrap-theme .col-md-4 {
+    width: 33.3333333333%;
+  }
+  #bootstrap-theme .col-md-5 {
+    width: 41.6666666667%;
+  }
+  #bootstrap-theme .col-md-6 {
+    width: 50%;
+  }
+  #bootstrap-theme .col-md-7 {
+    width: 58.3333333333%;
+  }
+  #bootstrap-theme .col-md-8 {
+    width: 66.6666666667%;
+  }
+  #bootstrap-theme .col-md-9 {
+    width: 75%;
+  }
+  #bootstrap-theme .col-md-10 {
+    width: 83.3333333333%;
+  }
+  #bootstrap-theme .col-md-11 {
+    width: 91.6666666667%;
+  }
+  #bootstrap-theme .col-md-12 {
+    width: 100%;
+  }
+  #bootstrap-theme .col-md-pull-0 {
+    right: auto;
+  }
+  #bootstrap-theme .col-md-pull-1 {
+    right: 8.3333333333%;
+  }
+  #bootstrap-theme .col-md-pull-2 {
+    right: 16.6666666667%;
+  }
+  #bootstrap-theme .col-md-pull-3 {
+    right: 25%;
+  }
+  #bootstrap-theme .col-md-pull-4 {
+    right: 33.3333333333%;
+  }
+  #bootstrap-theme .col-md-pull-5 {
+    right: 41.6666666667%;
+  }
+  #bootstrap-theme .col-md-pull-6 {
+    right: 50%;
+  }
+  #bootstrap-theme .col-md-pull-7 {
+    right: 58.3333333333%;
+  }
+  #bootstrap-theme .col-md-pull-8 {
+    right: 66.6666666667%;
+  }
+  #bootstrap-theme .col-md-pull-9 {
+    right: 75%;
+  }
+  #bootstrap-theme .col-md-pull-10 {
+    right: 83.3333333333%;
+  }
+  #bootstrap-theme .col-md-pull-11 {
+    right: 91.6666666667%;
+  }
+  #bootstrap-theme .col-md-pull-12 {
+    right: 100%;
+  }
+  #bootstrap-theme .col-md-push-0 {
+    left: auto;
+  }
+  #bootstrap-theme .col-md-push-1 {
+    left: 8.3333333333%;
+  }
+  #bootstrap-theme .col-md-push-2 {
+    left: 16.6666666667%;
+  }
+  #bootstrap-theme .col-md-push-3 {
+    left: 25%;
+  }
+  #bootstrap-theme .col-md-push-4 {
+    left: 33.3333333333%;
+  }
+  #bootstrap-theme .col-md-push-5 {
+    left: 41.6666666667%;
+  }
+  #bootstrap-theme .col-md-push-6 {
+    left: 50%;
+  }
+  #bootstrap-theme .col-md-push-7 {
+    left: 58.3333333333%;
+  }
+  #bootstrap-theme .col-md-push-8 {
+    left: 66.6666666667%;
+  }
+  #bootstrap-theme .col-md-push-9 {
+    left: 75%;
+  }
+  #bootstrap-theme .col-md-push-10 {
+    left: 83.3333333333%;
+  }
+  #bootstrap-theme .col-md-push-11 {
+    left: 91.6666666667%;
+  }
+  #bootstrap-theme .col-md-push-12 {
+    left: 100%;
+  }
+  #bootstrap-theme .col-md-offset-0 {
+    margin-left: 0%;
+  }
+  #bootstrap-theme .col-md-offset-1 {
+    margin-left: 8.3333333333%;
+  }
+  #bootstrap-theme .col-md-offset-2 {
+    margin-left: 16.6666666667%;
+  }
+  #bootstrap-theme .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  #bootstrap-theme .col-md-offset-4 {
+    margin-left: 33.3333333333%;
+  }
+  #bootstrap-theme .col-md-offset-5 {
+    margin-left: 41.6666666667%;
+  }
+  #bootstrap-theme .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  #bootstrap-theme .col-md-offset-7 {
+    margin-left: 58.3333333333%;
+  }
+  #bootstrap-theme .col-md-offset-8 {
+    margin-left: 66.6666666667%;
+  }
+  #bootstrap-theme .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  #bootstrap-theme .col-md-offset-10 {
+    margin-left: 83.3333333333%;
+  }
+  #bootstrap-theme .col-md-offset-11 {
+    margin-left: 91.6666666667%;
+  }
+  #bootstrap-theme .col-md-offset-12 {
+    margin-left: 100%;
+  }
+}
+@media (min-width: 1200px) {
+  #bootstrap-theme .col-lg-1,
+  #bootstrap-theme .col-lg-2,
+  #bootstrap-theme .col-lg-3,
+  #bootstrap-theme .col-lg-4,
+  #bootstrap-theme .col-lg-5,
+  #bootstrap-theme .col-lg-6,
+  #bootstrap-theme .col-lg-7,
+  #bootstrap-theme .col-lg-8,
+  #bootstrap-theme .col-lg-9,
+  #bootstrap-theme .col-lg-10,
+  #bootstrap-theme .col-lg-11,
+  #bootstrap-theme .col-lg-12 {
+    float: left;
+  }
+  #bootstrap-theme .col-lg-1 {
+    width: 8.3333333333%;
+  }
+  #bootstrap-theme .col-lg-2 {
+    width: 16.6666666667%;
+  }
+  #bootstrap-theme .col-lg-3 {
+    width: 25%;
+  }
+  #bootstrap-theme .col-lg-4 {
+    width: 33.3333333333%;
+  }
+  #bootstrap-theme .col-lg-5 {
+    width: 41.6666666667%;
+  }
+  #bootstrap-theme .col-lg-6 {
+    width: 50%;
+  }
+  #bootstrap-theme .col-lg-7 {
+    width: 58.3333333333%;
+  }
+  #bootstrap-theme .col-lg-8 {
+    width: 66.6666666667%;
+  }
+  #bootstrap-theme .col-lg-9 {
+    width: 75%;
+  }
+  #bootstrap-theme .col-lg-10 {
+    width: 83.3333333333%;
+  }
+  #bootstrap-theme .col-lg-11 {
+    width: 91.6666666667%;
+  }
+  #bootstrap-theme .col-lg-12 {
+    width: 100%;
+  }
+  #bootstrap-theme .col-lg-pull-0 {
+    right: auto;
+  }
+  #bootstrap-theme .col-lg-pull-1 {
+    right: 8.3333333333%;
+  }
+  #bootstrap-theme .col-lg-pull-2 {
+    right: 16.6666666667%;
+  }
+  #bootstrap-theme .col-lg-pull-3 {
+    right: 25%;
+  }
+  #bootstrap-theme .col-lg-pull-4 {
+    right: 33.3333333333%;
+  }
+  #bootstrap-theme .col-lg-pull-5 {
+    right: 41.6666666667%;
+  }
+  #bootstrap-theme .col-lg-pull-6 {
+    right: 50%;
+  }
+  #bootstrap-theme .col-lg-pull-7 {
+    right: 58.3333333333%;
+  }
+  #bootstrap-theme .col-lg-pull-8 {
+    right: 66.6666666667%;
+  }
+  #bootstrap-theme .col-lg-pull-9 {
+    right: 75%;
+  }
+  #bootstrap-theme .col-lg-pull-10 {
+    right: 83.3333333333%;
+  }
+  #bootstrap-theme .col-lg-pull-11 {
+    right: 91.6666666667%;
+  }
+  #bootstrap-theme .col-lg-pull-12 {
+    right: 100%;
+  }
+  #bootstrap-theme .col-lg-push-0 {
+    left: auto;
+  }
+  #bootstrap-theme .col-lg-push-1 {
+    left: 8.3333333333%;
+  }
+  #bootstrap-theme .col-lg-push-2 {
+    left: 16.6666666667%;
+  }
+  #bootstrap-theme .col-lg-push-3 {
+    left: 25%;
+  }
+  #bootstrap-theme .col-lg-push-4 {
+    left: 33.3333333333%;
+  }
+  #bootstrap-theme .col-lg-push-5 {
+    left: 41.6666666667%;
+  }
+  #bootstrap-theme .col-lg-push-6 {
+    left: 50%;
+  }
+  #bootstrap-theme .col-lg-push-7 {
+    left: 58.3333333333%;
+  }
+  #bootstrap-theme .col-lg-push-8 {
+    left: 66.6666666667%;
+  }
+  #bootstrap-theme .col-lg-push-9 {
+    left: 75%;
+  }
+  #bootstrap-theme .col-lg-push-10 {
+    left: 83.3333333333%;
+  }
+  #bootstrap-theme .col-lg-push-11 {
+    left: 91.6666666667%;
+  }
+  #bootstrap-theme .col-lg-push-12 {
+    left: 100%;
+  }
+  #bootstrap-theme .col-lg-offset-0 {
+    margin-left: 0%;
+  }
+  #bootstrap-theme .col-lg-offset-1 {
+    margin-left: 8.3333333333%;
+  }
+  #bootstrap-theme .col-lg-offset-2 {
+    margin-left: 16.6666666667%;
+  }
+  #bootstrap-theme .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  #bootstrap-theme .col-lg-offset-4 {
+    margin-left: 33.3333333333%;
+  }
+  #bootstrap-theme .col-lg-offset-5 {
+    margin-left: 41.6666666667%;
+  }
+  #bootstrap-theme .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  #bootstrap-theme .col-lg-offset-7 {
+    margin-left: 58.3333333333%;
+  }
+  #bootstrap-theme .col-lg-offset-8 {
+    margin-left: 66.6666666667%;
+  }
+  #bootstrap-theme .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  #bootstrap-theme .col-lg-offset-10 {
+    margin-left: 83.3333333333%;
+  }
+  #bootstrap-theme .col-lg-offset-11 {
+    margin-left: 91.6666666667%;
+  }
+  #bootstrap-theme .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+}
+
+/* Table */
+
+#bootstrap-theme caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #999;
+  text-align: left;
+}
+
+/* Input */
+
+#bootstrap-theme legend {
+  position: initial;
+  text-transform: inherit;
+  float: none;
+}
+#bootstrap-theme input {
+  line-height: normal;
+}
+#bootstrap-theme input[type="number"]::-webkit-inner-spin-button,
+#bootstrap-theme input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+#bootstrap-theme input[type="search"]::-webkit-search-cancel-button,
+#bootstrap-theme input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+#bootstrap-theme textarea {
+  overflow: auto;
+}
+#bootstrap-theme optgroup {
+  font-weight: bold;
+}
+#bootstrap-theme .form-control[disabled],
+#bootstrap-theme .form-control[readonly],
+fieldset[disabled] #bootstrap-theme .form-control {
+  background-color: #eee;
+  opacity: 1;
+}
+#bootstrap-theme .form-control[disabled],
+fieldset[disabled] #bootstrap-theme .form-control {
+  cursor: not-allowed;
+}
+#bootstrap-theme textarea.form-control {
+  height: auto;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  #bootstrap-theme input[type="date"].form-control,
+  #bootstrap-theme input[type="time"].form-control,
+  #bootstrap-theme input[type="datetime-local"].form-control,
+  #bootstrap-theme input[type="month"].form-control {
+    line-height: 30px;
+  }
+  #bootstrap-theme input[type="date"].input-sm,
+  #bootstrap-theme .input-group-sm > input.form-control[type="date"],
+  #bootstrap-theme .input-group-sm > input.input-group-addon[type="date"],
+  #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="date"],
+  .input-group-sm #bootstrap-theme input[type="date"],
+  #bootstrap-theme input[type="time"].input-sm,
+  #bootstrap-theme .input-group-sm > input.form-control[type="time"],
+  #bootstrap-theme .input-group-sm > input.input-group-addon[type="time"],
+  #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="time"],
+  .input-group-sm #bootstrap-theme input[type="time"],
+  #bootstrap-theme input[type="datetime-local"].input-sm,
+  #bootstrap-theme .input-group-sm > input.form-control[type="datetime-local"],
+  #bootstrap-theme .input-group-sm > input.input-group-addon[type="datetime-local"],
+  #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="datetime-local"],
+  .input-group-sm #bootstrap-theme input[type="datetime-local"],
+  #bootstrap-theme input[type="month"].input-sm,
+  #bootstrap-theme .input-group-sm > input.form-control[type="month"],
+  #bootstrap-theme .input-group-sm > input.input-group-addon[type="month"],
+  #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="month"],
+  .input-group-sm #bootstrap-theme input[type="month"] {
+    line-height: 30px;
+  }
+  #bootstrap-theme input[type="date"].input-lg,
+  #bootstrap-theme .input-group-lg > input.form-control[type="date"],
+  #bootstrap-theme .input-group-lg > input.input-group-addon[type="date"],
+  #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="date"],
+  .input-group-lg #bootstrap-theme input[type="date"],
+  #bootstrap-theme input[type="time"].input-lg,
+  #bootstrap-theme .input-group-lg > input.form-control[type="time"],
+  #bootstrap-theme .input-group-lg > input.input-group-addon[type="time"],
+  #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="time"],
+  .input-group-lg #bootstrap-theme input[type="time"],
+  #bootstrap-theme input[type="datetime-local"].input-lg,
+  #bootstrap-theme .input-group-lg > input.form-control[type="datetime-local"],
+  #bootstrap-theme .input-group-lg > input.input-group-addon[type="datetime-local"],
+  #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="datetime-local"],
+  .input-group-lg #bootstrap-theme input[type="datetime-local"],
+  #bootstrap-theme input[type="month"].input-lg,
+  #bootstrap-theme .input-group-lg > input.form-control[type="month"],
+  #bootstrap-theme .input-group-lg > input.input-group-addon[type="month"],
+  #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="month"],
+  .input-group-lg #bootstrap-theme input[type="month"] {
+    line-height: 54px;
+  }
+}
+#bootstrap-theme .form-group {
+  margin-bottom: 15px;
+}
+#bootstrap-theme .form-control-static {
+  min-height: 34px;
+  padding-top: 5px;
+  padding-bottom: 5px;
+  margin-bottom: 0;
+}
+#bootstrap-theme .form-control-static.input-lg,
+#bootstrap-theme .input-group-lg > .form-control-static.form-control,
+#bootstrap-theme .input-group-lg > .form-control-static.input-group-addon,
+#bootstrap-theme .input-group-lg > .input-group-btn > .form-control-static.btn,
+#bootstrap-theme .form-control-static.input-sm,
+#bootstrap-theme .input-group-sm > .form-control-static.form-control,
+#bootstrap-theme .input-group-sm > .form-control-static.input-group-addon,
+#bootstrap-theme .input-group-sm > .input-group-btn > .form-control-static.btn {
+  padding-right: 0;
+  padding-left: 0;
+}
+#bootstrap-theme .input-sm,
+#bootstrap-theme .input-group-sm > .form-control,
+#bootstrap-theme .input-group-sm > .input-group-addon,
+#bootstrap-theme .input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+#bootstrap-theme select.input-sm,
+#bootstrap-theme .input-group-sm > select.form-control,
+#bootstrap-theme .input-group-sm > select.input-group-addon,
+#bootstrap-theme .input-group-sm > .input-group-btn > select.btn {
+  height: 30px;
+  line-height: 30px;
+}
+#bootstrap-theme textarea.input-sm,
+#bootstrap-theme .input-group-sm > textarea.form-control,
+#bootstrap-theme .input-group-sm > textarea.input-group-addon,
+#bootstrap-theme .input-group-sm > .input-group-btn > textarea.btn,
+#bootstrap-theme select[multiple].input-sm,
+#bootstrap-theme .input-group-sm > select.form-control[multiple],
+#bootstrap-theme .input-group-sm > select.input-group-addon[multiple],
+#bootstrap-theme .input-group-sm > .input-group-btn > select.btn[multiple] {
+  height: auto;
+}
+#bootstrap-theme .form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+#bootstrap-theme .form-group-sm select.form-control {
+  height: 30px;
+  line-height: 30px;
+}
+#bootstrap-theme .form-group-sm textarea.form-control,
+#bootstrap-theme .form-group-sm select[multiple].form-control {
+  height: auto;
+}
+#bootstrap-theme .form-group-sm .form-control-static {
+  height: 30px;
+  min-height: 32px;
+  padding: 6px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+#bootstrap-theme .input-lg,
+#bootstrap-theme .input-group-lg > .form-control,
+#bootstrap-theme .input-group-lg > .input-group-addon,
+#bootstrap-theme .input-group-lg > .input-group-btn > .btn {
+  height: 54px;
+  padding: 14px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+#bootstrap-theme select.input-lg,
+#bootstrap-theme .input-group-lg > select.form-control,
+#bootstrap-theme .input-group-lg > select.input-group-addon,
+#bootstrap-theme .input-group-lg > .input-group-btn > select.btn {
+  height: 54px;
+  line-height: 54px;
+}
+#bootstrap-theme textarea.input-lg,
+#bootstrap-theme .input-group-lg > textarea.form-control,
+#bootstrap-theme .input-group-lg > textarea.input-group-addon,
+#bootstrap-theme .input-group-lg > .input-group-btn > textarea.btn,
+#bootstrap-theme select[multiple].input-lg,
+#bootstrap-theme .input-group-lg > select.form-control[multiple],
+#bootstrap-theme .input-group-lg > select.input-group-addon[multiple],
+#bootstrap-theme .input-group-lg > .input-group-btn > select.btn[multiple] {
+  height: auto;
+}
+#bootstrap-theme .form-group-lg .form-control {
+  height: 54px;
+  padding: 14px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+#bootstrap-theme .form-group-lg select.form-control {
+  height: 54px;
+  line-height: 54px;
+}
+#bootstrap-theme .form-group-lg textarea.form-control,
+#bootstrap-theme .form-group-lg select[multiple].form-control {
+  height: auto;
+}
+#bootstrap-theme .form-group-lg .form-control-static {
+  height: 54px;
+  min-height: 38px;
+  padding: 15px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+#bootstrap-theme .has-feedback {
+  position: relative;
+}
+#bootstrap-theme .has-feedback .form-control {
+  padding-right: 37.5px;
+}
+#bootstrap-theme .form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+  text-align: center;
+  pointer-events: none;
+}
+#bootstrap-theme .input-lg + .form-control-feedback,
+#bootstrap-theme .input-group-lg > .form-control + .form-control-feedback,
+#bootstrap-theme .input-group-lg > .input-group-addon + .form-control-feedback,
+#bootstrap-theme .input-group-lg > .input-group-btn > .btn + .form-control-feedback,
+#bootstrap-theme .input-group-lg + .form-control-feedback,
+#bootstrap-theme .form-group-lg .form-control + .form-control-feedback {
+  width: 54px;
+  height: 54px;
+  line-height: 54px;
+}
+#bootstrap-theme .input-sm + .form-control-feedback,
+#bootstrap-theme .input-group-sm > .form-control + .form-control-feedback,
+#bootstrap-theme .input-group-sm > .input-group-addon + .form-control-feedback,
+#bootstrap-theme .input-group-sm > .input-group-btn > .btn + .form-control-feedback,
+#bootstrap-theme .input-group-sm + .form-control-feedback,
+#bootstrap-theme .form-group-sm .form-control + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+#bootstrap-theme .has-feedback label ~ .form-control-feedback {
+  top: 25px;
+}
+#bootstrap-theme .has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .form-inline .form-control {
+    display: inline-block;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .form-inline .form-control-static {
+    display: inline-block;
+  }
+  #bootstrap-theme .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .form-inline .input-group .input-group-addon,
+  #bootstrap-theme .form-inline .input-group .input-group-btn,
+  #bootstrap-theme .form-inline .input-group .form-control {
+    width: auto;
+  }
+  #bootstrap-theme .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  #bootstrap-theme .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .form-inline .radio,
+  #bootstrap-theme .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .form-inline .radio label,
+  #bootstrap-theme .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  #bootstrap-theme .form-inline .radio input[type="radio"],
+  #bootstrap-theme .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  #bootstrap-theme .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+#bootstrap-theme .form-horizontal .radio,
+#bootstrap-theme .form-horizontal .checkbox,
+#bootstrap-theme .form-horizontal .radio-inline,
+#bootstrap-theme .form-horizontal .checkbox-inline {
+  padding-top: 5px;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+#bootstrap-theme .form-horizontal .radio,
+#bootstrap-theme .form-horizontal .checkbox {
+  min-height: 25px;
+}
+#bootstrap-theme .form-horizontal .form-group {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+#bootstrap-theme .form-horizontal .form-group:before,
+#bootstrap-theme .form-horizontal .form-group:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .form-horizontal .form-group:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .form-horizontal .control-label {
+    padding-top: 5px;
+    margin-bottom: 0;
+    text-align: right;
+  }
+}
+#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback {
+  right: 15px;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .form-horizontal .form-group-lg .control-label {
+    padding-top: 15px;
+    font-size: 18px;
+  }
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+    font-size: 12px;
+  }
+}
+#bootstrap-theme .fade {
+  opacity: 0;
+  transition: opacity .15s linear;
+}
+#bootstrap-theme .fade.in {
+  opacity: 1;
+}
+#bootstrap-theme [data-toggle="buttons"] > .btn input[type="radio"],
+#bootstrap-theme [data-toggle="buttons"] > .btn input[type="checkbox"],
+#bootstrap-theme [data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+#bootstrap-theme [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+#bootstrap-theme .input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+#bootstrap-theme .input-group[class*="col-"] {
+  float: none;
+  padding-right: 0;
+  padding-left: 0;
+}
+#bootstrap-theme .input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+#bootstrap-theme .input-group .form-control:focus {
+  z-index: 3;
+}
+#bootstrap-theme .input-group-addon,
+#bootstrap-theme .input-group-btn,
+#bootstrap-theme .input-group .form-control {
+  display: table-cell;
+}
+#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child),
+#bootstrap-theme .input-group-btn:not(:first-child):not(:last-child),
+#bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+#bootstrap-theme .input-group-addon,
+#bootstrap-theme .input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+#bootstrap-theme .input-group-addon.input-sm,
+#bootstrap-theme .input-group-sm > .input-group-addon.form-control,
+#bootstrap-theme .input-group-sm > .input-group-addon,
+#bootstrap-theme .input-group-sm > .input-group-btn > .input-group-addon.btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+#bootstrap-theme .input-group-addon.input-lg,
+#bootstrap-theme .input-group-lg > .input-group-addon.form-control,
+#bootstrap-theme .input-group-lg > .input-group-addon,
+#bootstrap-theme .input-group-lg > .input-group-btn > .input-group-addon.btn {
+  padding: 14px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+#bootstrap-theme .input-group-addon input[type="radio"],
+#bootstrap-theme .input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+#bootstrap-theme .input-group .form-control:first-child,
+#bootstrap-theme .input-group-addon:first-child,
+#bootstrap-theme .input-group-btn:first-child > .btn,
+#bootstrap-theme .input-group-btn:first-child > .btn-group > .btn,
+#bootstrap-theme .input-group-btn:first-child > .dropdown-toggle,
+#bootstrap-theme .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+#bootstrap-theme .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+#bootstrap-theme .input-group-addon:first-child {
+  border-right: 0;
+}
+#bootstrap-theme .input-group .form-control:last-child,
+#bootstrap-theme .input-group-addon:last-child,
+#bootstrap-theme .input-group-btn:last-child > .btn,
+#bootstrap-theme .input-group-btn:last-child > .btn-group > .btn,
+#bootstrap-theme .input-group-btn:last-child > .dropdown-toggle,
+#bootstrap-theme .input-group-btn:first-child > .btn:not(:first-child),
+#bootstrap-theme .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+#bootstrap-theme .input-group-addon:last-child {
+  border-left: 0;
+}
+
+/* Button */
+
+#bootstrap-theme button,
+#bootstrap-theme html input[type="button"],
+#bootstrap-theme input[type="reset"],
+#bootstrap-theme input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: var(--crm-hover-clickable);
+}
+#bootstrap-theme button[disabled],
+#bootstrap-theme html input[disabled] {
+  cursor: default;
+}
+#bootstrap-theme button::-moz-focus-inner,
+#bootstrap-theme input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+#bootstrap-theme [role="button"] {
+  cursor: var(--crm-hover-clickable);
+}
+#bootstrap-theme .input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+#bootstrap-theme .input-group-btn > .btn {
+  position: relative;
+}
+#bootstrap-theme .input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+#bootstrap-theme .input-group-btn > .btn:hover,
+#bootstrap-theme .input-group-btn > .btn:focus,
+#bootstrap-theme .input-group-btn > .btn:active {
+  z-index: 2;
+}
+#bootstrap-theme .input-group-btn:first-child > .btn,
+#bootstrap-theme .input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+#bootstrap-theme .input-group-btn:last-child > .btn,
+#bootstrap-theme .input-group-btn:last-child > .btn-group {
+  z-index: 2;
+  margin-left: -1px;
+}
+#bootstrap-theme .btn-link {
+  font-weight: 400;
+  color: var(--crm-c-link);
+  border-radius: 0;
+}
+#bootstrap-theme .btn-link,
+#bootstrap-theme .btn-link:active,
+#bootstrap-theme .btn-link.active,
+#bootstrap-theme .btn-link[disabled],
+fieldset[disabled] #bootstrap-theme .btn-link {
+  background-color: transparent;
+  box-shadow: none;
+}
+#bootstrap-theme .btn-link,
+#bootstrap-theme .btn-link:hover,
+#bootstrap-theme .btn-link:focus,
+#bootstrap-theme .btn-link:active {
+  border-color: transparent;
+}
+#bootstrap-theme .btn-link:hover,
+#bootstrap-theme .btn-link:focus {
+  color: var(--crm-c-link-hover);
+  text-decoration: var(--crm-link-decoration);
+  background-color: transparent;
+}
+#bootstrap-theme .btn-link[disabled]:hover,
+#bootstrap-theme .btn-link[disabled]:focus,
+fieldset[disabled] #bootstrap-theme .btn-link:hover,
+fieldset[disabled] #bootstrap-theme .btn-link:focus {
+  color: var(--crm-c-gray-800);
+  text-decoration: none;
+}
+#bootstrap-theme .input-group-addon {
+  padding: var(--crm-input-padding);
+  font-size: var(--crm-input-font-size);
+  font-weight: normal;
+  line-height: inherit;
+  color: var(--crm-input-color);
+  text-align: left;
+  background-color: var(--crm-input-background);
+  /* width: 100%; */
+  border-radius: var(--crm-roundness);
+}
+#bootstrap-theme .has-success .form-control {
+  border-color: var(--crm-c-green-dark);
+}
+#bootstrap-theme .has-success .form-control:focus {
+  border-color: var(--crm-c-green-dark);
+}
+#bootstrap-theme .has-success .input-group-addon {
+  color: var(--crm-c-green-dark);
+  background-color: var(--crm-c-green-light);
+  border-color: var(--crm-c-green);
+}
+#bootstrap-theme .has-success .form-control-feedback {
+  color: var(--crm-c-green);
+}
+#bootstrap-theme .has-warning .form-control {
+  border-color: var(--crm-c-warning);
+}
+#bootstrap-theme .has-warning .form-control:focus {
+  border-color: var(--crm-c-warning);
+}
+#bootstrap-theme .has-warning .input-group-addon {
+  color: var(--crm-c-warning);
+  background-color: var(--crm-c-amber-light);
+  border-color: var(--crm-c-warning);
+}
+#bootstrap-theme .has-warning .form-control-feedback {
+  color: var(--crm-c-warning);
+}
+#bootstrap-theme .has-error .form-control,
+#bootstrap-theme .has-error .form-control a.select2-default {
+  border-color: var(--crm-c-alert);
+}
+#bootstrap-theme .has-error .form-control:focus {
+  border-color: var(--crm-c-alert);
+}
+#bootstrap-theme .has-error .input-group-addon {
+  color: var(--crm-c-alert);
+  background-color: # var(--crm-c-red-light);
+  border-color: var(--crm-c-alert);
+}
+#bootstrap-theme .has-error .form-control-feedback {
+  color: var(--crm-c-alert);
+}
+
+/* Nav */
+
+#bootstrap-theme .navbar-default {
+  background-color: var(--crm-c-darkest);
+  border-color: var(--crm-c-darkest);
+  color: var(--crm-c-light-text);
+}
+#bootstrap-theme .nav-justified,
+#bootstrap-theme .nav-tabs.nav-justified {
+  width: 100%;
+}
+#bootstrap-theme .nav-justified > li,
+#bootstrap-theme .nav-tabs.nav-justified > li {
+  float: none;
+}
+#bootstrap-theme .nav-justified > li > a,
+#bootstrap-theme .nav-tabs.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+#bootstrap-theme .nav-justified > .dropdown .dropdown-menu,
+#bootstrap-theme .nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .nav-justified > li,
+  #bootstrap-theme .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  #bootstrap-theme .nav-justified > li > a,
+  #bootstrap-theme .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+#bootstrap-theme .nav-tabs-justified,
+#bootstrap-theme .nav-tabs.nav-justified {
+  border-bottom: 0;
+}
+#bootstrap-theme .nav-tabs-justified > li > a,
+#bootstrap-theme .nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+#bootstrap-theme .nav-tabs-justified > .active > a,
+#bootstrap-theme .nav-tabs.nav-justified > .active > a,
+#bootstrap-theme .nav-tabs-justified > .active > a:hover,
+#bootstrap-theme .nav-tabs.nav-justified > .active > a:hover,
+#bootstrap-theme .nav-tabs-justified > .active > a:focus,
+#bootstrap-theme .nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .nav-tabs-justified > li > a,
+  #bootstrap-theme .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  #bootstrap-theme .nav-tabs-justified > .active > a,
+  #bootstrap-theme .nav-tabs.nav-justified > .active > a,
+  #bootstrap-theme .nav-tabs-justified > .active > a:hover,
+  #bootstrap-theme .nav-tabs.nav-justified > .active > a:hover,
+  #bootstrap-theme .nav-tabs-justified > .active > a:focus,
+  #bootstrap-theme .nav-tabs.nav-justified > .active > a:focus {
+    border-bottom-color: white;
+  }
+}
+#bootstrap-theme .tab-content > .tab-pane {
+  display: none;
+}
+#bootstrap-theme .tab-content > .active {
+  display: block;
+}
+#bootstrap-theme .nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+#bootstrap-theme .navbar {
+  position: relative;
+  min-height: 50px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+}
+#bootstrap-theme .navbar:before,
+#bootstrap-theme .navbar:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .navbar:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar {
+    border-radius: 4px;
+  }
+}
+#bootstrap-theme .navbar-header:before,
+#bootstrap-theme .navbar-header:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .navbar-header:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-header {
+    float: left;
+  }
+}
+#bootstrap-theme .navbar-collapse {
+  padding-right: 15px;
+  padding-left: 15px;
+  overflow-x: visible;
+  border-top: 1px solid transparent;
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+  -webkit-overflow-scrolling: touch;
+}
+#bootstrap-theme .navbar-collapse:before,
+#bootstrap-theme .navbar-collapse:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .navbar-collapse:after {
+  clear: both;
+}
+#bootstrap-theme .navbar-collapse.in {
+  overflow-y: auto;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    box-shadow: none;
+  }
+  #bootstrap-theme .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  #bootstrap-theme .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top #bootstrap-theme .navbar-collapse,
+  .navbar-static-top #bootstrap-theme .navbar-collapse,
+  .navbar-fixed-bottom #bootstrap-theme .navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+#bootstrap-theme .navbar-fixed-top,
+#bootstrap-theme .navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+#bootstrap-theme .navbar-fixed-top .navbar-collapse,
+#bootstrap-theme .navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+  #bootstrap-theme .navbar-fixed-top .navbar-collapse,
+  #bootstrap-theme .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-fixed-top,
+  #bootstrap-theme .navbar-fixed-bottom {
+    border-radius: 0;
+  }
+}
+#bootstrap-theme .navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+#bootstrap-theme .navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0;
+}
+#bootstrap-theme .container > .navbar-header,
+#bootstrap-theme .container > .navbar-collapse,
+#bootstrap-theme .container-fluid > .navbar-header,
+#bootstrap-theme .container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .container > .navbar-header,
+  #bootstrap-theme .container > .navbar-collapse,
+  #bootstrap-theme .container-fluid > .navbar-header,
+  #bootstrap-theme .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+#bootstrap-theme .navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-static-top {
+    border-radius: 0;
+  }
+}
+#bootstrap-theme .navbar-brand {
+  float: left;
+  height: 50px;
+  padding: 15px 15px;
+  font-size: 18px;
+  line-height: 20px;
+}
+#bootstrap-theme .navbar-brand:hover,
+#bootstrap-theme .navbar-brand:focus {
+  text-decoration: none;
+}
+#bootstrap-theme .navbar-brand > img {
+  display: block;
+}
+@media (min-width: 768px) {
+  .navbar > .container #bootstrap-theme .navbar-brand,
+  .navbar > .container-fluid #bootstrap-theme .navbar-brand {
+    margin-left: -15px;
+  }
+}
+#bootstrap-theme .navbar-toggle {
+  position: relative;
+  float: right;
+  padding: 9px 10px;
+  margin-right: 15px;
+  margin-top: 8px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+#bootstrap-theme .navbar-toggle:focus {
+  outline: 0;
+}
+#bootstrap-theme .navbar-toggle .icon-bar {
+  display: block;
+  width: 22px;
+  height: 2px;
+  border-radius: 1px;
+}
+#bootstrap-theme .navbar-toggle .icon-bar + .icon-bar {
+  margin-top: 4px;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-toggle {
+    display: none;
+  }
+}
+#bootstrap-theme .navbar-nav {
+  margin: 7.5px -15px;
+}
+#bootstrap-theme .navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 20px;
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .navbar-nav .open .dropdown-menu {
+    position: static;
+    float: none;
+    width: auto;
+    margin-top: 0;
+    background-color: transparent;
+    border: 0;
+    box-shadow: none;
+  }
+  #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a,
+  #bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 15px 5px 25px;
+  }
+  #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 20px;
+  }
+  #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a:hover,
+  #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a:focus {
+    background-image: none;
+  }
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-nav {
+    float: left;
+    margin: 0;
+  }
+  #bootstrap-theme .navbar-nav > li {
+    float: left;
+  }
+  #bootstrap-theme .navbar-nav > li > a {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+}
+#bootstrap-theme .navbar-form {
+  padding: 10px 15px;
+  margin-right: -15px;
+  margin-left: -15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .navbar-form .form-control-static {
+    display: inline-block;
+  }
+  #bootstrap-theme .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .navbar-form .input-group .input-group-addon,
+  #bootstrap-theme .navbar-form .input-group .input-group-btn,
+  #bootstrap-theme .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  #bootstrap-theme .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  #bootstrap-theme .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .navbar-form .radio,
+  #bootstrap-theme .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  #bootstrap-theme .navbar-form .radio label,
+  #bootstrap-theme .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  #bootstrap-theme .navbar-form .radio input[type="radio"],
+  #bootstrap-theme .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  #bootstrap-theme .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .navbar-form .form-group {
+    margin-bottom: 5px;
+  }
+  #bootstrap-theme .navbar-form .form-group:last-child {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-form {
+    width: auto;
+    padding-top: 0;
+    padding-bottom: 0;
+    margin-right: 0;
+    margin-left: 0;
+    border: 0;
+    box-shadow: none;
+  }
+}
+#bootstrap-theme .navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+#bootstrap-theme .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+#bootstrap-theme .navbar-btn {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+#bootstrap-theme .navbar-btn.btn-sm,
+#bootstrap-theme .btn-group-sm > .navbar-btn.btn {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+#bootstrap-theme .navbar-btn.btn-xs,
+#bootstrap-theme .btn-group-xs > .navbar-btn.btn {
+  margin-top: 14px;
+  margin-bottom: 14px;
+}
+#bootstrap-theme .navbar-text {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-text {
+    float: left;
+    margin-right: 15px;
+    margin-left: 15px;
+  }
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .navbar-left {
+    float: left !important;
+  }
+  #bootstrap-theme .navbar-right {
+    float: right !important;
+    margin-right: -15px;
+  }
+  #bootstrap-theme .navbar-right ~ .navbar-right {
+    margin-right: 0;
+  }
+}
+#bootstrap-theme .navbar-default .navbar-brand {
+  color: white;
+}
+#bootstrap-theme .navbar-default .navbar-brand:hover,
+#bootstrap-theme .navbar-default .navbar-brand:focus {
+  color: white;
+  background-color: none;
+}
+#bootstrap-theme .navbar-default .navbar-text {
+  color: #ddd;
+}
+#bootstrap-theme .navbar-default .navbar-nav > li > a {
+  color: white;
+}
+#bootstrap-theme .navbar-default .navbar-nav > li > a:hover,
+#bootstrap-theme .navbar-default .navbar-nav > li > a:focus {
+  color: white;
+  background-color: black;
+}
+#bootstrap-theme .navbar-default .navbar-nav > .active > a,
+#bootstrap-theme .navbar-default .navbar-nav > .active > a:hover,
+#bootstrap-theme .navbar-default .navbar-nav > .active > a:focus {
+  color: white;
+  background-color: black;
+}
+#bootstrap-theme .navbar-default .navbar-nav > .disabled > a,
+#bootstrap-theme .navbar-default .navbar-nav > .disabled > a:hover,
+#bootstrap-theme .navbar-default .navbar-nav > .disabled > a:focus {
+  color: #ddd;
+  background-color: transparent;
+}
+#bootstrap-theme .navbar-default .navbar-nav > .open > a,
+#bootstrap-theme .navbar-default .navbar-nav > .open > a:hover,
+#bootstrap-theme .navbar-default .navbar-nav > .open > a:focus {
+  color: white;
+  background-color: black;
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: white;
+  }
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: white;
+    background-color: black;
+  }
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: white;
+    background-color: black;
+  }
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #ddd;
+    background-color: transparent;
+  }
+}
+#bootstrap-theme .navbar-default .navbar-toggle {
+  border-color: black;
+}
+#bootstrap-theme .navbar-default .navbar-toggle:hover,
+#bootstrap-theme .navbar-default .navbar-toggle:focus {
+  background-color: black;
+}
+#bootstrap-theme .navbar-default .navbar-toggle .icon-bar {
+  background-color: white;
+}
+#bootstrap-theme .navbar-default .navbar-collapse,
+#bootstrap-theme .navbar-default .navbar-form {
+  border-color: black;
+}
+#bootstrap-theme .navbar-default .navbar-link {
+  color: white;
+}
+#bootstrap-theme .navbar-default .navbar-link:hover {
+  color: white;
+}
+#bootstrap-theme .navbar-default .btn-link {
+  color: white;
+}
+#bootstrap-theme .navbar-default .btn-link:hover,
+#bootstrap-theme .navbar-default .btn-link:focus {
+  color: white;
+}
+#bootstrap-theme .navbar-default .btn-link[disabled]:hover,
+#bootstrap-theme .navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover,
+fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus {
+  color: #ddd;
+}
+#bootstrap-theme .navbar-inverse {
+  background-color: #cde8fe;
+  border-color: #b4ddfe;
+}
+#bootstrap-theme .navbar-inverse .navbar-brand {
+  color: white;
+}
+#bootstrap-theme .navbar-inverse .navbar-brand:hover,
+#bootstrap-theme .navbar-inverse .navbar-brand:focus {
+  color: white;
+  background-color: none;
+}
+#bootstrap-theme .navbar-inverse .navbar-text {
+  color: white;
+}
+#bootstrap-theme .navbar-inverse .navbar-nav > li > a {
+  color: white;
+}
+#bootstrap-theme .navbar-inverse .navbar-nav > li > a:hover,
+#bootstrap-theme .navbar-inverse .navbar-nav > li > a:focus {
+  color: white;
+  background-color: #b4ddfe;
+}
+#bootstrap-theme .navbar-inverse .navbar-nav > .active > a,
+#bootstrap-theme .navbar-inverse .navbar-nav > .active > a:hover,
+#bootstrap-theme .navbar-inverse .navbar-nav > .active > a:focus {
+  color: white;
+  background-color: #b4ddfe;
+}
+#bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a,
+#bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a:hover,
+#bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #ccc;
+  background-color: transparent;
+}
+#bootstrap-theme .navbar-inverse .navbar-nav > .open > a,
+#bootstrap-theme .navbar-inverse .navbar-nav > .open > a:hover,
+#bootstrap-theme .navbar-inverse .navbar-nav > .open > a:focus {
+  color: white;
+  background-color: #b4ddfe;
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: #b4ddfe;
+  }
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: #b4ddfe;
+  }
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: white;
+  }
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: white;
+    background-color: #b4ddfe;
+  }
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: white;
+    background-color: #b4ddfe;
+  }
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #ccc;
+    background-color: transparent;
+  }
+}
+#bootstrap-theme .navbar-inverse .navbar-toggle {
+  border-color: #b4ddfe;
+}
+#bootstrap-theme .navbar-inverse .navbar-toggle:hover,
+#bootstrap-theme .navbar-inverse .navbar-toggle:focus {
+  background-color: #b4ddfe;
+}
+#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar {
+  background-color: white;
+}
+#bootstrap-theme .navbar-inverse .navbar-collapse,
+#bootstrap-theme .navbar-inverse .navbar-form {
+  border-color: #aad8fd;
+}
+#bootstrap-theme .navbar-inverse .navbar-link {
+  color: white;
+}
+#bootstrap-theme .navbar-inverse .navbar-link:hover {
+  color: white;
+}
+#bootstrap-theme .navbar-inverse .btn-link {
+  color: white;
+}
+#bootstrap-theme .navbar-inverse .btn-link:hover,
+#bootstrap-theme .navbar-inverse .btn-link:focus {
+  color: white;
+}
+#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover,
+#bootstrap-theme .navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover,
+fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus {
+  color: #ccc;
+}
+
+/* Breadcrumb */
+
+#bootstrap-theme .breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: whitesmoke;
+  border-radius: 4px;
+}
+#bootstrap-theme .breadcrumb > li {
+  display: inline-block;
+}
+#bootstrap-theme .breadcrumb > li + li:before {
+  padding: 0 5px;
+  color: #ccc;
+  content: "/ ";
+}
+#bootstrap-theme .breadcrumb > .active {
+  color: #999;
+}
+
+/* Pager */
+
+#bootstrap-theme .pager {
+  padding-left: 0;
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+}
+#bootstrap-theme .pager:before,
+#bootstrap-theme .pager:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .pager:after {
+  clear: both;
+}
+#bootstrap-theme .pager li {
+  display: inline;
+}
+#bootstrap-theme .pager li > a,
+#bootstrap-theme .pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: white;
+  border: 1px solid #ddd;
+  border-radius: 15px;
+}
+#bootstrap-theme .pager li > a:hover,
+#bootstrap-theme .pager li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+#bootstrap-theme .pager .next > a,
+#bootstrap-theme .pager .next > span {
+  float: right;
+}
+#bootstrap-theme .pager .previous > a,
+#bootstrap-theme .pager .previous > span {
+  float: left;
+}
+#bootstrap-theme .pager .disabled > a,
+#bootstrap-theme .pager .disabled > a:hover,
+#bootstrap-theme .pager .disabled > a:focus,
+#bootstrap-theme .pager .disabled > span {
+  color: #999;
+  cursor: not-allowed;
+  background-color: white;
+}
+
+/* Jumbotron */
+
+#bootstrap-theme .jumbotron {
+  padding-top: 30px;
+  padding-bottom: 30px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: var(--crm-c-background);
+}
+#bootstrap-theme .jumbotron h1,
+#bootstrap-theme .jumbotron .h1 {
+  color: inherit;
+}
+#bootstrap-theme .jumbotron p {
+  margin-bottom: 15px;
+  font-size: 21px;
+  font-weight: 200;
+}
+#bootstrap-theme .jumbotron > hr {
+  border-top-color: #d5d5d5;
+}
+.container #bootstrap-theme .jumbotron,
+.container-fluid #bootstrap-theme .jumbotron {
+  padding-right: 15px;
+  padding-left: 15px;
+  border-radius: 6px;
+}
+#bootstrap-theme .jumbotron .container {
+  max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+  #bootstrap-theme .jumbotron {
+    padding-top: 48px;
+    padding-bottom: 48px;
+  }
+  .container #bootstrap-theme .jumbotron,
+  .container-fluid #bootstrap-theme .jumbotron {
+    padding-right: 60px;
+    padding-left: 60px;
+  }
+  #bootstrap-theme .jumbotron h1,
+  #bootstrap-theme .jumbotron .h1 {
+    font-size: 63px;
+  }
+}
+
+/* Progress bar */
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+#bootstrap-theme .progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: whitesmoke;
+  border-radius: var(--crm-c-roundness);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+#bootstrap-theme .progress-bar {
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: 12px;
+  line-height: 20px;
+  color: white;
+  text-align: center;
+  background-color: black;
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+  transition: width .6s ease;
+}
+#bootstrap-theme .progress-striped .progress-bar,
+#bootstrap-theme .progress-bar-striped {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-size: 40px 40px;
+}
+#bootstrap-theme .progress.active .progress-bar,
+#bootstrap-theme .progress-bar.active {
+  animation: progress-bar-stripes 2s linear infinite;
+}
+#bootstrap-theme .progress-bar-success {
+  background-color: var(--crm-c-success);
+}
+.progress-striped #bootstrap-theme .progress-bar-success {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+#bootstrap-theme .progress-bar-info {
+  background-color: var(--crm-c-info);
+}
+.progress-striped #bootstrap-theme .progress-bar-info {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+#bootstrap-theme .progress-bar-warning {
+  background-color: var(--crm-c-warning);
+}
+.progress-striped #bootstrap-theme .progress-bar-warning {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+#bootstrap-theme .progress-bar-danger {
+  background-color: var(--crm-c-alert);
+}
+.progress-striped #bootstrap-theme .progress-bar-danger {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+
+/* Media */
+
+#bootstrap-theme .media {
+  margin-top: 15px;
+}
+#bootstrap-theme .media:first-child {
+  margin-top: 0;
+}
+#bootstrap-theme .media,
+#bootstrap-theme .media-body {
+  overflow: hidden;
+  zoom: 1;
+}
+#bootstrap-theme .media-body {
+  width: 10000px;
+}
+#bootstrap-theme .media-object {
+  display: block;
+}
+#bootstrap-theme .media-object.img-thumbnail {
+  max-width: none;
+}
+#bootstrap-theme .media-right,
+#bootstrap-theme .media > .pull-right {
+  padding-left: 10px;
+}
+#bootstrap-theme .media-left,
+#bootstrap-theme .media > .pull-left {
+  padding-right: 10px;
+}
+#bootstrap-theme .media-left,
+#bootstrap-theme .media-right,
+#bootstrap-theme .media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+#bootstrap-theme .media-middle {
+  vertical-align: middle;
+}
+#bootstrap-theme .media-bottom {
+  vertical-align: bottom;
+}
+#bootstrap-theme .media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+#bootstrap-theme .media-list {
+  padding-left: 0;
+  list-style: none;
+}
+#bootstrap-theme audio,
+#bootstrap-theme canvas,
+#bootstrap-theme progress,
+#bootstrap-theme video {
+  display: inline-block;
+  vertical-align: baseline;
+}
+#bootstrap-theme audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+
+/* List group */
+
+#bootstrap-theme .list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+#bootstrap-theme .list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: white;
+  border: 1px solid #ddd;
+}
+#bootstrap-theme .list-group-item:first-child {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+#bootstrap-theme .list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+#bootstrap-theme .list-group-item.disabled,
+#bootstrap-theme .list-group-item.disabled:hover,
+#bootstrap-theme .list-group-item.disabled:focus {
+  color: #999;
+  cursor: not-allowed;
+  background-color: #eee;
+}
+#bootstrap-theme .list-group-item.disabled .list-group-item-heading,
+#bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading,
+#bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+#bootstrap-theme .list-group-item.disabled .list-group-item-text,
+#bootstrap-theme .list-group-item.disabled:hover .list-group-item-text,
+#bootstrap-theme .list-group-item.disabled:focus .list-group-item-text {
+  color: #999;
+}
+#bootstrap-theme .list-group-item.active,
+#bootstrap-theme .list-group-item.active:hover,
+#bootstrap-theme .list-group-item.active:focus {
+  z-index: 2;
+  color: white;
+  background-color: black;
+  border-color: black;
+}
+#bootstrap-theme .list-group-item.active .list-group-item-heading,
+#bootstrap-theme .list-group-item.active .list-group-item-heading > small,
+#bootstrap-theme .list-group-item.active .list-group-item-heading > .small,
+#bootstrap-theme .list-group-item.active:hover .list-group-item-heading,
+#bootstrap-theme .list-group-item.active:hover .list-group-item-heading > small,
+#bootstrap-theme .list-group-item.active:hover .list-group-item-heading > .small,
+#bootstrap-theme .list-group-item.active:focus .list-group-item-heading,
+#bootstrap-theme .list-group-item.active:focus .list-group-item-heading > small,
+#bootstrap-theme .list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+#bootstrap-theme .list-group-item.active .list-group-item-text,
+#bootstrap-theme .list-group-item.active:hover .list-group-item-text,
+#bootstrap-theme .list-group-item.active:focus .list-group-item-text {
+  color: #666;
+}
+#bootstrap-theme a.list-group-item,
+#bootstrap-theme button.list-group-item {
+  color: #555;
+}
+#bootstrap-theme a.list-group-item .list-group-item-heading,
+#bootstrap-theme button.list-group-item .list-group-item-heading {
+  color: #333;
+}
+#bootstrap-theme a.list-group-item:hover,
+#bootstrap-theme a.list-group-item:focus,
+#bootstrap-theme button.list-group-item:hover,
+#bootstrap-theme button.list-group-item:focus {
+  color: #555;
+  text-decoration: none;
+  background-color: var(--crm-c-background);
+}
+#bootstrap-theme button.list-group-item {
+  width: 100%;
+  text-align: left;
+}
+#bootstrap-theme a.list-group-item-success,
+#bootstrap-theme button.list-group-item-success {
+  color: var(--crm-alert-text-help);
+}
+#bootstrap-theme a.list-group-item-success .list-group-item-heading,
+#bootstrap-theme button.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+#bootstrap-theme .list-group-item-success,
+#bootstrap-theme a.list-group-item-success:hover,
+#bootstrap-theme a.list-group-item-success:focus,
+#bootstrap-theme button.list-group-item-success:hover,
+#bootstrap-theme button.list-group-item-success:focus {
+  color: var(--crm-alert-text-help);
+  background-color: var(--crm-alert-background-help);
+}
+#bootstrap-theme a.list-group-item-success.active,
+#bootstrap-theme a.list-group-item-success.active:hover,
+#bootstrap-theme a.list-group-item-success.active:focus,
+#bootstrap-theme button.list-group-item-success.active,
+#bootstrap-theme button.list-group-item-success.active:hover,
+#bootstrap-theme button.list-group-item-success.active:focus {
+  color: var(--crm-c-success-text);
+  background-color: var(--crm-c-success);
+  border-color: var(--crm-c-success);
+}
+#bootstrap-theme .list-group-item-info {
+  color: var(--crm-alert-text-info);
+  background-color: var(--crm-alert-background-info);
+}
+#bootstrap-theme a.list-group-item-info,
+#bootstrap-theme button.list-group-item-info {
+  color: var(--crm-alert-text-info);
+}
+#bootstrap-theme a.list-group-item-info .list-group-item-heading,
+#bootstrap-theme button.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+#bootstrap-theme a.list-group-item-info:hover,
+#bootstrap-theme a.list-group-item-info:focus,
+#bootstrap-theme button.list-group-item-info:hover,
+#bootstrap-theme button.list-group-item-info:focus {
+  color: var(--crm-alert-text-info);
+  background-color: var(--crm-alert-background-info);
+}
+#bootstrap-theme a.list-group-item-info.active,
+#bootstrap-theme a.list-group-item-info.active:hover,
+#bootstrap-theme a.list-group-item-info.active:focus,
+#bootstrap-theme button.list-group-item-info.active,
+#bootstrap-theme button.list-group-item-info.active:hover,
+#bootstrap-theme button.list-group-item-info.active:focus {
+  color: var(--crm-c-info-text);
+  background-color: var(--crm-c-info);
+  border-color: var(--crm-c-info);
+}
+#bootstrap-theme .list-group-item-warning {
+  color: var(--crm-alert-text-warning);
+  background-color: var(--crm-alert-background-warning);
+}
+#bootstrap-theme a.list-group-item-warning,
+#bootstrap-theme button.list-group-item-warning {
+  color: var(--crm-alert-text-warning);
+}
+#bootstrap-theme a.list-group-item-warning .list-group-item-heading,
+#bootstrap-theme button.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+#bootstrap-theme a.list-group-item-warning:hover,
+#bootstrap-theme a.list-group-item-warning:focus,
+#bootstrap-theme button.list-group-item-warning:hover,
+#bootstrap-theme button.list-group-item-warning:focus {
+  color: var(--crm-alert-text-warning);
+  background-color: var(--crm-alert-background-warning);
+}
+#bootstrap-theme a.list-group-item-warning.active,
+#bootstrap-theme a.list-group-item-warning.active:hover,
+#bootstrap-theme a.list-group-item-warning.active:focus,
+#bootstrap-theme button.list-group-item-warning.active,
+#bootstrap-theme button.list-group-item-warning.active:hover,
+#bootstrap-theme button.list-group-item-warning.active:focus {
+  color: var(--crm-c-warning-text);
+  background-color: var(--crm-c-warning);
+  border-color: var(--crm-c-warning);
+}
+#bootstrap-theme .list-group-item-danger {
+  color: var(--crm-alert-text-danger);
+  background-color: var(--crm-alert-background-danger);
+}
+#bootstrap-theme a.list-group-item-danger,
+#bootstrap-theme button.list-group-item-danger {
+  color: var(--crm-alert-text-danger);
+}
+#bootstrap-theme a.list-group-item-danger .list-group-item-heading,
+#bootstrap-theme button.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+#bootstrap-theme a.list-group-item-danger:hover,
+#bootstrap-theme a.list-group-item-danger:focus,
+#bootstrap-theme button.list-group-item-danger:hover,
+#bootstrap-theme button.list-group-item-danger:focus {
+  color: var(--crm-alert-text-danger);
+  background-color: var(--crm-alert-background-danger);
+}
+#bootstrap-theme a.list-group-item-danger.active,
+#bootstrap-theme a.list-group-item-danger.active:hover,
+#bootstrap-theme a.list-group-item-danger.active:focus,
+#bootstrap-theme button.list-group-item-danger.active,
+#bootstrap-theme button.list-group-item-danger.active:hover,
+#bootstrap-theme button.list-group-item-danger.active:focus {
+  color: var(--crm-c-alert-text);
+  background-color: var(--crm-c-alert);
+  border-color: var(--crm-c-alert);
+}
+#bootstrap-theme .list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+#bootstrap-theme .list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+
+/* Embed */
+
+#bootstrap-theme .embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+#bootstrap-theme .embed-responsive .embed-responsive-item,
+#bootstrap-theme .embed-responsive iframe,
+#bootstrap-theme .embed-responsive embed,
+#bootstrap-theme .embed-responsive object,
+#bootstrap-theme .embed-responsive video {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: 0;
+}
+#bootstrap-theme .embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+#bootstrap-theme .embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+
+/* Well */
+
+#bootstrap-theme .well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: var(--crm-c-background);
+  border: var(--crm-c-divider);
+  border-radius: var(--crm-c-roundness);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+#bootstrap-theme .well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, .15);
+}
+#bootstrap-theme .well-lg {
+  padding: 24px;
+  border-radius: 6px;
+}
+#bootstrap-theme .well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+
+/* Close */
+
+#bootstrap-theme .close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: black;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: .2;
+}
+#bootstrap-theme .close:hover,
+#bootstrap-theme .close:focus {
+  color: black;
+  text-decoration: none;
+  cursor: var(--crm-hover-clickable);
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+#bootstrap-theme button.close {
+  padding: 0;
+  cursor: var(--crm-hover-clickable);
+  background: transparent;
+  border: 0;
+  appearance: none;
+}
+
+/* Modal */
+
+#bootstrap-theme .modal-open {
+  overflow: hidden;
+}
+#bootstrap-theme .modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+#bootstrap-theme .modal.fade .modal-dialog {
+  transform: translate(0, -25%);
+  transition: transform .3s ease-out;
+}
+#bootstrap-theme .modal.in .modal-dialog {
+  transform: translate(0, 0);
+}
+#bootstrap-theme .modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+#bootstrap-theme .modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+#bootstrap-theme .modal-content {
+  position: relative;
+  background-color: white;
+  background-clip: padding-box;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+  outline: 0;
+}
+#bootstrap-theme .modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: black;
+}
+#bootstrap-theme .modal-backdrop.fade {
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+#bootstrap-theme .modal-backdrop.in {
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+#bootstrap-theme .modal-header {
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+}
+#bootstrap-theme .modal-header:before,
+#bootstrap-theme .modal-header:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .modal-header:after {
+  clear: both;
+}
+#bootstrap-theme .modal-header .close {
+  margin-top: -2px;
+}
+#bootstrap-theme .modal-title {
+  margin: 0;
+  line-height: 1.428571429;
+}
+#bootstrap-theme .modal-body {
+  position: relative;
+  padding: 20px;
+}
+#bootstrap-theme .modal-footer {
+  padding: 20px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
+}
+#bootstrap-theme .modal-footer:before,
+#bootstrap-theme .modal-footer:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .modal-footer:after {
+  clear: both;
+}
+#bootstrap-theme .modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+#bootstrap-theme .modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+#bootstrap-theme .modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+#bootstrap-theme .modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+@media (min-width: 768px) {
+  #bootstrap-theme .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  #bootstrap-theme .modal-content {
+    box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+  }
+  #bootstrap-theme .modal-sm {
+    width: 300px;
+  }
+}
+@media (min-width: 992px) {
+  #bootstrap-theme .modal-lg {
+    width: 900px;
+  }
+}
+
+/* Tooltip */
+
+#bootstrap-theme .tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.428571429;
+  line-break: auto;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  -ms-word-break: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  font-size: 12px;
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+#bootstrap-theme .tooltip.in {
+  filter: alpha(opacity=90);
+  opacity: .9;
+}
+#bootstrap-theme .tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+#bootstrap-theme .tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+#bootstrap-theme .tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+#bootstrap-theme .tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+#bootstrap-theme .tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: black;
+}
+#bootstrap-theme .tooltip.top-left .tooltip-arrow {
+  right: 5px;
+  bottom: 0;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: black;
+}
+#bootstrap-theme .tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: black;
+}
+#bootstrap-theme .tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: black;
+}
+#bootstrap-theme .tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: black;
+}
+#bootstrap-theme .tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: black;
+}
+#bootstrap-theme .tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: black;
+}
+#bootstrap-theme .tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: black;
+}
+#bootstrap-theme .tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: white;
+  text-align: center;
+  background-color: black;
+  border-radius: 4px;
+}
+#bootstrap-theme .tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+/* Popover */
+#bootstrap-theme .popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-style: normal;
+  line-height: 1.428571429;
+  line-break: auto;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  font-size: 14px;
+  background-color: white;
+  background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+}
+#bootstrap-theme .popover.top {
+  margin-top: -10px;
+}
+#bootstrap-theme .popover.right {
+  margin-left: 10px;
+}
+#bootstrap-theme .popover.bottom {
+  margin-top: 10px;
+}
+#bootstrap-theme .popover.left {
+  margin-left: -10px;
+}
+#bootstrap-theme .popover > .arrow {
+  border-width: 11px;
+}
+#bootstrap-theme .popover > .arrow,
+#bootstrap-theme .popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+#bootstrap-theme .popover > .arrow:after {
+  content: "";
+  border-width: 10px;
+}
+#bootstrap-theme .popover.top > .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, .25);
+  border-bottom-width: 0;
+}
+#bootstrap-theme .popover.top > .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-color: white;
+  border-bottom-width: 0;
+}
+#bootstrap-theme .popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, .25);
+  border-left-width: 0;
+}
+#bootstrap-theme .popover.right > .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  content: " ";
+  border-right-color: white;
+  border-left-width: 0;
+}
+#bootstrap-theme .popover.bottom > .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, .25);
+}
+#bootstrap-theme .popover.bottom > .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-width: 0;
+  border-bottom-color: white;
+}
+#bootstrap-theme .popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, .25);
+}
+#bootstrap-theme .popover.left > .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  content: " ";
+  border-right-width: 0;
+  border-left-color: white;
+}
+#bootstrap-theme .popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 5px 5px 0 0;
+}
+#bootstrap-theme .popover-content {
+  padding: 9px 14px;
+}
+
+/* Labels */
+
+#bootstrap-theme .label-primary,
+#bootstrap-theme .label-warning,
+#bootstrap-theme .label-success,
+#bootstrap-theme .label-default,
+#bootstrap-theme .label-info,
+#bootstrap-theme .label-danger {
+  display: inline;
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+  font-weight: normal;
+  color: var(--crm-c-light-text);
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: var(--crm-roundness);
+}
+#bootstrap-theme .label:empty {
+  display: none;
+}
+.btn #bootstrap-theme .label {
+  position: relative;
+  top: -1px;
+}
+#bootstrap-theme a.label:hover,
+#bootstrap-theme a.label:focus {
+  color: var(--crm-c-light-text);
+  text-decoration: none;
+  cursor: var(--crm-hover-clickable);
+}
+#bootstrap-theme .label-default {
+  background-color: var(--crm-c-text);
+  color: var(--crm-c-light-text);
+}
+#bootstrap-theme .label-default[href]:hover,
+#bootstrap-theme .label-default[href]:focus {
+  background-color: var(--crm-c-background4);
+}
+#bootstrap-theme .label-primary {
+  background: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+}
+#bootstrap-theme .label-primary[href]:hover,
+#bootstrap-theme .label-primary[href]:focus {
+  background: var(--crm-c-primary-hover);
+}
+#bootstrap-theme .label-success {
+  background: var(--crm-c-success);
+  color: var(--crm-c-success-text);
+}
+#bootstrap-theme .label-success[href]:hover,
+#bootstrap-theme .label-success[href]:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-success);
+}
+#bootstrap-theme .label-info {
+  background: var(--crm-c-info);
+  color: var(--crm-c-info-text);
+}
+#bootstrap-theme .label-info[href]:hover,
+#bootstrap-theme .label-info[href]:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-info);
+}
+#bootstrap-theme .label-warning {
+  background: var(--crm-c-warning);
+  color: var(--crm-c-warning-text);
+}
+#bootstrap-theme .label-warning[href]:hover,
+#bootstrap-theme .label-warning[href]:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-warning);
+}
+#bootstrap-theme .label-danger {
+  background: var(--crm-c-alert);
+  color: var(--crm-c-alert-text);
+}
+#bootstrap-theme .label-danger[href]:hover,
+#bootstrap-theme .label-danger[href]:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-alert);
+}
+
+/* Panels */
+
+/* With list groups - https://getbootstrap.com/docs/3.4/components/#panels-list-group */
+
+#bootstrap-theme .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+#bootstrap-theme .panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+#bootstrap-theme .list-group + .panel-footer {
+  border-top-width: 0;
+}
+#bootstrap-theme .panel > .list-group,
+#bootstrap-theme .panel > .panel-collapse > .list-group {
+  margin-bottom: 0;
+}
+#bootstrap-theme .panel > .list-group .list-group-item,
+#bootstrap-theme .panel > .panel-collapse > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+#bootstrap-theme .panel > .list-group:first-child .list-group-item:first-child,
+#bootstrap-theme .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+#bootstrap-theme .panel > .list-group:last-child .list-group-item:last-child,
+#bootstrap-theme .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+
+/* With tables - https://getbootstrap.com/docs/3.4/components/#panels-tables */
+
+#bootstrap-theme .panel > .table,
+#bootstrap-theme .panel > .table-responsive > .table,
+#bootstrap-theme .panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+#bootstrap-theme .panel > .table caption,
+#bootstrap-theme .panel > .table-responsive > .table caption,
+#bootstrap-theme .panel > .panel-collapse > .table caption {
+  padding-right: 15px;
+  padding-left: 15px;
+}
+#bootstrap-theme .panel > .table:first-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child,
+#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+#bootstrap-theme .panel > .table:last-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child,
+#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+#bootstrap-theme .panel > .panel-body + .table,
+#bootstrap-theme .panel > .panel-body + .table-responsive,
+#bootstrap-theme .panel > .table + .panel-body,
+#bootstrap-theme .panel > .table-responsive + .panel-body {
+  border-top: 1px solid #ddd;
+}
+#bootstrap-theme .panel > .table > tbody:first-child > tr:first-child th,
+#bootstrap-theme .panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+#bootstrap-theme .panel > .table-bordered,
+#bootstrap-theme .panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+#bootstrap-theme .panel > .table-bordered > thead > tr > th:first-child,
+#bootstrap-theme .panel > .table-bordered > thead > tr > td:first-child,
+#bootstrap-theme .panel > .table-bordered > tbody > tr > th:first-child,
+#bootstrap-theme .panel > .table-bordered > tbody > tr > td:first-child,
+#bootstrap-theme .panel > .table-bordered > tfoot > tr > th:first-child,
+#bootstrap-theme .panel > .table-bordered > tfoot > tr > td:first-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+#bootstrap-theme .panel > .table-bordered > thead > tr > th:last-child,
+#bootstrap-theme .panel > .table-bordered > thead > tr > td:last-child,
+#bootstrap-theme .panel > .table-bordered > tbody > tr > th:last-child,
+#bootstrap-theme .panel > .table-bordered > tbody > tr > td:last-child,
+#bootstrap-theme .panel > .table-bordered > tfoot > tr > th:last-child,
+#bootstrap-theme .panel > .table-bordered > tfoot > tr > td:last-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+#bootstrap-theme .panel > .table-bordered > thead > tr:first-child > td,
+#bootstrap-theme .panel > .table-bordered > thead > tr:first-child > th,
+#bootstrap-theme .panel > .table-bordered > tbody > tr:first-child > td,
+#bootstrap-theme .panel > .table-bordered > tbody > tr:first-child > th,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th,
+#bootstrap-theme .panel > .table-bordered > tbody > tr:last-child > td,
+#bootstrap-theme .panel > .table-bordered > tbody > tr:last-child > th,
+#bootstrap-theme .panel > .table-bordered > tfoot > tr:last-child > td,
+#bootstrap-theme .panel > .table-bordered > tfoot > tr:last-child > th,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+#bootstrap-theme .panel > .table-responsive {
+  margin-bottom: 0;
+  border: 0;
+}
+
+/* Hidiing elements */
+
+#bootstrap-theme [hidden],
+#bootstrap-theme template {
+  display: none;
+}
+#bootstrap-theme .clearfix:before,
+#bootstrap-theme .clearfix:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .clearfix:after {
+  clear: both;
+}
+#bootstrap-theme .center-block {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
+}
+#bootstrap-theme .hide {
+  display: none !important;
+}
+#bootstrap-theme .show {
+  display: block !important;
+}
+#bootstrap-theme .invisible {
+  visibility: hidden;
+}
+#bootstrap-theme .text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+#bootstrap-theme .hidden {
+  display: none !important;
+}
+#bootstrap-theme .affix {
+  position: fixed;
+}
+@-ms-viewport {
+  width: device-width;
+}
+#bootstrap-theme .visible-sm {
+  display: none !important;
+}
+#bootstrap-theme .visible-md {
+  display: none !important;
+}
+#bootstrap-theme .visible-lg {
+  display: none !important;
+}
+#bootstrap-theme .visible-xs-block,
+#bootstrap-theme .visible-xs-inline,
+#bootstrap-theme .visible-xs-inline-block,
+#bootstrap-theme .visible-sm-block,
+#bootstrap-theme .visible-sm-inline,
+#bootstrap-theme .visible-sm-inline-block,
+#bootstrap-theme .visible-md-block,
+#bootstrap-theme .visible-md-inline,
+#bootstrap-theme .visible-md-inline-block,
+#bootstrap-theme .visible-lg-block,
+#bootstrap-theme .visible-lg-inline,
+#bootstrap-theme .visible-lg-inline-block {
+  display: none !important;
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .visible-xs {
+    display: block !important;
+  }
+  #bootstrap-theme table.visible-xs {
+    display: table !important;
+  }
+  #bootstrap-theme tr.visible-xs {
+    display: table-row !important;
+  }
+  #bootstrap-theme th.visible-xs,
+  #bootstrap-theme td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .visible-xs-block {
+    display: block !important;
+  }
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .visible-xs-inline {
+    display: inline !important;
+  }
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  #bootstrap-theme .visible-sm {
+    display: block !important;
+  }
+  #bootstrap-theme table.visible-sm {
+    display: table !important;
+  }
+  #bootstrap-theme tr.visible-sm {
+    display: table-row !important;
+  }
+  #bootstrap-theme th.visible-sm,
+  #bootstrap-theme td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  #bootstrap-theme .visible-sm-block {
+    display: block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  #bootstrap-theme .visible-sm-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  #bootstrap-theme .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  #bootstrap-theme .visible-md {
+    display: block !important;
+  }
+  #bootstrap-theme table.visible-md {
+    display: table !important;
+  }
+  #bootstrap-theme tr.visible-md {
+    display: table-row !important;
+  }
+  #bootstrap-theme th.visible-md,
+  #bootstrap-theme td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  #bootstrap-theme .visible-md-block {
+    display: block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  #bootstrap-theme .visible-md-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  #bootstrap-theme .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 1200px) {
+  #bootstrap-theme .visible-lg {
+    display: block !important;
+  }
+  #bootstrap-theme table.visible-lg {
+    display: table !important;
+  }
+  #bootstrap-theme tr.visible-lg {
+    display: table-row !important;
+  }
+  #bootstrap-theme th.visible-lg,
+  #bootstrap-theme td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  #bootstrap-theme .visible-lg-block {
+    display: block !important;
+  }
+}
+@media (min-width: 1200px) {
+  #bootstrap-theme .visible-lg-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 1200px) {
+  #bootstrap-theme .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (max-width: 767px) {
+  #bootstrap-theme .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  #bootstrap-theme .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  #bootstrap-theme .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  #bootstrap-theme .hidden-lg {
+    display: none !important;
+  }
+}
+#bootstrap-theme .visible-print {
+  display: none !important;
+}
+@media print {
+  #bootstrap-theme .visible-print {
+    display: block !important;
+  }
+  #bootstrap-theme table.visible-print {
+    display: table !important;
+  }
+  #bootstrap-theme tr.visible-print {
+    display: table-row !important;
+  }
+  #bootstrap-theme th.visible-print,
+  #bootstrap-theme td.visible-print {
+    display: table-cell !important;
+  }
+}
+#bootstrap-theme .visible-print-block {
+  display: none !important;
+}
+@media print {
+  #bootstrap-theme .visible-print-block {
+    display: block !important;
+  }
+}
+#bootstrap-theme .visible-print-inline {
+  display: none !important;
+}
+@media print {
+  #bootstrap-theme .visible-print-inline {
+    display: inline !important;
+  }
+}
+#bootstrap-theme .visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  #bootstrap-theme .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+@media print {
+  #bootstrap-theme .hidden-print {
+    display: none !important;
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/_cms.css b/civicrm/ext/riverlea/core/css/_cms.css
new file mode 100755
index 0000000000000000000000000000000000000000..6bd0ba14f16741dc4272052d623eb15a31a04d6b
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/_cms.css
@@ -0,0 +1,211 @@
+/* NB: CMS-specific changes should be name-spaced to the CMS *and* .crm-container, with exception of default font-size resets */
+
+/******************
+   BACKDROP
+*******************/
+
+/* Backdrop - html.admin-bar */
+
+html.admin-bar body {
+  background-color: var(--crm-c-page-background);
+}
+html.admin-bar .crm-container {
+  --crm-page-padding: 0;
+}
+html.admin-bar #admin-bar-menu a.civicrm {
+  padding-left: 1.75rem !important;
+}
+html.admin-bar #admin-bar-menu .civicrm .admin-bar-link-icon {
+  display: none;
+}
+
+/******************
+   DRUPAL
+*******************/
+
+/* Drupal - body.page-civicrm */
+
+/* D7 Garland */
+body.page-civicrm > #page {
+  padding: 0;
+  margin: 0;
+  --crm-page-padding: 1rem 3rem;
+}
+body.page-civicrm .crm-container div.status {
+  background-image: none;
+}
+
+/* D8+ */
+body.page-civicrm header.content-header {
+  margin-bottom: 0;
+  background-color: var(--crm-c-background);
+}
+body.page-civicrm main.page-content {
+  margin-top: 0;
+}
+body.page-civicrm header + div.layout-container {
+  background-color: var(--crm-c-page-background) !important;
+  margin: 0 !important; /* use of important vs some themes */
+}
+body.page-civicrm .button {
+  -webkit-font-smoothing: initial;
+}
+body.page-civicrm .page-title {
+  color: var(--crm-c-text);
+}
+
+/* D7 Garland */
+body.page-civicrm #squeeze #crm-container,
+.region-sidebar-first .block-civicrm {
+  padding: 0;
+  --crm-page-padding: 0;
+  --crm-c-page-background: transparent;
+  --crm-input-label-width: 12em;
+}
+body.page-civicrm #squeeze .crm-container ul li:not(.ui-tab) {
+  margin: 0;
+  padding: 0;
+}
+
+/* D7 Seven */
+body.page-civicrm > #branding {
+  background-color: var(--crm-c-page-background);
+}
+body.page-civicrm > #branding + #page {
+  --crm-page-padding: 0.5rem 1.25rem;
+}
+
+/* D9 Claro */
+body.page-civicrm {
+  color: unset;
+}
+body.page-civicrm .breadcrumb__item,
+body.page-civicrm .breadcrumb__link {
+  color: var(--crm-c-text);
+}
+#block-claro-content {
+  --crm-page-padding: 3rem;
+  --crm-page-width: calc(100% - var(--crm-page-padding) - var(--crm-page-padding));
+}
+#block-claro-content .crm-container:not(.crm-public) .form-item,
+#block-claro-content .crm-container p,
+#block-claro-content .crm-container .help p,
+#block-claro-content .crm-container .button {
+  margin: 0;
+}
+body.page-civicrm .page-content:has(#block-claro-content) {
+  margin-top: 0;
+}
+#block-claro-content .button:not(:focus) {
+  box-shadow: none;
+}
+#block-claro-content .required-mark::after {
+  background-image: unset;
+  display: inherit;
+}
+#block-claro-content .action-link + .action-link {
+  margin-inline-start: unset;
+}
+@media (max-width: 959px) {
+  #block-claro-content {
+    --crm-page-padding: 1rem;
+  }
+}
+
+/* D9 Seven */
+#block-seven-content {
+  --crm-page-padding: 2rem;
+}
+#block-seven-breadcrumbs {
+  --crm-page-padding: 2rem;
+  padding: 0 var(--crm-page-padding);
+}
+#block-seven-content .button {
+  text-shadow: none;
+  margin-left: 0;
+}
+#block-seven-content .form-composite > legend,
+#block-seven-content .label {
+  font-weight: inherit;
+}
+
+/* Bootstrap 4 */
+body.page-civicrm main > .container:has(#block-bootstrap4-content) {
+  max-width: 100%;
+  background: var(--crm-c-page-background);
+}
+
+/******************
+   WORDPRESS
+*******************/
+
+body.toplevel_page_CiviCRM.wp-admin {
+  background: var(--crm-c-page-background);
+}
+body.toplevel_page_CiviCRM #wpcontent {
+  padding-left: 0; /* resets WP padding */
+}
+body.wp-admin .crm-container {
+  --crm-page-padding: 1rem 2rem;
+}
+body.wp-admin .crm-title {
+  line-height: 1.1;
+  margin-bottom: 8px;
+}
+body.wp-admin .crm-container input:not([type=checkbox]):not([type=radio]):not(.crm-form-time) {
+  margin: 0;
+}
+body.wp-admin .crm-container p,
+body.wp-admin .crm-container li {
+  margin: 0; /* resets WP li bottom margin */
+  list-style: none;
+  white-space: inherit;
+}
+body.wp-admin .crm-container div.ui-notify-message .notify-content li {
+  list-style: unset;
+}
+body.wp-admin .crm-container .button {
+  line-height: inherit;
+  font-size: inherit;
+}
+body.wp-admin .breadcrumb .crm-i {
+  font-size: smaller;
+}
+body.wp-admin.page-civicrm-contact .breadcrumb {
+  display: none; /* Hides breadcrumb on contact dashboard */
+}
+body.wp-admin.wp-core-ui .crm-container select {
+  margin: 0;
+  appearance: auto;
+  background-image: none;
+}
+body.wp-admin.wp-core-ui.toplevel_page_CiviCRM select:hover {
+  color: var(--crm-input-color);
+}
+body.wp-admin .crm-container input[type="checkbox"],
+body.wp-admin .crm-container input[type="radio"] {
+  appearance: none;
+  border-radius: var(--crm-s);
+  background: #fff;
+  height: var(--crm-r);
+  width: var(--crm-r);
+}
+body.wp-admin .crm-container input[type="radio"] {
+  border-radius: 50%;
+}
+
+/******************
+   STANDALONE
+*******************/
+
+html.crm-standalone {
+  --crm-page-width: 94vw;
+  --crm-page-padding: 1px 3vw 1rem;
+}
+html.crm-standalone body {
+  margin: unset;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",sans-serif; /* Adds fallback for base font */
+}
+html.crm-standalone #crm-container:has(.standalone-auth-form) {
+  background: var(--crm-c-background);
+}
diff --git a/civicrm/ext/riverlea/core/css/_core.css b/civicrm/ext/riverlea/core/css/_core.css
new file mode 100755
index 0000000000000000000000000000000000000000..4e89d1cffe02dadd7357cc2d0c39f8a45216f027
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/_core.css
@@ -0,0 +1,8 @@
+/* Civi CSS Framework (civicrm.css), the core CSS to make Civi UI behave
+   coherently in a neutral, clean, responsive and accessible way with as little
+   css as possible. For dev purposes each components is its own file, these
+   can be merged later. */
+
+@import url(components/_accordion.css); @import url(components/_alerts.css); @import url(components/_buttons.css); @import url(components/_form.css); @import url(components/_icons.css); @import url(components/_nav.css); @import url(components/_tabs.css); @import url(components/_dropdowns.css); @import url(components/_tables.css); @import url(components/_dialogs.css); @import url(components/_page.css); @import url(components/_components.css); @import url(components/_front.css); :root {
+  --crm-release: '1.80.14';
+}
diff --git a/civicrm/ext/riverlea/core/css/_fixes.css b/civicrm/ext/riverlea/core/css/_fixes.css
new file mode 100755
index 0000000000000000000000000000000000000000..6571e7d6b8550899cacf53ccea6a4b51235fbef4
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/_fixes.css
@@ -0,0 +1,888 @@
+/* CSS hacks to accommodate quirks and inconsistencies in the markup.
+   The end goal would be to remove these once the markup is
+   consistent, and another  */
+
+/******************
+    ACCORDIONS
+    From Civi 5.72 these are only needed for extensions
+*******************/
+
+/* Reset */
+
+.crm-container .widget-content .crm-accordion-wrapper.collapsed .crm-accordion-header,
+.crm-container .widget-content .crm-accordion-header,
+.crm-container .crm-accordion-inner .crm-accordion-header,
+.crm-container .crm-accordion-wrapper .crm-master-accordion-header,
+.crm-container .crm-collapsible .collapsible-title,
+.crm-container .collapsed .crm-accordion-header,
+.crm-container .crm-accordion-header {
+  background-image: none;
+  text-indent: 0;
+}
+.crm-container div.collapsed .crm-accordion-body,
+.crm-container div.crm-collapsible.collapsed .collapsible-title+*,
+.crm-container tr.hiddenElement {
+  display: none;
+}
+.accordion.ui-accordion.ui-widget.ui-helper-reset {
+  border: 0 solid transparent;
+  box-shadow: var(--crm-block-shadow);
+}
+
+/* Expand/collapse icons */
+
+.crm-container .crm-accordion-header::before,
+details.af-collapsible > .af-title::before,
+.crm-dashlet-header .crm-dashlet-collapse.fa-caret-down::before,
+.crm-dashlet-header .crm-dashlet-collapse.fa-caret-right::before,
+.crm-container .crm-master-accordion-header:before,
+.crm-container .expanded::before,
+.crm-container a.collapsed::before,
+.crm-container .crm-collapsible .collapsible-title::before,
+.crm-container a.crm-expand-row:not(.expanded)::before,
+.crm-container .civicrm-community-messages .crm-collapsible .collapsible-title::before,
+.crm-container .show-children.collapsed::before {
+  font-size: var(--crm-font-size);
+  font-style: normal;
+  text-rendering: auto;
+  text-indent: inherit;
+  font-family: FontAwesome;
+  color: var(--crm-expand-icon-color);
+  margin-right: var(--crm-expand-icon-spacing);
+  display: inline-block;
+  transform-origin: center center;
+  content: var(--crm-expand-icon);
+  cursor: var(--crm-hover-clickable);
+}
+.crm-container .collapsed .crm-accordion-header::before,
+.crm-accordion-wrapper.collapsed .crm-master-accordion-header:before,
+.crm-dashlet-header .crm-dashlet-collapse.fa-caret-right::before,
+details.af-collapsible.af-collapsed > .af-title::before,
+.crm-container a.collapsed:not(.expanded)::before,
+.crm-container a.crm-expand-row::before,
+.crm-container .crm-collapsible.collapsed .collapsible-title::before,
+.crm-container .civicrm-community-messages .crm-collapsible.collapsed .collapsible-title::before {
+  transform: none;
+  transform-origin: center center;
+  transition: var(--crm-expand-transition);
+}
+.crm-container .crm-accordion-header::before,
+details.af-collapsible[open] > .af-title::before,
+.crm-container .crm-collapsible .collapsible-title::before,
+.crm-dashlet-header .crm-dashlet-collapse.fa-caret-down::before,
+.crm-container .crm-master-accordion-header:before,
+.crm-container a.collapsed::before,
+.crm-container a.expanded::before,
+.crm-container a.crm-expand-row.expanded::before,
+.crm-container .civicrm-community-messages .crm-collapsible .collapsible-title::before,
+.crm-container .show-children.expanded::before {
+  content: var(--crm-expand-icon);
+  transform: var(--crm-expand-transform);
+  transform-origin: center center;
+  transition: var(--crm-expand-transition);
+  float: left;
+}
+.crm-container a.crm-expand-row:not(.expanded)::before,
+.crm-container a.crm-expand-row.expanded::before {
+  margin-right: 0;
+}
+a.crm-expand-row:hover,
+a.crm-expand-row:focus {
+  text-decoration: none;
+  color: inherit;
+}
+
+/* Header */
+
+.crm-container .crm-accordion-header,
+.crm-container .crm-collapsible .collapsible-title,
+.af-collapsible > summary.af-title,
+.crm-container span.collapsed:not(.show-children) {
+  cursor: var(--crm-hover-clickable);
+  padding: var(--crm-expand-header-padding);
+  border-radius: var(--crm-expand-radius) var(--crm-expand-radius) 0 0;
+  background-color: var(--crm-expand-header-bg);
+  font-weight: var(--crm-expand-header-weight);
+  color: var(--crm-expand-header-color);
+}
+.crm-container .crm-accordion-wrapper.collapsed .crm-accordion-header,
+.crm-container .crm-collapsible.collapsed .collapsible-title {
+  border-radius: var(--crm-expand-radius);
+}
+.crm-container .widget-content .crm-accordion-header,
+.crm-container .crm-accordion-inner .crm-accordion-header,
+.crm-container .crm-collapsible .collapsible-title {
+  background-color: transparent;
+  color: var(--crm-c-text);
+  font-size: var(--crm-font-size);
+}
+.crm-accordion-wrapper .crm-accordion-header.active,
+.crm-accordion-wrapper .crm-accordion-wrapper.collapsed:hover,
+.crm-accordion-wrapper .crm-accordion-wrapper.collapsed:focus,
+.crm-accordion-wrapper .crm-accordion-header:hover,
+.crm-accordion-wrapper .crm-accordion-header.active:hover {
+  background-color: var(--crm-expand-header-bg-active);
+}
+.crm-container .crm-accordion-wrapper .crm-master-accordion-header {
+  font-family: var(--crm-expand2-header-font);
+  font-weight: var(--crm-expand2-header-weight);
+  background-color: var(--crm-expand2-header-bg);
+  color: var(--crm-expand2-header-color);
+  border: var(--crm-expand2-header-border);
+  border-width: var(--crm-expand2-header-border-width);
+  padding: var(--crm-expand2-header-padding);
+}
+.crm-container .crm-accordion-wrapper .crm-master-accordion-header:hover,
+.crm-container .crm-accordion-wrapper .crm-master-accordion-header:focus {
+  background-color: var(--crm-expand2-header-bg-active);
+}
+/* Body */
+
+.crm-container .crm-accordion-wrapper .crm-accordion-body {
+  border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius);
+  border: var(--crm-expand-border);
+  padding: var(--crm-expand-body-padding);
+  background-color: var(--crm-expand-body-bg);
+  box-shadow: var(--crm-expand-body-box-shadow);
+}
+.crm-container .widget-content .crm-accordion-body,
+.crm-container .crm-collapsible .crm-summary-block {
+  padding: var(--crm-expand-body-padding);
+}
+.crm-container .crm-master-accordion-header + .crm-accordion-body {
+  padding: var(--crm-expand2-body-padding);
+  background: var(--crm-expand2-body-bg);
+  border: var(--crm-expand2-border);
+  border-width: var(--crm-expand2-border-width);
+  border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius);
+}
+.crm-container summary label {
+  color: inherit !important; /* all vs .crm-container .form-item label */
+  font-size: inherit !important;
+  margin: 0 !important;
+}
+.crm-container details table.dataTable {
+  width: 100% !important; /* dev/user-interface/-/issues/73 */
+  box-sizing: border-box;
+}
+
+/******************
+    ALERTS
+*******************/
+
+.crm-container del,
+.crm-container .ui-icons_deleted,
+.crm-container table.caseSelector td.status-urgent,
+.crm-container .font-red,
+.crm-container .status-removed,
+.crm-container .status-overdue,
+.crm-container .status-fatal,
+.crm-container .status-hold,
+.crm-container .status-past,
+.crm-contact-deceased,
+.crm-container .status-warning {
+  color: var(--crm-c-alert);
+}
+.crm-container .alert.alert-info.font-red { /* for when an info alert wants to be a danger alert! */
+  background-color: var(--crm-alert-background-danger);
+  border-color: var(--crm-alert-border-danger);
+}
+
+/******************
+    BUTTONS
+      For buttons not using .crm-button or .btn or <button>
+*******************/
+
+.crm-container .ui-button:not(.ui-button-icon-only) {
+  white-space: nowrap;
+  vertical-align: middle;
+  touch-action: manipulation;
+  cursor: var(--crm-hover-clickable);
+  background-image: none;
+  border: var(--crm-btn-border);
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+  font-size: var(--crm-font-size);
+  border-radius: var(--crm-btn-radius);
+  user-select: none;
+  margin: var(--crm-btn-margin);
+  background-color: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+  line-height: 1.5;
+  display: flex;
+  height: var(--crm-btn-height);
+  width: fit-content;
+  gap: var(--crm-btn-icon-spacing);
+}
+.crm-container .ui-button:hover,
+.crm-container .ui-button:focus {
+  background: var(--crm-c-primary-hover);
+  color: var(--crm-c-primary-text);
+  text-decoration: none;
+}
+.crm-button > input[type="button"],
+.crm-button > input[type="submit"] {
+  background: transparent;
+  color: inherit;
+  padding: 0;
+  border: 0;
+  box-shadow: none;
+}
+.crm-container a.button,
+.crm-container a.button:link,
+.crm-container a.button:visited {
+  background: var(--crm-c-secondary);
+  color: var(--crm-c-secondary-text);
+  border: var(--crm-btn-border);
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+  font-weight: normal;
+  text-decoration: none;
+  line-height: initial;
+  min-height: var(--crm-btn-height);
+  border-radius: var(--crm-btn-radius);
+  display: flex !important; /* vs contact dashboard edit */
+  gap: var(--crm-btn-icon-spacing);
+  align-items: center;
+  margin: var(--crm-btn-margin);
+}
+.crm-container a.button span {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+}
+.crm-container a.button:hover,
+.crm-container a.button:focus {
+  background: var(--crm-c-secondary-hover);
+  color: var(--crm-c-secondary-hover-text);
+}
+.crm-actions-ribbon a.button,
+.crm-container .action-link a.button {
+  background: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+  font-weight: normal;
+  text-decoration: none;
+}
+.crm-container a.button i.crm-i,
+.crm-container a.button:visited i.crm-i {
+  padding: 0 var(--crm-btn-icon-spacing) 0 var(--crm-btn-padding-inline);
+  min-height: calc(var(--crm-btn-height) - 2px - var(--crm-btn-icon-padding) - var(--crm-btn-icon-padding));
+}
+.crm-container .crm-actions-ribbon a.button:not(.delete):hover,
+.crm-container .crm-actions-ribbon a.button:not(.delete):focus,
+.crm-container .action-link a.button:hover,
+.crm-container .action-link a.button:focus {
+  background: var(--crm-c-primary-hover);
+  text-decoration: none;
+}
+.crm-config-backend-form-block > div { /* makes cleanup cache buttons flow inline */
+  display: flex;
+  gap: var(--crm-flex-gap);
+}
+#ckeditor_config {
+  display: flex !important; /* odd inline styled button on display preferences page */
+}
+
+/* Small buttons */
+
+.crm-container .btn-xs,
+.crm-container button.dropdown-toggle.btn-xs,
+.crm-container .crm-accordion-header a.crm-hover-button,
+.crm-container .crm-form-date-wrapper a.crm-hover-button,
+.crm-container .btn-group-xs > .btn,
+body[class*="page-civicrm-report-"] #report-tab-order-by-elements #optionFieldLink.btn-group-xs > .form-link,
+.crm-container .crm-search-form-block.btn-group-xs > a,
+.crm-container .crm-search-form-block.btn-group-xs > span,
+.page-civicrm-admin.page-civicrm-a .crmCaseType .btn-group-xs > .crm-button,
+.page-civicrm-a.page-civicrm-a .crmCaseType .btn-group-xs > .crm-button,
+.crm-container #crm-submit-buttons .btn-group-xs > button.crm-form-submit,
+.crm-container .btn-group-xs > button.crm-button.crm-form-submit,
+.crm-container .btn-group-xs > .crm-hover-button,
+.crm-container .ui-dialog-buttonset .btn-group-xs > .ui-button,
+.crm-container .btn-group-xs > a.button,
+.crm-container .btn-group-xs > input[type="button"] {
+  padding: var(--crm-btn-small-padding);
+  font-size: var(--crm-small-font-size);
+  border-radius: var(--crm-roundness);
+  height: auto;
+}
+.crm-container .btn-group-xs button {
+  padding: var(--crm-xs) var(--crm-s);
+  font-size: var(--crm-small-font-size);
+}
+/* select all 'checkbox' on table th */
+.crm-container button.btn:has(.fa-square-o),
+.crm-container button.btn:has(.fa-check-square-o) {
+  padding-inline: 0;
+  border-right: 0;
+}
+.crm-container i.ui-icon.fa-square-o,
+.crm-container i.ui-icon.fa-check-square-o,
+.crm-container .btn i.fa-square-o,
+.crm-container .btn i.fa-check-square-o {
+  margin: 0;
+  padding: 0;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+/******************
+    FORM
+    Inline labels/inputs with a 17% width?
+*******************/
+
+@media (min-width: 480px) {
+  .crm-container .crm-section .label {
+    float: left;
+    width: 17%;
+    text-align: right;
+  }
+  .crm-container .crm-section .content {
+    margin-left: 19%;
+  }
+}
+
+/******************
+    TABS
+*******************/
+
+/* Bootstrap tabs */
+
+.crm-container .panel-default > .panel-heading:has(.nav-tabs) { /* Fix for default panel heading bg */
+  background-color: var(--crm-tabs-bg);
+}
+.crm-container .panel-heading:has(.nav-tabs) .pull-right {
+  margin-right: var(--crm-m);
+}
+.crm-container .afadmin-list .nav.nav-tabs { /* Fix for AForm tabs border */
+  border-radius: var(--crm-roundness) var(--crm-roundness) 0 0;
+  margin-bottom: 0;
+}
+.crm-container .crm-search-nav-tabs { /* Fix for SK tabs border */
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+  margin-bottom: 0;
+  border-bottom: 0;
+}
+.crm-container .panel-heading:has(.nav-tabs) {
+  padding: 0;
+  border-bottom: 0;
+  background-color: var(--crm-tabs-bg);
+}
+.crm-container .panel-heading .nav.nav-tabs {
+  background-color: transparent;
+}
+.crm-container .afadmin-list > table,
+.crm-search:has(.crm-search-nav-tabs) .crm-search-display.crm-search-display-table {
+  border: var(--crm-tabs-border);
+  box-shadow: none;
+  border-radius: 0 0 var(--crm-roundness) var(--crm-roundness);
+  background: var(--crm-tab-bg-active);
+  overflow-x: auto;
+}
+.crm-search:has(.crm-search-nav-tabs) .crm-search-display.crm-search-display-table table {
+  border-width: 1px 0 0 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  box-shadow: none;
+  margin-bottom: 0;
+}
+.crm-container .afadmin-list >  .form-inline,
+.crm-search > .ng-scope > .form-inline {
+  border: var(--crm-tabs-border);
+  border-radius: 0;
+  border-top-width: 0;
+  border-bottom-width: 0;
+}
+.afadmin-list > .form-inline {
+  border-radius: 0;
+  border-bottom: 0;
+}
+.afadmin-list .nav-tabs + .form-inline,
+.crm-search-nav-tabs ~ .ng-scope > .form-inline {
+  padding: var(--crm-r);
+  background: var(--crm-tab-bg-active);
+}
+.crm-container .ui-tabs ul.crm-extensions-tabs-list a em {
+  display: none;
+}
+#crm-status-list {
+  box-shadow: var(--crm-block-shadow);
+}
+
+/******************
+    PAGES
+*******************/
+
+/* Contacts - New */
+
+.CRM_Contact_Form_Contact > .crm-form-block > details,
+.CRM_Contact_Form_Contact > .crm-form-block > div > details {
+  margin-inline: calc(-1 * var(--crm-form-block-padding));
+  padding-inline: var(--crm-expand-2-body-padding);
+  margin-bottom: var(--crm-expand-2-body-padding);
+}
+.crm-container .crm-add-address-wrapper {
+  height: auto;
+}
+
+/* Tag mgmt page */
+
+#mainTabContainer #tagtree {
+  max-height: 100%;
+  overflow: inherit;
+}
+.crm-container .tag-tree-wrapper {
+  display: grid;
+  grid-template-columns: 2fr 1fr;
+  margin: var(--crm-m) 0;
+}
+.crm-container .tag-tree-wrapper div.tag-tree {
+  width: auto;
+}
+.crm-container .tag-tree-wrapper div.tag-info {
+  width: auto;
+  position: relative;
+  background: var(--crm-c-background);
+  border: 0 solid transparent;
+  box-shadow: var(--crm-block-shadow);
+  padding: var(--crm-padding-reg);
+  font-family: var(--crm-font);
+  border-radius: var(--crm-roundness);
+  top: 0;;
+}
+.crm-container .tag-tree-wrapper div.tag-info .tdl {
+  font-weight: var(--crm-bold-weight);
+  font-family: var(--crm-font-bold);
+  color: var(--crm-c-text);
+}
+.crm-container .tag-tree-wrapper div.tag-info .crm-submit-buttons {
+  margin: var(--crm-m) 0 0;
+  padding: 0;
+}
+.crm-container .tag-tree-wrapper .tag-tree a.crm-tag-item {
+  font-size: var(--crm-font-size);
+  font-family: var(--crm-font);
+  height: auto;
+  padding: var(--crm-padding-small);
+  border-radius: var(--crm-btn-radius);
+}
+@media (max-width: 768px) {
+  .crm-container .tag-tree-wrapper {
+    display: block;
+  }
+}
+/* Dedupe change usage */
+.crm-container label:has(.dedupe-rules-dialog-desc) input {
+  float: left;
+  margin: var(--crm-s) var(--crm-m) 0 0;
+}
+.crm-container .dedupe-rules-dialog-desc {
+  font-weight: normal;
+  font-family: var(--crm-font);
+}
+/* CiviContribute dashboard */
+.crm-container #ContributionCharts #mainTabContainer {
+  box-shadow: var(--crm-block-shadow);
+}
+.crm-container #ContributionCharts .ui-tabs-nav {
+  align-items: center;
+  gap: 1px; /* to handle white space in markup */
+}
+.crm-container #ContributionCharts .ui-tabs-nav .float-right td {
+  padding: 0 var(--crm-s);
+}
+#ContributionCharts ul.ui-tabs-nav li.crm-tab-button {
+  padding: var(--crm-tab-padding);
+  border-radius: var(--crm-tab-roundness);
+}
+#ContributionCharts ul.ui-tabs-nav li.crm-tab-button a {
+  padding: 0;
+}
+#ContributionCharts ul.ui-tabs-nav li.crm-tab-button a span {
+  display: none;
+}
+#ContributionCharts ul.ui-tabs-nav .float-right {
+  position: absolute;
+  right: var(--crm-s);
+  top: var(--crm-s);
+}
+#ContributionCharts ul.ui-tabs-nav .float-right table,
+#ContributionCharts ul.ui-tabs-nav .float-right table tr {
+  background: none;
+  margin: 0;
+  border: 0 solid transparent;
+  box-shadow: none;
+}
+#ContributionCharts ul.ui-tabs-nav .float-right table a.button {
+  max-height: 36px;
+}
+#ContributionCharts #chartData {
+  padding: var(--crm-padding-reg);
+  box-shadow: none;
+  background: var(--crm-tab-bg-active);
+}
+/* Include profile (contribtuion page and events  */
+.crm-contribution-contributionpage-custom-form-block-custom_pre_id td.html-adjust > div > div,
+.crm-contribution-contributionpage-custom-form-block-custom_post_id td.html-adjust > div > div,
+.crm-event-manage-registration-form-block-custom_pre_id td > div > div,
+.crm-event-manage-registration-form-block-custom_post_id td > div > div {
+  display: flex;
+  gap: var(--crm-s);
+}
+/* Event dashboard */
+.CRM_Event_Form_Search .button {
+  float: left;
+  margin-right: var(--crm-m);
+}
+#crm-event-dashboard-heading + div a,
+.CRM_Event_Form_SearchEvent .crm-content-block .float-right a {
+  display: flex;
+  padding: 0 0 var(--crm-m) 0;
+  gap: var(--crm-m);
+  align-items: center;
+}
+/* Dedupe page */
+#browseValues_Individual > div:last-of-type,
+#browseValues_Household > div:last-of-type,
+#browseValues_Organization > div:last-of-type {
+  float: none !important; /* overwrites inline 'float' that breaks page wrapper */
+  display: flex;
+  justify-content: flex-end;
+  padding: 0 0 var(--crm-l) 0;
+}
+
+/* CiviCase  */
+.crm-container .crm-case-dashboard-switch-view-buttons {
+  margin-left: auto;
+  display: flex;
+}
+.crm-container .crm-case-caseview-form-block table#searchOptions {
+  width: auto !important;
+}
+.crm-case-form-block h3,
+.crm-case-caseview-form-block h3 {
+  background: transparent;
+  padding: 0;
+}
+.crm-case-activity-form-block-followup_activity_type_id .crm-form-date-wrapper {
+  display: inline-block;
+}
+.crm-case-activity-form-block table.form-layout-compressed {
+  width: 100%;
+}
+.crm-case-form-block-medium_id td.view-value label {
+  width: auto;
+}
+/* API3 explorer */
+
+#api-generated caption {
+  font-weight: var(--crm-bold-weight);
+  font-family: var(--crm-font-bold);
+}
+#api-generated tr td:first-of-type {
+  width: var(--crm-input-label-width);
+}
+/* Display Preferences */
+
+tr.crm-preferences-display-form-block-contact_edit_options td:has(table) {
+  padding: 0;
+}
+
+tr.crm-preferences-display-form-block-contact_edit_options td table {
+  width: auto !important;
+}
+/******************
+    SEARCH
+*******************/
+
+.crm-container div#searchForm table.form-layout {
+  background: transparent;
+  box-shadow: none;
+}
+/* Advanced Search */
+.crm-container .adv-search-top-submit {
+  display: flex;
+  float: right;
+  gap: 1rem;
+  align-items: center;
+}
+.crm-container .form-layout td:has(#_qf_Advanced_refresh-bottom) {
+  display: flex;
+  gap: var(--crm-m);
+  align-items: center;
+}
+.crm-container .adv-search-top-submit .crm-submit-buttons,
+.crm-container .form-layout td:has(#_qf_Advanced_refresh-bottom) .crm-submit-buttons {
+  padding: 0;
+}
+/* Full Text */
+#searchForm table.form-layout-compressed td {
+  padding: var(--crm-padding-reg);
+}
+/* Case */
+.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child,
+.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr,
+.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr > td {
+  display: block;
+}
+.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr:nth-of-type(1) > td:nth-of-type(2) {
+  display: none !important;
+}
+.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr #s2id_case_status_id {
+  margin-bottom: var(--crm-r1);
+}
+.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr:nth-of-type(1) > td:nth-of-type(1) label {
+  display: block;
+}
+.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr:nth-of-type(1) > td:nth-of-type(1) label + input {
+  margin-left: -0.6rem;
+}
+/* Member */
+.page-civicrm-member-search .CRM_Member_Form_Search .crm-accordion-body tr:last-child td {
+  padding-top: var(--crm-r);
+}
+/* Find Participants */
+.crm-container div#searchForm table.form-layout td {
+  border: 0 solid transparent;
+}
+/* Custom searches */
+.crm-container > #crm-main-content-wrapper > fieldset {
+  display: grid;
+  background: var(--crm-c-background);
+  border: 0 solid transparent;
+  box-shadow: var(--crm-block-shadow);
+  padding: var(--crm-padding-reg);
+  gap: var(--crm-m);
+  margin-bottom: var(--crm-r);
+}
+.crm-container > #crm-main-content-wrapper > fieldset > * {
+  margin: 0;
+}
+
+/******************
+    PADDING FIXES
+*******************/
+
+/* General */
+.crm-container .crm-form-block .crm-form-block {
+  padding: var(--crm-form-block-padding);
+  margin-bottom: var(--crm-r);
+}
+/* Save as template text on new email form */
+.crm-container #editMessageDetails {
+  padding: var(--crm-padding-reg);
+}
+/* Contact dashboard page */
+.crm-contact-page {
+  padding: 0;
+}
+#mainTabContainer .form-group.pull-right  > .btn-group {
+  margin-bottom: var(--crm-m2);
+}
+/* Contact dashboard page */
+.crm-actions-ribbon .crm-next-action,
+.crm-actions-ribbon .crm-previous-action {
+  margin-left: auto;
+}
+.crm-container .view-contact-groups .description {
+  margin: var(--crm-r) 0;
+}
+/* Contacts - new */
+.CRM_Contact_Form_Contact > .crm-form-block .crm-submit-buttons:first-of-type {
+  margin-bottom: var(--crm-padding-reg);
+  padding: 0;
+}
+.CRM_Contact_Form_Contact > .crm-form-block .crm-submit-buttons:last-of-type {
+  margin-top: var(--crm-padding-reg);
+  padding: 0;
+}
+/* Imports */
+.crm-form-block.ui-iconmport-mapfield-form-block .help,
+.crm-form-block.ui-iconmport-preview-form-block .help,
+.crm-activity-import-preview-form-block .help {
+  background-color: transparent;
+  border: 0;
+}
+/* Manage groups */
+.crm-group-search-form-block details table,
+.crm-group-search-form-block details table tr {
+  border: 0 solid transparent;
+}
+/* Group contents / contact listing */
+.crm-container .crm-form-block #searchForm .crm-form-block {
+  padding: 0;
+  margin-bottom: 0;
+}
+.crm-search-form .crm-submit-buttons {
+  padding: 0 0 var(--crm-m);
+}
+.crm-search-form .crm-search-form-block {
+  margin-bottom: var(--crm-r);
+}
+/* Dedupe exceptions */
+details + .crm-content-block:has(.dataTables_wrapper) {
+  margin-top: var(--crm-r);
+}
+/* Contribution page edit/create */
+.crm-container .crm-premium-settings-accordion {
+  margin-bottom: var(--crm-padding-reg);
+}
+/* Personal Campaign pages */
+.CRM_PCP_Form_PCP .messages.status {
+  margin: var(--crm-padding-reg) 0;
+}
+/* Manage cases */
+.crm-container table.report.case-summary {
+  margin-top: var(--crm-padding-reg);
+  width: 100%;
+}
+.crm-container table.report.case-summary table.form-layout-compressed {
+  box-shadow: none;
+  border: 0;
+  margin: 0;
+  width: 100%;
+}
+.crm-container .case-control-panel,
+.crm-container .crm-case-filter-upcoming {
+  padding-bottom: var(--crm-padding-reg);
+}
+
+/******************
+    RESPONSIVE
+*******************/
+
+/* Contact dashboard */
+
+@media (max-width: 768px) {
+  .crm-container div.contact_panel {
+    display: block;
+  }
+}
+
+/******************
+    AFFORM layouts
+*******************/
+
+/* padding fixes */
+
+.crm-container .af-layout-inline ~ .btn-group.pull-right {
+  margin: var(--crm-padding-reg) 0;
+}
+.crm-container .crm-search-display-table .form-inline .form-group.pull-right {
+  margin-left: auto;
+}
+
+/* CiviCampaign dashboard */
+
+.crm-container #tab-campaigns,
+.crm-container #tab-surveys,
+.crm-container #tab-petitions {
+  padding: var(--crm-tab-padding);
+}
+
+/******************
+    COMMON EXTENSIONS
+*******************/
+
+/* Contact Dashboard Editor */
+
+.crm-actions-ribbon ul#actions:has(.crm-contact-summary-edit-layout) {
+  grid-template-columns: min-content min-content min-content auto min-content min-content;
+}
+.crm-container .crm-contact-summary-edit-layout a.crm-hover-button {
+  background: var(--crm-c-primary);
+  color: var(--crm-c-primary-text) !important;
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline) var(--crm-btn-padding-block) 0;
+  border: var(--crm-btn-border);
+}
+.crm-container .crm-contact-summary-edit-layout a.crm-hover-button i.crm-i {
+  padding: 0 var(--crm-btn-icon-spacing) 0 var(--crm-btn-padding-inline);
+}
+.crm-container .crm-contact-summary-edit-layout a.crm-hover-button:hover,
+.crm-container .crm-contact-summary-edit-layout a.crm-hover-button:focus {
+  background: var(--crm-c-primary-hover);
+  color: var(--crm-c-primary-text) !important;
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline) var(--crm-btn-padding-block) 0;
+}
+.crm-previous-action {
+  order: 3;
+}
+.crm-next-action {
+  order: 4;
+}
+#contactLayoutEditor .panel-heading .btn {
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+}
+
+/* Mosaico (all importants vs the extension css) */
+
+.crm-mosaico-wizard .crm_wizard__title .panel-body {
+  padding: 0 1rem;
+}
+.crm-mosaico-wizard .crm_wizard__body .form-group {
+  max-width: 100% !important;
+}
+.crm-mosaico-page .from-group .btn {
+  padding: var(--crm-padding-small);
+  height: auto;
+}
+.crm-mosaico-page .select2-container {
+  min-width: var(--crm-big-input);
+}
+.mosaico-templates-wrapper {
+  margin: 0 !important;
+}
+.mosaico-templates-wrapper .form-inline {
+  padding: var(--crm-padding-reg) 0 0 var(--crm-padding-reg);
+}
+.crm-mosaico-modal-panel {
+  margin: 0 !important;
+}
+.modal-dialog:has(.crm-mosaico-page) {
+  width: 100% !important;
+}
+.ui-widget-content.modal-dialog .crm-mosaico-page .panel {
+  border: 0;
+}
+.ui-widget-content.modal-dialog .crm-mosaico-page .panel .tab-pane {
+  border: var(--crm-tab-border);
+  border-top: 0;
+  padding: var(--crm-tab-padding);
+  background-color: var(--crm-tab-bg-active);
+  border-radius: 0 0 var(--crm-tab-roundness) var(--crm-tab-roundness);
+}
+.select2-drop.select2-drop-active.crm-container {
+  max-width: var(--crm-huge-input); /* Mosaico fix - https://lab.civicrm.org/extensions/riverlea/-/issues/23 */
+}
+.crmb-wizard-button-right {
+  display: flex;
+  justify-content: end;
+}
+.crm-mosaico-wizard .from-group {
+  display: flex;
+  gap: var(--crm-flex-gap);
+}
+.crm-mosaico-wizard .crm-mosaico-template-item.thumbnail {
+  background: var(--crm-c-background2) !important /* vs _template-item.scss */;
+  border: var(--crm-c-divider) !important /* vs _template-item.scss */;
+  border-radius: var(--crm-roundness) !important /* vs _template-item.scss */;
+}
+.crm-mosaico-wizard .crm_wizard__title .nav-pills li.disabled a {
+  color: var(--crm-c-inactive) !important /* vs _template-item.scss */;
+}
+#bootstrap-theme .crm-mosaico-template-item .crm-mosaico-template-actions {
+  display: flex !important /* vs _template-item.scss */;
+  opacity: 1 !important /* vs _template-item.scss */;
+  justify-content: center;
+  flex-direction: column;
+  padding-top: 50%;
+  align-items: center;
+}
+/******************
+    CORE EXTENSIONS
+*******************/
+
+.af-container.af-layout-cols { /* vs afCore */
+  column-gap: var(--crm-m);
+}
diff --git a/civicrm/ext/riverlea/core/css/_variables.css b/civicrm/ext/riverlea/core/css/_variables.css
new file mode 100644
index 0000000000000000000000000000000000000000..3e79fd15ca5e9cf03d912a08fdef3708e44a53b3
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/_variables.css
@@ -0,0 +1,430 @@
+/***************************
+   CORE VARIABLES
+   override in each stream
+****************************/
+
+:root {
+  --crm-version: 'v' var(--crm-release);
+/* Fonts */
+  --crm-system-fonts: unset;
+  --crm-font: unset;
+  --crm-font-bold: unset;
+  --crm-font-italic: unset;
+  --crm-font-bold-italic: unset;
+/* Colour names */
+  --crm-c-darkest: #0a0a0a;
+  --crm-c-gray-900: #2f2f2e;
+  --crm-c-gray-800: #3e3e3e;
+  --crm-c-gray-700: #696969;
+  --crm-c-gray-600: #828388;
+  --crm-c-gray-500: #919297;
+  --crm-c-gray-400: #adaeb3;
+  --crm-c-gray-300: #c2c0c0;
+  --crm-c-gray-200: #d5d5d5;
+  --crm-c-gray-100: #e2e1e1;
+  --crm-c-gray-050: #eaeaea;
+  --crm-c-gray-025: #fbfafa;
+  --crm-c-blue: #bce8f1;
+  --crm-c-blue-light: #d9edf7;
+  --crm-c-blue-dark: #297292;
+  --crm-c-blue-darker: #215c76;
+  --crm-c-purple: #4d4d69;
+  --crm-c-purple-dark: #3e3e54;
+  --crm-c-green: #d6e9c6;
+  --crm-c-green-light: #dff0d8;
+  --crm-c-green-dark: #468847;
+  --crm-c-red: #eed3d7;
+  --crm-c-red-light: #f2dede;
+  --crm-c-red-dark: #b94a48;
+  --crm-c-amber: #dd5600;
+  --crm-c-amber-light: #fbf0e2;
+  --crm-c-yellow: #fcfc5a;
+  --crm-c-yellow-light: #ffffcc;
+  --crm-c-yellow-less-light: #fffdb2;
+  --crm-c-teal: #63c4b9;
+  --crm-c-dark-teal: #3e8079;
+/* Practical colours */
+  --crm-c-text: #464354;
+  --crm-c-light-text: #fff;
+  --crm-c-dark-text: var(--crm-c-text);
+  --crm-c-link: var(--crm-c-blue-dark);
+  --crm-c-link-hover: var(--crm-c-blue-darker);
+  --crm-c-divider: 1px solid var(--crm-c-gray-300);
+  --crm-c-page-background: #fff; /* background to page body */
+  --crm-c-background: #f4f4ed; /* background to page header, often form block & dialog bg */
+  --crm-c-background2: var(--crm-c-gray-050); /* 2-5 = progressively darker backgrounds */
+  --crm-c-background3: var(--crm-c-gray-100);
+  --crm-c-background4: var(--crm-c-gray-200);
+  --crm-c-background5: var(--crm-c-gray-700);
+  --crm-c-drag-background: var(--crm-c-background3); /* background for drag/drop regions, select2 highlight */
+  --crm-c-code-background: var(--crm-c-background2); /* background for code regions */
+  --crm-c-primary: var(--crm-c-gray-700);
+  --crm-c-primary-hover: var(--crm-c-gray-800);
+  --crm-c-primary-text: var(--crm-c-light-text);
+  --crm-c-primary-hover-text: var(--crm-c-light-text);
+  --crm-c-secondary: #5d677b;
+  --crm-c-secondary-hover: #3e485b;
+  --crm-c-secondary-text: var(--crm-c-light-text);
+  --crm-c-secondary-hover-text: var(--crm-c-light-text);
+  --crm-c-success: var(--crm-c-green-dark);
+  --crm-c-success-text: var(--crm-c-light-text);
+  --crm-c-alert: var(--crm-c-red-dark);
+  --crm-c-alert-text: var(--crm-c-light-text);
+  --crm-c-warning: var(--crm-c-amber);
+  --crm-c-warning-text: var(--crm-c-light-text);
+  --crm-c-info: var(--crm-c-blue-dark);
+  --crm-c-info-text: var(--crm-c-light-text);
+  --crm-c-focus: var(--crm-c-blue-dark);
+  --crm-c-inactive: #696969;
+/* Shadows */
+  --crm-block-shadow: unset;
+  --crm-popup-shadow: 0 3px 18px 0 rgba(48,40,40,.25);
+  --crm-bottom-shadow: 0 0 16px 1px rgba(0,0,0,.1);
+  --crm-body-inset: unset;
+/* Sizes */
+  --crm-roundness: 0.25rem;
+  --crm-xs: 0.1rem;
+  --crm-xs1: 0.125rem;
+  --crm-xs2: 0.15rem;
+  --crm-s: 0.25rem;
+  --crm-s1: 0.275rem;
+  --crm-s2: 0.325rem;
+  --crm-s3: 0.375rem;
+  --crm-m: 0.5rem;
+  --crm-m1: 0.625rem;
+  --crm-m2: 0.75rem;
+  --crm-m3: 0.875rem;
+  --crm-r: 1rem;
+  --crm-r1: 1.125rem;
+  --crm-r2: 1.25rem;
+  --crm-r3: 1.375rem;
+  --crm-r4: 1.5rem;
+  --crm-l: 2rem;
+  --crm-xl: 3rem;
+  --crm-xxl: 4rem;
+  --crm-big-input: 15em;
+  --crm-huge-input: 25em;
+  --crm-padding-reg: var(--crm-r);
+  --crm-padding-small: var(--crm-s);
+  --crm-padding-inset: var(--crm-m);
+  --crm-page-padding: var(--crm-xl); /* Margin left/right */
+  --crm-page-width: 100%; /* Default that CMS can overwrite */
+  --crm-flex-gap: 0.5rem;
+/* Type */
+  --crm-font-size: var(--crm-r);
+  --crm-small-font-size: var(--crm-m2);
+  --crm-type-line-height: 1.5;
+  --crm-link-decoration: none;
+  --crm-link-decoration-hover: underline;
+  --crm-heading-bg: var(--crm-c-blue-light);
+  --crm-heading-col: var(--crm-c-text);
+  --crm-heading-padding: var(--crm-s1) var(--crm-m1);
+  --crm-heading-margin: var(--crm-m) 0;
+  --crm-heading-radius: var(--crm-roundness);
+/* Mouse events */
+  --crm-hover-clickable: pointer;
+/* Buttons */
+  --crm-btn-box-shadow: none;
+  --crm-btn-border: 0 solid transparent;
+  --crm-btn-txt-transform: inherit;
+  --crm-btn-radius: 3px;
+  --crm-btn-padding-block: var(--crm-xs1); /* padding for top and bottom, one value */
+  --crm-btn-padding-inline: var(--crm-m1); /* padding for left and right, one value */
+  --crm-btn-small-padding: var(--crm-xs) var(--crm-s);
+  --crm-btn-large-padding: var(--crm-m) var(--crm-r);
+  --crm-btn-align: center;
+  --crm-btn-height: 28px;
+  --crm-btn-icon-spacing: var(--crm-s);
+  --crm-btn-icon-size: auto;
+  --crm-btn-cancel-bg: var(--crm-c-alert);
+  --crm-btn-cancel-text: var(--crm-c-alert-text);
+  --crm-btn-info-bg: var(--crm-c-info);
+  --crm-btn-info-text: var(--crm-c-info-text);
+  --crm-btn-warning-bg: var(--crm-c-warning);
+  --crm-btn-warning-text: var(--crm-c-warning-text);
+  --crm-btn-success-bg: var(--crm-c-success);
+  --crm-btn-success-text: var(--crm-c-success-text);
+  --crm-btn-alert-bg: var(--crm-c-alert);
+  --crm-btn-alert-text: var(--crm-c-alert-text);
+  --crm-btn-icon-bg: unset; /* btn-icon-* supports distinct border/bg for icons. If applied, set btn-icon-padding to 0px to make the icon bg stretch to the button */
+  --crm-btn-icon-border: unset;
+  --crm-btn-icon-padding: var(--crm-btn-padding-block);
+  --crm-btn-margin: 0; /* used to add padding block between multiple stacked buttons */
+/* Tables */
+  --crm-table-outside-border: 1px solid var(--crm-c-background3);
+  --crm-table-background: var(--crm-c-page-background);
+  --crm-table-row-border: var(--crm-c-divider);
+  --crm-table-column-border: 0 solid transparent;
+  --crm-table-font-size: var(--crm-font-size);
+  --crm-table-padding: var(--crm-m);
+  --crm-table-header-border: 1px solid transparent;
+  --crm-table-header-bottom: 2px solid var(--crm-c-gray-300);
+  --crm-table-header-bg: var(--crm-c-page-background);
+  --crm-table-header-col: var(--crm-c-text);
+  --crm-table-header-txt: inherit;
+  --crm-table-even-row: var(--crm-c-background2);
+  --crm-table-even-hover: var(--crm-c-yellow-less-light);
+  --crm-table-odd-row: var(--crm-c-gray-025);
+  --crm-table-odd-hover: var(--crm-c-yellow-light);
+  --crm-table-sort-col: var(--crm-c-gray-300);
+  --crm-table-sort-float: left; /* 'left', 'right' or 'none' */
+  --crm-table-sort-active-col: var(--crm-c-link);
+  --crm-table-compressed-width: auto;
+  --crm-table-nested-padding: var(--crm-r) var(--crm-m);
+  --crm-table-nested-head-border: 0 solid transparent;
+  --crm-table-nested-border: var(--crm-c-divider);
+  --crm-table-inset-bg: var(--crm-c-background3);
+/* Panels */
+  --crm-panel-shadow: var(--crm-block-shadow);
+  --crm-panel-background: var(--crm-c-page-background);
+  --crm-panel-border: var(--crm-c-divider);
+  --crm-panel-head-margin: 0px;
+/* Accordions */
+  --crm-expand-icon: "\f0da"; /* unicode value for FontAwesome icon */
+  --crm-expand-icon-color: var(--text);
+  --crm-expand-icon-spacing: var(--crm-m);
+  --crm-expand-transform: rotate(90deg);
+  --crm-expand-transition: transform .3s;
+  --crm-expand-radius: var(--crm-roundness);
+  --crm-expand-gap: var(--crm-xs2) 0 0; /* space between multiple accordions */
+/* .crm-accordion-bold */
+  --crm-expand-header-bg: var(--crm-c-secondary);
+  --crm-expand-header-bg-active: var(--crm-c-gray-900);
+  --crm-expand-header-color: var(--crm-c-light-text);
+  --crm-expand-header-padding: var(--crm-s) var(--crm-m);
+  --crm-expand-header-weight: bold;
+  --crm-expand-header-font: var(--crm-font-bold);
+  --crm-expand-header-border: var(--crm-c-divider);
+  --crm-expand-header-border-width: 0 0 1px 0;
+  --crm-expand-border: var(--crm-c-divider);
+  --crm-expand-border-width: 0 1px 1px 1px;
+  --crm-expand-body-bg: unset;
+  --crm-expand-body-box-shadow: unset;
+  --crm-expand-body-padding: var(--crm-padding-reg);
+/* .crm-accordion-light */
+  --crm-expand2-header-bg: unset;
+  --crm-expand2-header-bg-active: var(--crm-c-background-2);
+  --crm-expand2-header-weight: normal;
+  --crm-expand2-header-font: unset;
+  --crm-expand2-header-color: var(--crm-c-text);
+  --crm-expand2-header-border: unset;
+  --crm-expand2-header-border-width: unset;
+  --crm-expand2-header-padding: var(--crm-s) var(--crm-m);
+  --crm-expand2-border: unset;
+  --crm-expand2-border-width: unset;
+  --crm-expand2-body-bg: unset;
+  --crm-expand2-body-padding: var(--crm-s);
+/* Alerts */
+  --crm-alert-padding: var(--crm-m) var(--crm-m2);
+  --crm-alert-margin: 0 0 var(--crm-m);
+  --crm-alert-border-width: 1px;
+  --crm-alert-background-help: var(--crm-c-green-light);
+  --crm-alert-border-help: var(--crm-c-green);
+  --crm-alert-text-help: var(--crm-c-green-dark);
+  --crm-alert-background-warning: var(--crm-c-yellow-light);
+  --crm-alert-border-warning: var(--crm-c-yellow);
+  --crm-alert-text-warning: var(--crm-c-text);
+  --crm-alert-background-info: var(--crm-c-blue-light);
+  --crm-alert-border-info: var(--crm-c-blue);
+  --crm-alert-text-info: var(--crm-c-blue-dark);
+  --crm-alert-background-danger: var(--crm-c-red-light);
+  --crm-alert-border-danger: var(--crm-c-red);
+  --crm-alert-text-danger: var(--crm-c-red-dark);
+/* Form */
+  --crm-form-block-box-shadow: var(--crm-block-shadow);
+  --crm-form-block-background: var(--crm-c-background);
+  --crm-form-block-padding: var(--crm-m);
+  --crm-form-block-border-radius: var(--crm-roundness);
+  --crm-input-background: var(--crm-c-page-background);
+  --crm-input-background-image: linear-gradient(top, #eee 1%, #fff 15%);
+  --crm-input-color: var(--crm-c-text);
+  --crm-input-border-color: var(--crm-c-gray-400);
+  --crm-input-border-radius: 3px;
+  --crm-input-active-ani: border-color .15s ease-in-out 0s;
+  --crm-input-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,.1);
+  --crm-input-padding: var(--crm-xs1) var(--crm-s2);
+  --crm-input-padding-large: var(--crm-s) var(--crm-m1);
+  --crm-input-height: var(--crm-l);
+  --crm-input-font-size: var(--crm-m3);
+  --crm-input-label-weight: 600;
+  --crm-input-label-font: var(--crm-font);
+  --crm-input-label-size: var(--crm-font-size);
+  --crm-input-label-width: var(--crm-big-input);
+  --crm-input-label-align: right;
+  --crm-input-label-color: var(--crm-c-text);
+  --crm-input-description: var(--crm-c-gray-700);
+  --crm-input-dropdown-icon: "\f107";
+  --crm-input-radio-color: var(--crm-c-focus);
+  --crm-form-select-bg: var(--crm-c-background2);
+  --crm-inline-edit-border: 0 solid transparent;
+  --crm-inline-edit-bg: var(--crm-c-background);
+  --crm-fieldset-border-color: var(--crm-c-gray-400);
+  --crm-fieldset-border: 1px 0 0 0;
+  --crm-fieldset-padding: var(--crm-padding-reg) var(--crm-padding-small);
+  --crm-checkbox-list-col: var(--crm-c-text);
+/* Tabs */
+  --crm-tabs-bg: var(--crm-c-background4);
+  --crm-tabs-padding: var(--crm-s);
+  --crm-tabs-border: var(--crm-dash-border);
+  --crm-tabs-radius: var(--crm-roundness);
+  --crm-tabs-gap: var(--crm-s);
+  --crm-tab-bg: var(--crm-c-background2);
+  --crm-tab-bg-hover: var(--crm-c-background);
+  --crm-tab-bg-active: var(--crm-c-page-background);
+  --crm-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip */
+  --crm-tab-padding: var(--crm-s3) var(--crm-m) var(--crm-s) var(--crm-m);
+  --crm-tab-col: var(--crm-c-text);
+  --crm-tab-weight: normal;
+  --crm-tab-font: unset;
+  --crm-tab-count-bg: var(--crm-c-info-text);
+  --crm-tab-count-col: var(--crm-c-info);
+  --crm-tab-roundness: var(--crm-roundness);
+  --crm-tab-border: var(--crm-c-divider);
+  --crm-tab-border-width: 0;
+  --crm-tab-border-active: 0 solid transparent;
+/* Contact dashboard */
+  --crm-dash-border: var(--crm-tab-border);
+  --crm-dash-roundness: var(--crm-roundness);
+  --crm-dash-direction: flex; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */
+  --crm-side-tabs-width: unset;
+  --crm-dash-tabs-flow: row; /* choose 'row' for tabs at top, or 'column' for tabs at side */
+  --crm-dash-tabs-gap: var(--crm-tabs-gap);
+  --crm-dash-tabs-bg: var(--crm-tabs-bg);
+  --crm-dash-tabs-padding: var(--crm-tabs-padding);
+  --crm-dash-tabs-roundness: var(--crm-dash-roundness) var(--crm-dash-roundness) 0 0;
+  --crm-dash-tab-bg: var(--crm-tab-bg);
+  --crm-dash-tab-bg-hover: var(--crm-tab-bg-hover);
+  --crm-dash-tab-padding: var(--crm-s3) var(--crm-m2);
+  --crm-dash-tab-border: 0 solid transparent;
+  --crm-dash-tab-border-hover: 0 solid transparent;
+  --crm-dash-tab-border-width: 0; /* to remove border on one side for hanging tabs */
+  --crm-dash-tab-col: var(--crm-tab-col);
+  --crm-dash-tab-count-bg: rgba(0,0,0,0.1);
+  --crm-dash-tab-count-col: var(--crm-c-text);
+  --crm-dash-tab-width: 100%;
+  --crm-dash-tab-align: none;
+  --crm-dash-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip */
+  --crm-dash-tab-radius: var(--crm-dash-roundness);
+  --crm-dash-icon-size: var(--crm-r);
+  --crm-dash-summary-row-bg: var(--crm-c-background);
+  --crm-dash-heading-inset: 0;
+  --crm-dash-box-shadow: 0;
+  --crm-dash-panel-padding: var(--crm-m);
+  --crm-dash-panel-bg: #fff;
+  --crm-dash-panel-border: 0;
+  --crm-dash-panel-radius: 0 0 var(--crm-dash-roundness) var(--crm-dash-roundness);
+  --crm-dash-edit-border: 2px dashed var(--crm-c-gray-300);
+  --crm-dash-block-padding: 0;
+  --crm-dash-block-bg: unset;
+  --crm-dash-block-radius: var(--crm-roundness);
+  --crm-dash-label-bg: var(--crm-c-background2);
+  --crm-dash-header-bg: var(--crm-c-page-background);
+  --crm-dash-header-bg2: transparent;
+  --crm-dash-header-col: var(--crm-c-text);
+  --crm-dash-header-size: var(--crm-r3);
+  --crm-dash-header-padding: 0 0 var(--crm-r) 0;
+  --crm-dash-image-size: 100px;
+  --crm-dash-image-radius: 0;
+  --crm-dash-image-right: 10px; /* distance from right of dashboard */
+  --crm-dash-image-top: unset; /* distance from top of dashboard */
+  --crm-dash-image-border: 0;
+/* Dialog */
+  --crm-dialog-bg: var(--crm-c-page-background);
+  --crm-dialog-padding: var(--crm-s);
+  --crm-dialog-radius: var(--crm-roundness);
+  --crm-dialog-line: unset;
+  --crm-dialog-inner-shadow: var(--crm-bottom-shadow);
+  --crm-dialog-header-bg: var(--crm-c-secondary);
+  --crm-dialog-header-col: var(--crm-c-light-text);
+  --crm-dialog-header-size: var(--crm-r1);
+  --crm-dialog-header-padding: var(--crm-m1) var(--crm-r);
+  --crm-dialog-header-radius: var(--crm-dialog-radius);
+  --crm-dialog-header-border-col: transparent transparent var(--crm-c-gray-300) transparent; /* set a border color for each side of the header */
+  --crm-dialog-body-bg: var(--crm-c-background);
+  --crm-dialog-body-padding: var(--crm-m);
+/* Dashlet */
+  --crm-dashlet-border: unset;
+  --crm-dashlet-bg: var(--crm-c-page-background);
+  --crm-dashlet-padding: var(--crm-s2);
+  --crm-dashlet-box-shadow: var(--crm-popup-shadow);
+  --crm-dashlet-dashlets-bg: var(--crm-c-background);
+  --crm-dashlet-header-bg: var(--crm-expand-header-bg);
+  --crm-dashlet-header-col: var(--crm-expand-header-color);
+  --crm-dashlet-header-border: unset;
+  --crm-dashlet-header-border-width: unset;
+  --crm-dashlet-header-font-size: var(--crm-font-size);
+  --crm-dashlet-header-padding: var(--crm-s);
+  --crm-dashlet-content-padding: var(--crm-dashlet-padding) 0;
+  --crm-dashlet-tabs-border: 0;
+  --crm-dashlet-radius: var(--crm-roundness);
+/* Button dropdowns */
+  --crm-dropdown-padding: var(--crm-s);
+  --crm-dropdown-radius: var(--crm-roundness);
+  --crm-dropdown-bg: var(--crm-c-secondary-hover);
+  --crm-dropdown-col: var(--crm-c-light-text);
+  --crm-dropdown-hover: var(--crm-c-text);
+  --crm-dropdown-hover-bg: var(--crm-c-page-background);
+  --crm-dropdown-border: 0;
+  --crm-dropdown-width: 180px;
+  --crm-dropdown-alert-bg: var(--crm-c-alert); /* for delete links in dropdowns */
+  --crm-dropdown-2-bg: var(--crm-c-secondary);
+  --crm-dropdown-2-col: var(--crm-c-text);
+  --crm-dropdown-2-padding: var(--crm-padding-small);
+/* Notifications */
+  --crm-notify-background: rgba(0,0,0,0.85);
+  --crm-notify-padding: var(--crm-m2);
+  --crm-notify-col: var(--crm-c-light-text);
+  --crm-notify-accent-border: 2px 0 0 0; /* adds a border to one/several sides of the notification - set to 0 for none */
+  --crm-notify-radius: var(--crm-roundness);
+/* Icons */
+  --crm-icon-alert: "\f06a";
+  --crm-icon-success: "\f058";
+  --crm-icon-info: "\f05a";
+  --crm-icon-close: "\f00d";
+  --crm-icon-sort: "\f0dc";
+  --crm-icon-sort-desc: "\f0dd";
+  --crm-icon-sort-asc: "\f0de";
+  --crm-icon-alert-color: inherit;
+  --crm-icon-success-color: inherit;
+  --crm-icon-warning-color: inherit;
+  --crm-icon-info-color: inherit;
+/* Wizard */
+  --crm-wizard-width: fit-content;
+  --crm-wizard-margin: 0.5rem auto;
+  --crm-wizard-height: 30px;
+  --crm-wizard-radius: var(--crm-l);
+  --crm-wizard-angle: 0px;
+  --crm-wizard-active-col: var(--crm-c-light-text);
+  --crm-wizard-active-bg: var(--crm-c-link);
+  --crm-wizard-border: var(--crm-c-divider);
+  --crm-wizard-bg: var(--crm-c-page-background);
+/* Alpha filter */
+  --crm-filter-bg: var(--crm-c-blue-light);
+  --crm-filter-padding: var(--crm-m);
+  --crm-filter-item-bg: #fafafa;
+  --crm-filter-item-shadow: 0px 0px 3px rgba(0,0,0,0.1);
+  --crm-filter-spacing: space-between; /* choose 'space-between' to spread out evenly, 'start' for left align, or 'end' for right. */
+/* Frontend */
+  --crm-f-form-width: unset;
+  --crm-f-box-shadow: var(--crm-block-shadow);
+  --crm-f-fieldset-bg: #f8f8f8;
+  --crm-f-fieldset-padding: var(--crm-r);
+  --crm-f-fieldset-margin: 0 0 var(--crm-padding-reg) 0;
+  --crm-f-fieldset-border: 0;
+  --crm-f-legend-align: center;
+  --crm-f-legend-size: var(--crm-r3);
+  --crm-f-form-padding: var(--crm-padding-reg);
+  --crm-f-form-layout: block; /* 'grid' = inline, 'block' = stacked */
+  --crm-f-label-position: unset;
+  --crm-f-label-align: left;
+  --crm-f-label-width: 200px;
+  --crm-f-label-weight: bold;
+  --crm-f-input-radius: var(--crm-roundness);
+  --crm-f-input-padding: var(--crm-r2) var(--crm-m2);
+  --crm-f-input-font-size: var(--crm-r1);
+  --crm-f-input-width: 300px;
+  --crm-f-form-focus-bg: var(--crm-c-green);
+  --crm-f-form-error-bg: var(--crm-c-red);
+  --crm-f-logo-height: 40px;
+  --crm-f-logo-align: center; /* left, right or center */
+}
diff --git a/civicrm/ext/riverlea/core/css/admin.css b/civicrm/ext/riverlea/core/css/admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..729b786d876b6e04dac3fba6bb10e6fd077b7966
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/admin.css
@@ -0,0 +1,103 @@
+/* civicrm-core/css/admin.css - branched on 7 Jun 24
+   Styles specific to certain admin pages/forms
+   Status: merged. */
+
+/* Config Task List */
+.crm-container td.tasklist a {
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+}
+.crm-container table.selector td.tasklist {
+  border-right: var(--crm-table-row-border);
+  width: 20%;
+}
+.crm-container td.tasklist a:visited {
+  color: var(--crm-c-success);
+}
+
+/* Class for successful upgrade */
+.crm-container .upgrade-success {
+  background-color: var(--crm-alert-background-help);
+  color: var(--crm-alert-text-help);
+}
+
+/* Extension management */
+.crm-container #mainTabContainer:has(.crm-extensions-tabs-list) {
+  box-shadow: var(--crm-block-shadow);
+  margin-top: var(--crm-padding-reg);
+}
+.crm-container #extensions-main,
+.crm-container #extensions-addnew.ui-tabs-panel {
+  padding: 0;
+  border-top: 0;
+}
+.crm-container #extensions-main table.dataTable,
+.crm-container #extensions-addnew table.dataTable {
+  box-shadow: none;
+  border: 0 solid transparent;
+}
+.crm-container #extensions-main table.dataTable th,
+.crm-container #extensions-addnew table.dataTable th {
+  background-color: var(--crm-tab-bg-active);
+  min-width: max-content;
+  white-space: nowrap; /* prevents wrapping of sort icons with oversized descriptions */
+}
+.crm-container #extensions-main table.dataTable summary,
+.crm-container #extensions-addnew table.dataTable summary {
+  padding: 0;
+  background-color: unset;
+  color: var(--crm-c-text);
+  font-weight: unset;
+  font-family: var(--crm-font);
+}
+.crm-container #extensions table.dataTable summary a,
+.crm-container #extensions-addnew table.dataTable summary a {
+  color: var(--crm-c-link);
+}
+.crm-container #extensions table.dataTable a.crm-hover-button,
+.crm-container #extensions-addnew table.dataTable a.crm-hover-button {
+  padding: 0 var(--crm-m1);
+}
+.crm-container .disabled .crm-hover-button:hover,
+.crm-container .disabled .crm-hover-button:focus {
+  color: var(--crm-c-secondary-text);
+}
+.crm-container .extension-missing {
+  color: var(--crm-c-warning);
+}
+.crm-container .crm-extensions-upgrade {
+  background: var(--crm-alert-background-warning);
+  border: 1px solid var(--crm-alert-border-warning);
+  padding: var(--crm-padding-small);
+  border-radius: var(--crm-roundness);
+  color: var(--crm-alert-text-warning);
+}
+.crm-container .crm-extensions-version {
+  white-space: nowrap;
+}
+.crm-container .crm-extensions-stage {
+  margin-left: var(--crm-s);
+}
+.crm-container .crm-extensions-stage.fa-flask {
+  color: var(--crm-c-warning);
+}
+.crm-container .crm-extensions-stage.fa-check-circle {
+  color: var(--crm-c-success);
+}
+
+@media screen and (min-width: 480px) {
+  .crm-container .admin-section-items {
+    column-count: 2;
+    column-gap: var(--crm-padding-reg);
+  }
+  .crm-container .admin-section-items dl {
+    -webkit-column-break-inside: avoid;
+    page-break-inside: avoid;
+    break-inside: avoid;
+    margin: 0 var(--crm-padding-reg);
+  }
+  .crm-container .admin-section-items dt {
+    font-weight: bold;
+    font-family: var(--crm-font-bold);
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/api4-explorer.css b/civicrm/ext/riverlea/core/css/api4-explorer.css
new file mode 100644
index 0000000000000000000000000000000000000000..e978bb90d9fd142621180509ed383d807a201e8b
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/api4-explorer.css
@@ -0,0 +1,179 @@
+/* Style rules for Api4 Explorer
+   Forked on 12 June 24. Called on API4Explorer page only.
+   Status: merged. */
+
+.api4-explorer-row.crm-flex-box {
+  gap: var(--crm-padding-reg);
+  margin-bottom: var(--crm-padding-reg);
+  min-height: 500px;
+}
+.api4-explorer-row .explorer-params-panel,
+.api4-explorer-row .explorer-code-panel {
+  flex: 2;
+}
+.api4-explorer-row > .panel {
+  margin: 0;
+  background: var(--crm-panel-background);
+}
+.api4-explorer-page .panel-heading {
+  /* height: 48px; */
+  display: flex;
+  align-items: center;
+  padding: var(--crm-m);
+}
+.api4-explorer-row .panel-heading h3 {
+  background: transparent;
+  margin: 0 !important /* vs bootstrap3 */;
+  padding: 0 !important /* vs bootstrap3 */;
+}
+.api4-explorer-row .panel-heading .form-inline {
+  width: 100%;
+  padding: 0;
+  display: flex;
+  align-items: center;
+  gap: var(--crm-m);
+  flex-wrap: wrap;
+}
+.api4-explorer-row .panel-heading .form-inline .pull-right {
+  margin-left: auto;
+}
+.api4-explorer-row .panel-body {
+  background: var(--crm-tab-bg-active);
+}
+
+/* General form */
+.api4-explorer-page form label,
+.api4-explorer-page fieldset legend {
+  text-transform: capitalize;
+}
+.api4-explorer-page .api4-input-group {
+  display: inline-block;
+}
+.api4-explorer-page i.fa-arrows {
+  cursor: move;
+}
+.api4-input {
+  display: flex;
+  gap: var(--crm-m);
+  margin-bottom: var(--crm-m);
+}
+.api4-input label {
+  display: flex;
+}
+.api4-explorer-page form label {
+  min-width: var(--crm-input-label-width);
+}
+.api4-explorer-page form .checkbox-inline > label {
+  min-width: unset;
+}
+.api4-explorer-page .form-control.huge {
+  width: 25em;
+}
+.api4-explorer-page .form-control.twenty {
+  width: 20em;
+}
+
+/* Code panel */
+.api4-explorer-page .explorer-code-panel pre {
+  word-break: break-all;
+  white-space: pre-wrap;
+  min-height: var(--crm-xxl);
+}
+.api4-explorer-page .explorer-code-panel .panel-heading > .nav li a {
+  text-transform: uppercase;
+}
+.api4-explorer-page .explorer-code-panel .alert-warning i.crm-i {
+  font-family: inherit; /* Fix for unclosed icon tag */
+}
+.api4-explorer-page .explorer-code-panel .alert-warning i.crm-i::before {
+  font: normal normal normal 14px/1 FontAwesome; /* Fix for unclosed icon tag */
+}
+
+/* Results panel */
+.crm-container .explorer-result-panel > .panel-heading {
+  border-bottom: var(--crm-tabs-border);
+}
+.explorer-result-panel .form-inline.pull-right {
+  order: 2;
+  justify-content: end;
+}
+.explorer-result-panel .panel-heading .nav-tabs {
+  width: 100%;
+  align-self: end;
+  border-bottom: 0;
+}
+.explorer-result-panel .nav-tabs i.fa-circle-o {
+  display: none;
+}
+
+/* From original file, unsure of use, leaving intact for now */
+#bootstrap-theme.api4-explorer-page crm-api4-clause > .btn-group {
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+#bootstrap-theme.api4-explorer-page crm-api4-clause > .btn-group .btn {
+  border: 0 none;
+}
+.api4-explorer-page fieldset div.api4-input.ui-sortable-helper {
+  background-color: rgba(255, 255, 255, .9);
+}
+.api4-explorer-page fieldset div.api4-input.ui-sortable-helper {
+  background-color: rgba(255, 255, 255, .9);
+}
+.api4-explorer-page .api4-clause-fieldset fieldset {
+  float: right;
+  width: calc(100% - 58px);
+  margin-top: -8px;
+}
+.api4-explorer-page .api4-clause-fieldset.api4-sorting fieldset .api4-clause-group-sortable {
+  min-height: 3.5em;
+}
+.api4-explorer-page .api4-clause-badge {
+  width: 55px;
+  display: inline-block;
+  cursor: move;
+}
+.api4-explorer-page .api4-clause-badge .badge {
+  opacity: .5;
+  position: relative;
+}
+.api4-explorer-page .api4-clause-badge .caret {
+  margin: 0;
+}
+.api4-explorer-page .api4-clause-badge .crm-i {
+  display: none;
+  padding: 0 6px;
+}
+.api4-explorer-page .ui-sortable-helper .api4-clause-badge .badge span {
+  display: none;
+}
+.api4-explorer-page .ui-sortable-helper .api4-clause-badge .crm-i {
+  display: inline-block;
+}
+.api4-explorer-page .api4-operator,
+.api4-explorer-page .api4-sets-action,
+.api4-explorer-page .api4-sets-type,
+.api4-explorer-page .api4-chain-index,
+.api4-explorer-page .api4-chain-action {
+  width: 90px;
+}
+.api4-explorer-page .api4-sets-params,
+.api4-explorer-page .api4-chain-params {
+  width: calc(100% - 390px);
+}
+.api4-explorer-page .api4-add-where-group-menu {
+  min-width: 80px;
+  background-color: rgba(186, 225, 251, 0.94);
+}
+.api4-explorer-page .api4-add-where-group-menu a {
+  padding: var(--crm-s) var(--crm-m);
+}
+/* Responsive (move to own file at some point) */
+
+@media (max-width: 989px) {
+  /* base/position */ .crm-container .crm-flex-box,
+  /* sections/api4-explorer */ .api4-input {
+    flex-direction: column;
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/civicrm.css b/civicrm/ext/riverlea/core/css/civicrm.css
new file mode 100644
index 0000000000000000000000000000000000000000..01f588409a0f414c9b7f56b9a1994ee75e2a9630
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/civicrm.css
@@ -0,0 +1,4 @@
+@import url(_base.css); /* resets and civi wide styles */
+@import url(_cms.css); /* CMS-specific hacks/workarounds */
+@import url(_core.css); /* components and utility classes */
+@import url(_fixes.css); /* deprecated-Civi handling, hacks/workarounds. one day this will go. */
diff --git a/civicrm/ext/riverlea/core/css/components/_accordion.css b/civicrm/ext/riverlea/core/css/components/_accordion.css
new file mode 100644
index 0000000000000000000000000000000000000000..b1023bc0bb1eb04c1a158b467701dfca7f45d285
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_accordion.css
@@ -0,0 +1,155 @@
+.crm-container details {
+  background-color: unset;
+  border-radius: var(--crm-expand-radius);
+  margin: var(--crm-expand-gap);
+}
+.crm-container summary {
+  display: list-item;
+  list-style: none;
+  cursor: var(--crm-hover-clickable);
+  font-size: var(--crm-font-size);
+  font-family: var(--crm-expand-header-font);
+  font-weight: var(--crm-expand-header-weight);
+  color: var(--crm-c-text);
+  border-radius: var(--crm-expand-radius);
+  padding: var(--crm-expand-header-padding);
+}
+.crm-container details[open] > summary { /* open version of that */
+  border-radius: var(--crm-expand-radius) var(--crm-expand-radius) 0 0;
+}
+.crm-container table summary { /* Makes summary match the size of the rest of the table it's in */
+  font-size: inherit;
+}
+.crm-container summary::-webkit-details-marker { /* Safari fix to remove summary icon */
+  display: none;
+}
+.crm-container details ~ details {
+  margin: var(--crm-expand-gap);
+}
+.crm-container details:has(input.crm-inline-error) summary,
+.crm-container details:has(input.crm-inline-error) summary.active {
+  background-color: var(--crm-alert-background-danger);
+  color: var(--crm-alert-text-danger);
+  border-color: var(--crm-alert-border-danger);
+}
+
+/* Expand/collapse icons */
+.crm-container details > summary::before {
+  font-size: var(--crm-font-size);
+  content: var(--crm-expand-icon);
+  color: var(--crm-expand-icon-color);
+  font-style: normal;
+  line-height: 1.35;
+  font-family: FontAwesome;
+  text-rendering: auto;
+  text-indent: inherit;
+  margin-right: var(--crm-expand-icon-spacing);
+  display: inline-block;
+  transform-origin: center center;
+  transition: var(--crm-expand-transition);
+}
+.crm-container details[open] > summary::before {
+  transform: var(--crm-expand-transform);
+  transition: var(--crm-expand-transition);
+}
+
+/* Style 1 'bold' */
+.crm-container .crm-accordion-bold {
+  background-color: var(--crm-expand-body-bg);
+}
+.crm-container .crm-accordion-bold > summary {
+  background-color: var(--crm-expand-header-bg);
+  color: var(--crm-expand-header-color);
+  border: var(--crm-expand-header-border);
+  border-width: var(--crm-expand-header-border-width);
+  font-weight: var(--crm-expand-header-weight);
+  font-family: var(--crm-expand-header-font);
+}
+.crm-container .crm-accordion-bold > summary a {
+  color: var(--crm-expand-header-color);
+}
+.crm-container .crm-accordion-bold > summary.active,
+.crm-container .crm-accordion-bold > summary:hover,
+.crm-container .crm-accordion-bold > summary:focus { /* hover version of that */
+  background-color: var(--crm-expand-header-bg-active);
+}
+.crm-container .crm-accordion-bold > .crm-accordion-body {
+  padding: var(--crm-expand-body-padding);
+  border: var(--crm-expand-border);
+  border-width: var(--crm-expand-border-width);
+  border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius);
+  box-shadow: var(--crm-expand-body-box-shadow);
+}
+.crm-container details.crm-accordion-bold:not( > summary) {
+  border: var(--crm-expand-border);
+  padding: var(--crm-expand-body-padding);
+}
+
+/* Style 2 'light' */
+.crm-container .crm-accordion-light {
+  background-color: var(--crm-expand2-body-bg);
+}
+.crm-container .crm-accordion-light > summary {
+  font-family: var(--crm-expand2-header-font);
+  font-weight: var(--crm-expand2-header-weight);
+  background-color: var(--crm-expand2-header-bg);
+  color: var(--crm-expand2-header-color);
+  border: var(--crm-expand2-header-border);
+  border-width: var(--crm-expand2-header-border-width);
+  padding: var(--crm-expand2-header-padding);
+}
+.crm-container .crm-accordion-light > summary.active,
+.crm-container .crm-accordion-light > summary:hover,
+.crm-container .crm-accordion-light > summary:focus { /* hover version of that */
+  background-color: var(--crm-expand2-header-bg-active);
+}
+.crm-container .crm-accordion-light > summary a {
+  color: var(--crm-expand2-header-color);
+}
+.crm-container .crm-accordion-light > .crm-accordion-body {
+  padding: var(--crm-expand2-body-padding);
+  background: var(--crm-expand2-body-bg);
+  border: var(--crm-expand2-border);
+  border-width: var(--crm-expand2-border-width);
+  border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius);
+}
+.crm-container details.crm-accordion-light:not( > summary) {
+  border: 0;
+  padding: 0;
+}
+
+/* Style 3 'settings' */
+.crm-container details.crm-accordion-settings summary {
+  text-align: right;
+}
+.crm-container details.crm-accordion-settings summary::before {
+  content: '\f013';
+}
+.crm-container details.crm-accordion-settings > .crm-accordion-body {
+  padding: var(--crm-expand2-header-padding);
+}
+
+/* Contact dashboard */
+#contact-summary details,
+#contact-summary .crm-accordion-light > summary,
+#contact-summary .crm-accordion-light > summary.active,
+#contact-summary .crm-accordion-light > summary:hover,
+#contact-summary .crm-accordion-light > summary:focus,
+#Contact .crm-accordion-light > summary,
+#Contact .crm-accordion-light > summary:hover,
+#Contact .crm-accordion-light > summary:focus {
+  box-shadow: none;
+  border: 0 solid transparent;
+  background-color: transparent;
+  color: var(--crm-c-text);
+}
+#contact-summary details .crm-summary-block {
+  box-shadow: var(--crm-block-shadow);
+  margin-bottom: 0;
+}
+#contact-summary summary {
+  padding: var(--crm-m) !important;
+}
+#contact-summary details .crm-accordion-body {
+  box-shadow: none;
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_alerts.css b/civicrm/ext/riverlea/core/css/components/_alerts.css
new file mode 100644
index 0000000000000000000000000000000000000000..f14c502586af99fbad97378f29047138ea17d233
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_alerts.css
@@ -0,0 +1,109 @@
+.crm-container .help,
+.crm-container #help,
+.crm-container .status,
+.crm-container .messages,
+.crm-container .alert,
+.crm-container .alert-success {
+  background-color: var(--crm-alert-background-help);
+  border: var(--crm-alert-border-width) solid var(--crm-alert-border-help);
+  color: var(--crm-alert-text-help);
+  margin: var(--crm-alert-margin);
+  padding: var(--crm-alert-padding);
+  border-radius: var(--crm-roundness);
+}
+.crm-container .help > *:first-child {
+  margin-top: 0;
+}
+.crm-container .help p,
+.crm-container .status p,
+.crm-container .messages p,
+.crm-container .alert p {
+  color: var(--crm-alert-text-help);
+}
+.crm-container .help li,
+.crm-container .status li,
+.crm-container .messages li {
+  color: var(--crm-alert-text-help);
+  list-style: initial;
+}
+.crm-container .status.alert,
+.crm-container .alert-warning,
+.crm-container .messages.warning {
+  background-color: var(--crm-alert-background-warning);
+  border-color: var(--crm-alert-border-warning);
+  color: var(--crm-alert-text-warning);
+}
+.crm-container .status.error {
+  background-color: var(--crm-alert-background-danger);
+  border-color: var(--crm-alert-border-danger);
+  color: var(--crm-alert-text-danger);
+}
+.crm-container .status.alert li,
+.crm-container .alert-warning li,
+.crm-container .messages.warning li {
+  color: var(--crm-alert-text-warning);
+}
+.crm-container .status.crm-ok {
+  background-color: var(--crm-alert-background-help);
+  color: var(--crm-alert-text-info);
+}
+.crm-container .alert-info,
+.crm-container .messages.crm-empty-table {
+  background-color: var(--crm-alert-background-info);
+  border-color: var(--crm-alert-border-info);
+  color: var(--crm-alert-text-info);
+}
+.crm-container .alert-danger {
+  background-color: var(--crm-alert-background-danger);
+  border-color: var(--crm-alert-border-danger);
+  color: var(--crm-alert-text-danger);
+}
+.crm-container .help a,
+.crm-container .messages a {
+  color: inherit;
+  text-decoration: underline;
+}
+.crm-container .help a:hover,
+.crm-container .messages a:hover,
+.crm-container .help a:focus,
+.crm-container .messages a:focus {
+  color: inherit;
+  text-decoration: none;
+}
+
+/* BS alert close */
+
+.crm-container button.close,
+#bootstra-theme button.close {
+  float: right;
+  padding: 0;
+  border: 0;
+  cursor: var(--crm-hover-clickable);
+  background: transparent;
+  appearance: none;
+  font-size: var(--crm-r1);
+  line-height: 1;
+  color: var(--crm-c-darkest) !important;
+  text-shadow: 0 1px 0 #fff;
+  font-family: var(--crm-font-bold);
+  font-weight: bold;
+  opacity: .2;
+}
+.crm-container button.close:hover,
+.crm-container button.close:focus,
+#bootstra-theme button.close:hover,
+#bootstra-theme button.close:focus {
+  background: transparent;
+  opacity: 0.4;
+}
+.crm-container .alert-dismissable,
+.crm-container .alert-dismissible {
+  padding-right: 35px;
+}
+.crm-container .alert-dismissable .close,
+.crm-container .alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_buttons.css b/civicrm/ext/riverlea/core/css/components/_buttons.css
new file mode 100644
index 0000000000000000000000000000000000000000..cbaac1d2e4c16c53a9117b382393f83307bbc59c
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_buttons.css
@@ -0,0 +1,593 @@
+.crm-container .btn,
+#bootstrap-theme .btn,
+.crm-container button,
+.crm-container .crm-button,
+.crm-container [type="button"],
+.crm-container [type="reset"],
+.crm-container [type="submit"],
+.crm-container .nav.nav-pills li.navitem a {
+  white-space: nowrap;
+  touch-action: manipulation;
+  cursor: var(--crm-hover-clickable);
+  background-image: none;
+  border: var(--crm-btn-border);
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+  font-size: var(--crm-font-size);
+  border-radius: var(--crm-btn-radius);
+  user-select: none;
+  margin: var(--crm-btn-margin);
+  background: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+  text-transform: var(--crm-btn-txt-transform);
+  height: var(--crm-btn-height);
+  display: inline-flex;
+  max-width: fit-content;
+  align-items: center;
+  gap: var(--crm-btn-icon-spacing);
+  width: auto;
+  box-shadow: none;
+  text-decoration: none;
+}
+.crm-container .btn:hover,
+.crm-container .btn:focus,
+#bootstrap-theme .btn:hover,
+#bootstrap-theme .btn:focus,
+.crm-container .crm-button:hover,
+.crm-container .crm-button:focus,
+[type="button"]:hover,
+[type="reset"]:hover,
+[type="submit"]:hover,
+[type="button"]:focus,
+[type="reset"]:focus,
+[type="submit"]:focus {
+  background: var(--crm-c-primary-hover);
+  color: var(--crm-c-primary-hover-text);
+  text-decoration: none;
+}
+.crm-container .nav.nav-pills li.navitem:not(.active) a {
+  background-color: transparent;
+  border-color: transparent;
+  color: var(--crm-c-link);
+}
+.crm-container .nav.nav-pills li.navitem:not(.active) a:hover,
+.crm-container .nav.nav-pills li.navitem:not(.active) a:focus {
+  background-color: transparent;
+  color: var(--crm-c-link-hover);
+}
+.crm-button:focus,
+.crm-container .btn:focus,
+#bootstrap-theme .btn:focus {
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.crm-button:active,
+.crm-container .btn:active,
+.crm-container .btn.active,
+#bootstrap-theme .btn:active,
+#bootstrap-theme .btn.active {
+  box-shadow: inset 0 0 100px 100px rgba(255, 255, 255, 0.3);
+}
+.crm-button[disabled],
+.crm-button.disabled,
+.crm-container .btn.disabled,
+.crm-container .btn[disabled],
+#bootstrap-theme .btn.disabled,
+#bootstrap-theme .btn[disabled],
+#bootstrap-theme fieldset[disabled] .btn,
+.crm-container button.disabled {
+  cursor: not-allowed;
+  filter: alpha(opacity=65);
+  opacity: .65;
+  pointer-events: none;
+  box-shadow: none;
+}
+.crm-container button.disabled * {
+  color: var(--crm-c-primary-text);
+}
+.crm-container .crm-button-type-cancel,
+.crm-form-submit .cancel.crm-button,
+.crm-container button.ui-button:has(.fa-times) {
+  background: var(--crm-c-secondary);
+  color: var(--crm-c-secondary-text);
+}
+.crm-container a.button.delete-button,
+.crm-container a.button.delete-button:link,
+.crm-container a.button.delete,
+.crm-container a.button.delete:link {
+  background: var(--crm-btn-cancel-bg);
+  color: var(--crm-btn-cancel-text);
+}
+.crm-container a.button.delete-button:hover,
+.crm-container a.button.delete-button:focus,
+.crm-container a.button.delete:hover {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-cancel-bg);
+}
+.crm-container .crm-button-type-cancel:hover,
+.crm-container .crm-button-type-cancel:focus,
+.crm-container button.ui-button:has(.fa-times):hover,
+.crm-container button.ui-button:has(.fa-times):focus {
+  background: var(--crm-c-secondary-hover);
+  color: var(--crm-c-secondary-hover-text);
+}
+
+/* BS3 colour options */
+
+#bootstrap-theme .btn-secondary {
+  background: var(--crm-c-secondary);
+  color: var(--crm-c-secondary-text);
+}
+#bootstrap-theme .btn.btn-secondary:hover,
+#bootstrap-theme .btn.btn-secondary:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-secondary); /* darkening fallback if hover state not set */
+  background: var(--crm-c-secondary-hover);
+  color: var(--crm-c-secondary-text);
+}
+#bootstrap-theme .btn-info {
+  background: var(--crm-btn-info-bg);
+  color: var(--crm-btn-info-text);
+}
+#bootstrap-theme .btn.btn-info:hover,
+#bootstrap-theme .btn.btn-info:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-info-bg);
+  color: var(--crm-btn-info-text);
+}
+#bootstrap-theme .btn-warning {
+  background: var(--crm-btn-warning-bg);
+  color: var(--crm-btn-warning-text);
+}
+#bootstrap-theme .btn.btn-warning:hover,
+#bootstrap-theme .btn.btn-warning:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-warning-bg);
+  color: var(--crm-btn-warning-text);
+}
+#bootstrap-theme .btn-success {
+  background: var(--crm-btn-success-bg);
+  color: var(--crm-btn-success-text);
+}
+#bootstrap-theme .btn.btn-success:hover,
+#bootstrap-theme .btn.btn-success:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-success-bg);
+  color: var(--crm-btn-success-text);
+}
+#bootstrap-theme .btn-danger {
+  background: var(--crm-btn-alert-bg);
+  color: var(--crm-btn-alert-text);
+}
+#bootstrap-theme .btn.btn-danger:hover,
+#bootstrap-theme .btn.btn-danger:focus {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-alert-bg);
+  color: var(--crm-btn-alert-text);
+}
+
+/* BS3 size options */
+
+#bootstrap-theme .btn-lg,
+#bootstrap-theme .btn-group-lg > .btn {
+  padding: var(--crm-m3) var(--crm-r);
+  font-size: var(--crm-r1);
+  line-height: 1.3;
+  border-radius: calc(var(--crm-btn-radius) * 2);
+}
+#bootstrap-theme.btn-sm,
+#bootstrap-theme .btn-group-sm > .btn {
+  padding: var(--crm-s2) var(--crm-m1);
+  font-size: var(--crm-m2);
+  line-height: 1.5;
+  border-radius: var(--crm-btn-radius);
+  height: auto;
+}
+#bootstrap-theme .btn-xs,
+#bootstrap-theme .btn-group-xs > .btn {
+  padding: var(--crm-xs) var(--crm-s2);
+  font-size: var(--crm-m2);
+  border-radius: var(--crm-btn-radius);
+  height: auto;
+}
+#bootstrap-theme .btn-block {
+  display: block;
+  width: 100%;
+}
+#bootstrap-theme .btn-block + .btn-block {
+  margin-top: 5px;
+}
+#bootstrap-theme input[type="submit"].btn-block,
+#bootstrap-theme input[type="reset"].btn-block,
+#bootstrap-theme input[type="button"].btn-block {
+  width: 100%;
+}
+.crm-submit-buttons {
+  padding: var(--crm-s);
+  display: inline-flex;
+  align-items: center;
+  gap: var(--crm-flex-gap);
+}
+
+/* Hover buttons (plain text, button shows on hover) */
+.crm-container a.crm-hover-button {
+  border-radius: var(--crm-btn-radius);
+  color: var(--crm-c-link);
+  cursor: var(--crm-hover-clickable);
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+  background-color: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+}
+.crm-container a.crm-hover-button.action-item,
+.crm-container .crm-hover-button.btn-slide,
+.crm-container .crm-submit-buttons .crm-hover-button {
+  background-color: transparent;
+  color: var(--crm-c-text);
+  padding: var(--crm-btn-small-padding);
+  margin: 0;
+  cursor: var(--crm-hover-clickable);
+  border-radius: var(--crm-btn-radius);
+  display: inline;
+  line-height: 1.5;
+  white-space: nowrap;
+}
+.crm-container td a.crm-hover-button + .crm-hover-button:not(:last-of-type) {
+  margin-inline: var(--crm-m);
+}
+.crm-container td:has(.btn-slide) a.crm-hover-button + .crm-hover-button {
+  margin-inline: var(--crm-m);
+}
+.crm-container .crm-submit-buttons .crm-hover-button {
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+}
+.crm-container .crm-hover-button.crm-clear-link,
+.crm-container .crm-hover-button.crm-close-accordion {
+  color: var(--crm-c-link);
+  padding: 0;
+  background: unset;
+}
+.crm-container .crm-hover-button:hover,
+.crm-container a.crm-hover-button:hover,
+.crm-container a.crm-hover-button:focus,
+.crm-container a.crm-hover-button:active,
+.crm-container .crm-submit-buttons .crm-hover-button:hover,
+.crm-container .crm-submit-buttons .crm-hover-button:focus {
+  background: var(--crm-c-secondary-hover);
+  color: var(--crm-c-secondary-text);
+  text-decoration: none;
+}
+
+/* Action links */
+
+.crm-container .ui-widget-content .action-link .button {
+  box-shadow: var(--crm-block-shadow) !important;
+  margin: var(--crm-m) 0;
+}
+
+/* Modal buttons */
+
+.crm-container.ui-dialog .ui-dialog-buttonset button {
+  background: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+}
+.crm-container.ui-dialog .ui-dialog-buttonset button:hover,
+.crm-container.ui-dialog .ui-dialog-buttonset button:focus {
+  background: var(--crm-c-primary-hover);
+}
+
+/* BS3 button dropdowns */
+
+#bootstrap-theme .btn-primary.dropdown-toggle {
+  background: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+}
+#bootstrap-theme .btn-primary.dropdown-toggle:hover,
+#bootstrap-theme .btn-primary.dropdown-toggle:focus {
+  background: var(--crm-c-primary-hover);
+}
+#bootstrap-theme .btn-secondary.dropdown-toggle {
+  background: var(--crm-c-secondary);
+  color: var(--crm-c-secondary-text);
+}
+#bootstrap-theme .btn-secondary.dropdown-toggle:hover,
+#bootstrap-theme .btn-secondary.dropdown-toggle:focus {
+  background: var(--crm-c-secondary-hover);
+}
+.crm-container .crm-search-display button.dropdown-toggle:not(.btn-default):not(.btn-secondary),
+#bootstrap-theme .crm-search-display th .btn-group .btn {
+  background-color: var(--crm-c-background4);
+  color: var(--crm-c-text);
+}
+
+/* BS3 Button groups and dropdowns  */
+
+.crm-search-col-type-buttons,
+#bootstrap-theme td.text-right:has(.btn + .btn) {
+  display: flex;
+  gap: var(--crm-s);
+}
+#bootstrap-theme td.text-right:has(.btn + .btn) {
+  justify-content: end;
+}
+.crm-container a.button + a.button {
+  margin-left: var(--crm-flex-gap);
+}
+.crm-actions-ribbon #actions {
+  padding: 0;
+  margin: 0 0 var(--crm-padding-reg);
+  display: flex;
+  gap: var(--crm-flex-gap);
+  align-items: center;
+}
+#bootstrap-theme .btn-group,
+#bootstrap-theme .btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+#bootstrap-theme .btn-group > .btn,
+#bootstrap-theme .btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+#bootstrap-theme .btn-group > .btn:hover,
+#bootstrap-theme .btn-group > .btn:focus,
+#bootstrap-theme .btn-group > .btn:active,
+#bootstrap-theme .btn-group > .btn.active,
+#bootstrap-theme .btn-group-vertical > .btn:hover,
+#bootstrap-theme .btn-group-vertical > .btn:focus,
+#bootstrap-theme .btn-group-vertical > .btn:active,
+#bootstrap-theme .btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+#bootstrap-theme .btn-group .btn + .btn,
+#bootstrap-theme .btn-group .btn + .btn-group,
+#bootstrap-theme .btn-group .btn-group + .btn,
+#bootstrap-theme .btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+#bootstrap-theme .btn-toolbar {
+  margin-left: -5px;
+}
+#bootstrap-theme .btn-toolbar:before,
+#bootstrap-theme .btn-toolbar:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .btn-toolbar:after {
+  clear: both;
+}
+#bootstrap-theme .btn-toolbar .btn,
+#bootstrap-theme .btn-toolbar .btn-group,
+#bootstrap-theme .btn-toolbar .input-group {
+  float: left;
+}
+#bootstrap-theme .btn-toolbar > .btn,
+#bootstrap-theme .btn-toolbar > .btn-group,
+#bootstrap-theme .btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+#bootstrap-theme .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+#bootstrap-theme .btn-group > .btn:first-child {
+  margin-left: 0;
+}
+#bootstrap-theme .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+#bootstrap-theme .btn-group > .btn:last-child:not(:first-child),
+#bootstrap-theme .btn-group > .dropdown-toggle:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+#bootstrap-theme .btn-group > .btn-group {
+  float: left;
+}
+#bootstrap-theme .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+#bootstrap-theme .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+#bootstrap-theme .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+#bootstrap-theme .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+#bootstrap-theme .btn-group .dropdown-toggle:active,
+#bootstrap-theme .btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+#bootstrap-theme .btn-group > .btn + .dropdown-toggle {
+  padding-right: 8px;
+  padding-left: 8px;
+}
+#bootstrap-theme .btn-group > .btn-lg + .dropdown-toggle,
+#bootstrap-theme .btn-group-lg.btn-group > .btn + .dropdown-toggle,
+#bootstrap-theme .btn-group-lg > .btn-group > .btn + .dropdown-toggle {
+  padding-right: 12px;
+  padding-left: 12px;
+}
+#bootstrap-theme .btn-group.open .dropdown-toggle {
+  box-shadow: var(--crm-popup-shadow);
+}
+#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link {
+  box-shadow: none;
+}
+#bootstrap-theme .btn-lg .caret,
+#bootstrap-theme .btn-group-lg > .btn .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+#bootstrap-theme .dropup .btn-lg .caret,
+#bootstrap-theme .dropup .btn-group-lg > .btn .caret {
+  border-width: 0 5px 5px;
+}
+#bootstrap-theme .btn-group-vertical > .btn,
+#bootstrap-theme .btn-group-vertical > .btn-group,
+#bootstrap-theme .btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+#bootstrap-theme .btn-group-vertical > .btn-group:before,
+#bootstrap-theme .btn-group-vertical > .btn-group:after {
+  display: table;
+  content: " ";
+}
+#bootstrap-theme .btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+#bootstrap-theme .btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+#bootstrap-theme .btn-group-vertical > .btn + .btn,
+#bootstrap-theme .btn-group-vertical > .btn + .btn-group,
+#bootstrap-theme .btn-group-vertical > .btn-group + .btn,
+#bootstrap-theme .btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+#bootstrap-theme .btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+#bootstrap-theme .btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-left-radius: var(--crm-btn-radius);
+  border-top-right-radius: var(--crm-btn-radius);
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+#bootstrap-theme .btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: var(--crm-btn-radius);
+  border-bottom-left-radius: var(--crm-btn-radius);
+}
+#bootstrap-theme .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+#bootstrap-theme .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+#bootstrap-theme .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+#bootstrap-theme .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+#bootstrap-theme .btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+#bootstrap-theme .btn-group-justified > .btn,
+#bootstrap-theme .btn-group-justified > .btn-group {
+  display: table-cell;
+  float: none;
+  width: 1%;
+}
+#bootstrap-theme .btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+#bootstrap-theme .btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+#bootstrap-theme .btn-group .btn + .btn.dropdown-toggle {
+  border-left: 1px solid var(--crm-c-page-background);
+}
+
+/* Icons (for ease, include .button & .ui-button icons) */
+
+.crm-container .crm-button i.crm-i,
+.crm-container a.button i.crm-i,
+.crm-container button i.crm-i,
+.crm-container a.button:visited i.crm-i,
+.crm-container input.form-submit i.crm-i,
+.crm-container input[type="button"] i.crm-i,
+.crm-container input[type="submit"] i.crm-i,
+.crm-container input.form-submit-inline i.crm-i,
+.crm-container .ui-dialog-buttonset .ui-button .ui-icon,
+.crm-container .btn i.crm-i,
+#bootstrap-theme .btn i.crm-i {
+  background-color: var(--crm-btn-icon-bg);
+  border-radius: var(--crm-btn-radius) 0 0 var(--crm-btn-radius);
+  border-right: var(--crm-btn-icon-border);
+  line-height: inherit;
+  opacity: 1;
+  text-shadow: none;
+  padding: var(--crm-btn-padding-block) var(--crm-btn-icon-spacing) var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+  height: 100%;
+  min-width: var(--crm-btn-height);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.crm-container a.button i.crm-i,
+.crm-container .crm-button:not(.btn) i.crm-i {
+  display: flex;
+  align-items: center;
+}
+#bootstrap-theme .btn:has(i.crm-i),
+#bootstrap-theme .btn-group > .btn + .dropdown-toggle:has(i.crm-i),
+.crm-container button.ui-button:has(.ui-button-icon) {
+  padding: var(--crm-btn-icon-padding) var(--crm-btn-padding-inline) var(--crm-btn-icon-padding) 0;
+}
+.crm-container a.button:has(i.crm-i),
+.crm-container button:has(i.crm-i),
+.crm-button:has(i.crm-i),
+.crm-button > input[type="button"]:has(i.crm-i),
+.crm-button > input[type="submit"]:has(i.crm-i),
+.form-inline .btn-success.pull-right:has(i.crm-i) /* Api4exp */ {
+  padding: var(--crm-btn-icon-padding) var(--crm-btn-padding-inline) var(--crm-btn-icon-padding) 0;
+  width: fit-content;
+  justify-content: center;
+  align-items: center;
+}
+.crm-button > input[type="button"]:has(i.crm-i),
+.crm-button > input[type="submit"]:has(i.crm-i) {
+  padding: var(--crm-btn-icon-padding) 0;
+}
+#bootstrap-theme .form-inline .btn-group button:has(i.crm-i),
+.crm-search-admin-main-tabs li .btn.btn-secondary.dropdown-toggle,
+#bootstrap-theme .form-inline .btn-group button i.crm-i,
+.form-inline .btn-success.pull-right i.crm-i,
+.crm-search-admin-main-tabs li .btn.btn-secondary.dropdown-toggle i.crm-i {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.crm-container .ui-button-icon-space {
+  display: none;
+}
+#bootstrap-theme .btn-group-xs button .caret,
+#bootstrap-theme .btn-group button.btn-xs .caret {
+  margin: 0 8px 0 0;
+}
+.crm-container .button span i.crm-i {
+  margin-right: var(--crm-btn-icon-spacing);
+}
+
+/* Small buttons with icons */
+#bootstrap-theme .btn-sm:has(i.crm-i),
+#bootstrap-theme .btn-group-sm > .btn:has(i.crm-i) {
+  padding: 0 var(--crm-m1) 0 0;
+}
+#bootstrap-theme .btn-sm i.crm-i,
+#bootstrap-theme .btn-group-sm > .btn i.crm-i {
+  min-width: fit-content;
+  height: auto;
+  padding: var(--crm-s2) var(--crm-btn-icon-spacing) var(--crm-s2) var(--crm-m1);
+}
+#bootstrap-theme .btn-group-xs > .btn:has(i.crm-i),
+#bootstrap-theme .btn-group-xs > .btn + .dropdown-toggle:has(i.crm-i),
+.crm-container button.dropdown-toggle.btn-xs:has(i.crm-i) {
+  padding: 0;
+}
+#bootstrap-theme .btn-group-xs button:has(i.crm-i) {
+  padding: 0 var(--crm-s2) 0 0;
+}
+#bootstrap-theme .btn-xs i.crm-i,
+#bootstrap-theme .btn-group-xs > .btn i.crm-i {
+  width: auto;
+  padding: var(--crm-btn-small-padding);
+  min-width: 1rem;
+  height: 1.5rem;
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_components.css b/civicrm/ext/riverlea/core/css/components/_components.css
new file mode 100644
index 0000000000000000000000000000000000000000..8515e0ca2e1ea3776407d9f33d56259db9c96759
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_components.css
@@ -0,0 +1,643 @@
+/* Checkbox lists */
+
+.crm-container .listing-box,
+.crm-container .listing-box-tall,
+.crm-container ul.crm-checkbox-list {
+  width: auto;
+  border-radius: var(--crm-roundness);
+  max-width: 30rem;
+  height: 7.25rem;
+  overflow: auto;
+  border: 1px solid var(--crm-c-gray-500);
+}
+.crm-container ul.crm-checkbox-list {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  background-color: var(--crm-c-page-background);
+  width: 300px;
+  max-width: 100%;
+  max-height: 300px;
+  overflow-y: auto;
+}
+.crm-container ul.crm-checkbox-list li {
+  margin: 0;
+  display: grid;
+  grid-template-columns: var(--crm-r) 100%;
+  gap: var(--crm-xs);
+  background-color: var(--crm-c-background2);
+  padding-inline: var(--crm-s) var(--crm-m2);
+  word-break: break-all;
+  align-items: center;
+}
+.crm-container ul.crm-checkbox-list li input {
+  margin: 0;
+}
+.crm-container ul.crm-checkbox-list li:has(input:checked) label {
+  color: var(--crm-checkbox-list-col);
+}
+.listing-box input.crm-form-checkbox {
+  margin: 0 0 0 var(--crm-s);
+}
+tbody.scrollContent tr.alternateRow {
+  background-color: var(--crm-c-background3);
+  padding-inline: var(--crm-s) var(--crm-m2);
+}
+.crm-container ul.crm-checkbox-list li:nth-child(2n) {
+  background-color: var(--crm-c-background3);
+}
+.crm-container ul.crm-checkbox-list li:has(input:checked) {
+  background-color: var(--crm-c-yellow-light);
+}
+.crm-container ul.crm-checkbox-list li:nth-child(2n):has(input:checked) {
+  background-color: var(--crm-c-yellow-less-light);
+}
+
+/* Action Links */
+
+.crm-container .action-link,
+.crm-container .action-link:hover {
+  line-height: 1;
+  background: unset;
+  display: flex;
+  gap: var(--crm-m);
+  padding: var(--crm-padding-reg) 0;
+}
+.crm-container .CRM_Event_Form_SearchEvent .action-link {
+  padding: 0 0 var(--crm-padding-reg) 0;
+}
+.crm-container .action-link:has(.crm-uplang-refresh) {
+  padding-top: 0;
+}
+.crm-container .action-link.css_right.crm-link-credit-card-mode {
+  margin-top: -20px; /* prevents narrow screen wrapping */
+}
+
+/* Advanced multi-select */
+
+.crm-container table.advmultiselect {
+  border: 0 solid transparent;
+}
+.crm-container table.advmultiselect td:nth-of-type(2n) {
+  display: flex;
+  gap: var(--crm-m);
+  border: 0;
+  align-items: center;
+  height: 125px;
+}
+table.advmultiselect {
+  width: auto;
+}
+
+/* Wizard steps.
+   .crm_wizard__title is from Mosaico, to be removed someday */
+
+.crm-container ul.wizard-bar,
+.crm_wizard__title ul {
+  border-collapse: collapse;
+  white-space: nowrap;
+  list-style: none;
+  margin: 0 0 20px;
+  line-height: normal;
+  background-color: var(--crm-c-background);
+  border: var(--crm-wizard-border);
+  border-radius: var(--crm-wizard-radius);
+  overflow: hidden;
+  padding: 0;
+  text-align: left;
+  width: 100%;
+}
+.crm-container #wizard-steps,
+.crm-container ul.crm-wizard-nav,
+.crm-container .crm-mosaico-wizard .crm_wizard__title ul {
+  margin: var(--crm-wizard-margin) !important;
+  width: var(--crm-wizard-width);
+  gap: initial; /* resets .nav.nav-pills gap */
+}
+.crm-container ul.crm-wizard-nav {
+  margin-bottom: var(--crm-r);
+}
+.crm-wizard-step .ui-tabs {
+  margin-bottom: var(--crm-m);
+}
+.crm-container ul.wizard-bar li,
+.crm_wizard__title ul > li {
+  margin: -2px;
+  text-decoration: none;
+  background-image: none;
+  background-color: var(--crm-wizard-bg);
+  border: 0;
+  border-radius: 0;
+  color: var(--crm-c-text);
+  display: inline-block;
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+  line-height: var(--crm-wizard-height);
+  padding: 0 var(--crm-l) 0 var(--crm-xl);
+  position: relative;
+}
+.crm-container ul.wizard-bar > li:first-child,
+.crm_wizard__title ul > li:first-child {
+  padding-left: var(--crm-l);
+}
+.crm-container ul.wizard-bar > li::after,
+.crm_wizard__title ul > li::after {
+  border-bottom: var(--crm-wizard-height) solid rgba(0,0,0,0);
+  border-left: calc(1px + var(--crm-wizard-angle)) solid var(--crm-wizard-active-bg);
+  border-top: var(--crm-wizard-height) solid rgba(0,0,0,0);
+  content: "";
+  height: 0;
+  position: absolute;
+  right: -21px;
+  top: calc(-0.5 * var(--crm-wizard-height));
+  width: 20px;
+  z-index: 10;
+}
+.crm-container ul.crm-wizard-nav > li::after,
+.crm_wizard__title ul > li::after {
+  border-left: calc(1.25 * var(--crm-wizard-angle)) solid var(--crm-wizard-active-bg);
+}
+.crm-container ul.wizard-bar > li::before,
+.crm_wizard__title ul > li::before {
+  border-bottom: var(--crm-wizard-height) solid rgba(0,0,0,0);
+  border-left: var(--crm-wizard-angle) solid var(--crm-wizard-bg);
+  border-top: var(--crm-wizard-height) solid rgba(0,0,0,0);
+  content: "";
+  height: 0;
+  position: absolute;
+  right: -20px;
+  top: calc(-0.5 * var(--crm-wizard-height));
+  width: 0;
+  z-index: 11;
+}
+.crm-container ul.crm-wizard-nav > li::before,
+.crm_wizard__title ul > li::before {
+  border-left: calc(1.25 * var(--crm-wizard-angle)) solid var(--crm-wizard-bg);
+}
+.crm-container ul.wizard-bar > li.current-step,
+.crm_wizard__title ul > li.active,
+.crm_wizard__title ul > li.active a {
+  background-color: var(--crm-wizard-active-bg);
+  color: var(--crm-wizard-active-col);
+}
+.crm-container ul.wizard-bar > li.current-step::before,
+.crm_wizard__title ul > li.active::before {
+  border-left-color: var(--crm-wizard-active-bg);
+}
+.crm-container ul.wizard-bar > li:not(:first-child),
+.crm_wizard__title ul > li:not(:first-child) {
+  padding-left: calc(var(--crm-l) + var(--crm-wizard-angle)) !important;
+}
+.crm-wizard-buttons {
+  margin-top: var(--crm-padding-reg);
+  display: flex;
+  justify-content: space-between;
+}
+.crm-wizard-buttons > span > span {
+  display: flex;
+  gap: var(--crm-flex-gap);
+}
+
+/* Panels (taken from Bootstrap3) */
+
+.crm-container .panel {
+  box-shadow: var(--crm-panel-shadow);
+  border: var(--crm-panel-border);
+  border-radius: var(--crm-roundness);
+  margin-bottom: calc(var(--crm-r) + var(--crm-panel-head-margin));
+  background: transparent;
+}
+.crm-container .panel-heading {
+  padding: var(--crm-m2) var(--crm-padding-reg);
+  border-radius: var(--crm-roundness) var(--crm-roundness) 0 0;
+  border-bottom: var(--crm-panel-border);
+}
+.crm-container .panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.crm-container .panel-body {
+  padding: var(--crm-padding-reg);
+  background: var(--crm-panel-background);
+  box-shadow: none;
+  border-radius: var(--crm-roundness);
+}
+.crm-container .panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: var(--crm-font-size);
+  color: inherit;
+}
+.crm-container .panel-title > a,
+.crm-container .panel-title > small,
+.crm-container .panel-title > .small,
+.crm-container .panel-title > small > a,
+.crm-container .panel-title > .small > a {
+  color: inherit;
+}
+.crm-container .panel-footer {
+  padding: var(--crm-padding-reg);
+  background: var(--crm-panel-background);
+  border-top: var(--crm-c-divider);
+  border-radius: 0 0 var(--crm-roundness) var(--crm-roundness);
+  box-shadow: var(--crm-panel-shadow);
+}
+.crm-container .panel > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: var(--crm-c-gray-300);
+}
+.crm-container .panel > .panel-footer + .panel-collapse > .panel-body {
+  border-color: var(--crm-c-gray-300);
+}
+.crm-container .panel-default > .panel-heading {
+  color: var(--crm-c-text);
+  background-color: var(--crm-c-background2);
+  border-bottom: var(--crm-panel-border);
+}
+.crm-container .panel-title {
+  font-size: 1rem;
+  color: inherit;
+  margin: 0;
+}
+.crm-container .panel-default {
+  border: var(--crm-c-divider);
+}
+.crm-container .panel-default > .panel-heading .badge {
+  color: var(--crm-text-light);
+  background-color: var(--crm-c-gray-500);
+}
+.crm-container .panel-primary > .panel-heading {
+  color: var(--crm-c-primary-text);
+  background-color: var(--crm-c-primary);
+}
+.crm-container .panel-primary > .panel-heading .badge,
+.crm-container .panel-primary > .panel-heading a {
+  color: var(--crm-c-primary-text);
+}
+.crm-container .panel-success > .panel-heading {
+  color: var(--crm-c-success);
+  background-color: var(--crm-c-green-light);
+}
+.crm-container .panel-success > .panel-heading .badge,
+.crm-container .panel-success > .panel-heading a {
+  color: var(--crm-c-success);
+}
+.crm-container .panel-info > .panel-heading {
+  color: var(--crm-alert-text-info);
+  background-color: var(--crm-alert-background-info);
+}
+.crm-container .panel-info > .panel-heading .badge,
+.crm-container .panel-info > .panel-heading a {
+  color: var(--crm-alert-text-info);
+}
+.crm-container .panel-warning > .panel-heading {
+  color: var(--crm-c-warning-text);
+  background-color: var(--crm-c-warning);
+}
+.crm-container .panel-warning > .panel-heading .badge,
+.crm-container .panel-warning > .panel-heading a {
+  color: var(--crm-c-warning-text);
+}
+.crm-container .panel-danger > .panel-heading {
+  color: var(--crm-c-alert);
+  background-color: var(--crm-c-red-light);
+}
+.crm-container .panel-danger > .panel-heading .badge,
+.crm-container .panel-danger > .panel-heading a {
+  color: var(--crm-c-alert);
+}
+.crm-container .panel:has(.nav.nav-tabs) {
+  border: var(--crm-tabs-border);
+  border-radius: var(--crm-tabs-radius);
+}
+.crm-container .panel .panel {
+  box-shadow: none;
+}
+
+/* Badges - from BS3 */
+
+.crm-container .badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: var(--crm-s) var(--crm-m);
+  line-height: 1;
+  color: var(--crm-c-page-background);
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  background-color: var(--crm-c-primary);
+  border-radius: var(--crm-m2);
+  position: relative;
+  top: -1px;
+}
+.crm-container .btn-group .badge {
+  margin-inline: var(--crm-xs);
+}
+.crm-container .badge:empty {
+  display: none;
+}
+.crm-container .btn-xs .badge,
+.crm-container .btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: var(--crm-c-link);
+  background-color: var(--crm-c-page-background);
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+.crm-container a.badge:hover,
+.crm-container a.badge:focus {
+  color: white;
+  text-decoration: none;
+  cursor: var(--crm-hover-clickable);
+}
+
+/* Footer */
+
+.crm-container #access {
+  text-align: right;
+}
+#crm-record-log {
+  font-size: var(--crm-m3);
+  padding: var(--crm-m3) 0;
+}
+#crm-record-log .col1 {
+  float: left;
+}
+#civicrm-footer {
+  margin-top: var(--crm-l);
+  padding: var(--crm-m2);
+  text-align: center;
+  font-size: var(--crm-m2);
+}
+#civicrm-footer::after {
+  content: var(--crm-version);
+  float: right;
+}
+.crm-container #civicrm-footer .status {
+  border-radius: var(--crm-roundness);
+  padding: var(--crm-btn-small-padding);
+  border-color: transparent;
+}
+.crm-container #civicrm-footer .status.crm-error {
+  background-color: var(--crm-c-alert);
+  color: var(--crm-c-alert-text);
+}
+#civicrm-footer .status a {
+  color: inherit;
+}
+.crm-container #civicrm-footer .status.crm-error a {
+  color: var(--crm-c-alert-text);
+}
+
+/* Upgrade screen (overwrites inline css) */
+
+.crm-container.crm-upgrade-box-outer,
+.page-civicrm-upgrade .crm-queue-runner-form-block {
+  margin: var(--crm-page-padding); /* Padding on upgrade screen */
+}
+.crm-upgrade-box-outer.crm-upgrade-success {
+  margin: var(--crm-page-padding);
+  background: var(--crm-alert-background-help);
+  border: 1px solid var(--crm-alert-border-help);
+}
+.crm-upgrade-box-inner {
+  padding: 1rem;
+  display: grid;
+  grid-template-columns: 1fr auto;
+  row-gap: 1rem;
+  background-color: transparent;
+}
+p.crm-upgrade-large-text {
+  grid-column: 2;
+  color: var(--crm-c-success);
+}
+.crm-upgrade-box-inner a {
+  color: var(--crm-c-link) !important  /* vs inline */;
+}
+p.crm-upgrade-large-text:first-of-type {
+  font-size: var(--crm-r1);
+  color: var(--crm-c-success);
+  font-family: var(--crm-font-bold);
+  font-weight: bold;
+}
+.crm-success-flex {
+  display: unset;
+  padding: 0 2rem 0 0 !important /* vs inline */;
+  font-size: var(--crm-l);
+  line-height: 1.35;
+  color: var(--crm-c-success);
+  grid-column: 1;
+  grid-row: 1 / span 3;
+}
+
+/* Upgrade extensions runner */
+
+#crm-queue-runner-progress {
+  width: 100%;
+  background: var(--crm-c-background3);
+}
+#crm-queue-runner-desc {
+  background: var(--crm-c-background2);
+  padding: var(--crm-padding-reg);
+  margin-block: var(--crm-r);
+  border-radius: var(--crm-roundness);
+  display: inline-flex;
+  flex-direction: row-reverse;
+  justify-content: space-between;
+  align-items: center;
+}
+#crm-queue-runner-buttonset {
+  position: inherit !important;
+}
+#crm-queue-runner-buttonset button {
+  background: transparent;
+  height: inherit;
+  padding: 0 0 0 var(--crm-r);
+  color: var(--crm-c-text);
+}
+#crm-queue-runner-buttonset button:hover,
+#crm-queue-runner-buttonset button:focus {
+  color: var(--crm-c-text);
+}
+
+/* Community message */
+
+div.civicrm-community-messages {
+  border: 2px solid var(--crm-alert-border-help);
+  background: var(--crm-alert-background-help);
+  padding: var(--crm-padding-inset);
+}
+div.civicrm-community-messages .crm-collapsible .collapsible-title,
+div.civicrm-community-messages a.civicrm-community-message-dismiss::before {
+  color: var(--crm-alert-text-help) !important /* vs inline */;
+}
+
+/* Status box (for mailsending) */
+
+.crm-status-box-outer {
+  position: fixed;
+  z-index: 99999;
+  right: 0;
+  top: 0;
+}
+.progress-bar-striped {
+  background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);
+  background-size: 1rem 1rem;
+}
+.crm-status-box-outer.status-start {
+  animation: progress-bar-stripes 1s linear infinite;
+}
+.crm-status-box-outer .crm-status-box-inner {
+  padding: var(--crm-s) var(--crm-r);
+  font-size: var(--crm-font-size);
+  color: var(--crm-c-text-light);
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+  text-align: center;
+  background: var(--crm-c-background2);
+}
+.crm-status-box-outer.status-success .crm-status-box-inner {
+  background: var(--crm-c-success);
+}
+.crm-status-box-outer.status-error .crm-status-box-inner {
+  background: var(--crm-c-alert);
+}
+
+/* Background regions */
+
+#bootstrap-theme .bg-primary {
+  background-color: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+}
+#bootstrap-theme .bg-primary a {
+  color: var(--crm-c-primary-text);
+}
+#bootstrap-theme a.bg-primary:hover,
+#bootstrap-theme a.bg-primary:focus {
+  background-color: var(--crm-c-primary-hover);
+}
+#bootstrap-theme .bg-secondary {
+  background-color: var(--crm-c-secondary);
+  color: var(--crm-c-secondary-text);
+}
+#bootstrap-theme .bg-secondary a {
+  color: var(--crm-c-secondary-text);
+}
+#bootstrap-theme a.bg-secondary:hover,
+#bootstrap-theme a.bg-secondary:focus {
+  background-color: var(--crm-c-secondary-hover);
+}
+#bootstrap-theme .dropdown-menu .bg-success a,
+#bootstrap-theme .dropdown-menu a.bg-success,
+#bootstrap-theme .bg-success {
+  background-color: var(--crm-c-success);
+  color: var(--crm-c-success-text);
+}
+#bootstrap-theme a.bg-success:hover,
+#bootstrap-theme a.bg-success:focus,
+#bootstrap-theme .dropdown-menu a.bg-success:hover,
+#bootstrap-theme .dropdown-menu .bg-success a:hover {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-success);
+  color: var(--crm-c-success-text);
+}
+#bootstrap-theme .dropdown-menu .bg-info a,
+#bootstrap-theme .dropdown-menu a.bg-info,
+#bootstrap-theme .bg-info {
+  background-color: var(--crm-c-info);
+  color: var(--crm-c-info-text);
+}
+#bootstrap-theme a.bg-info:hover,
+#bootstrap-theme a.bg-info:focus,
+#bootstrap-theme .dropdown-menu .bg-info a:hover,
+#bootstrap-theme .dropdown-menu a.bg-info:hover {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-info);
+  color: var(--crm-c-info-text);
+}
+#bootstrap-theme .bg-warning,
+#bootstrap-theme .dropdown-menu .bg-warning a,
+#bootstrap-theme .dropdown-menu a.bg-warning {
+  background-color: var(--crm-c-warning);
+  color: var(--crm-c-warning-text) !important /* FormBuilder vs .disabled */;
+}
+#bootstrap-theme a.bg-warning:hover,
+#bootstrap-theme a.bg-warning:focus,
+#bootstrap-theme .dropdown-menu .bg-warning a:hover,
+#bootstrap-theme .dropdown-menu a.bg-warning:hover {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-warning);
+  color: var(--crm-c-warning-text);
+}
+#bootstrap-theme .bg-danger,
+#bootstrap-theme .dropdown-menu .bg-danger a,
+#bootstrap-theme .dropdown-menu a.bg-danger {
+  background-color: var(--crm-c-alert);
+  color: var(--crm-c-alert-text);
+}
+#bootstrap-theme a.bg-danger:hover,
+#bootstrap-theme a.bg-danger:focus,
+#bootstrap-theme .dropdown-menu .bg-danger a:hover,
+#bootstrap-theme .dropdown-menu a.bg-danger:hover {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-alert);
+  color: var(--crm-c-alert-text);
+}
+#bootstrap-theme .dropdown-menu .bg-danger .crm-i::before {
+  color: var(--crm-c-alert-text);
+}
+#bootstrap-theme .dropdown-menu .bg-warning .crm-i::before {
+  color: var(--crm-c-warning-text);
+}
+#bootstrap-theme .dropdown-menu .bg-success .crm-i::before {
+  color: var(--crm-c-success-text);
+}
+#bootstrap-theme .dropdown-menu .bg-info .crm-i::before {
+  color: var(--crm-c-info-text);
+}
+
+/* CKEditor Config */
+
+#CKEditorConfig .cke_ltr.cke_button.cke_toolgroup {
+  width: 30px;
+  height: 30px;
+  border-radius: var(--crm-roundness);
+  background: var(--crm-c-background);
+}
+#CKEditorConfig .move {
+  background-color: var(--crm-c-primary);
+  color: var(--crm-c-primary-text);
+  border: 0;
+  margin-block: 1px;
+}
+#CKEditorConfig .move:focus,
+#CKEditorConfig .move:hover {
+  background-color: var(--crm-c-primary-hover);
+  border: 0;
+}
+/* Blocks (D7/Joomla) */
+
+#crm-recently-viewed ul,
+#crm-recently-viewed li {
+  padding: 0;
+  margin: 0;
+  font-size: 0.9rem;
+}
+#crm-recently-viewed li.crm-recently-viewed {
+  margin-block: var(--crm-xs);
+  padding: var(--crm-s);
+  border: var(--crm-c-divider);
+  background-color: var(--crm-input-background);
+  list-style-type: none;
+  position: relative;
+  border-radius: var(--crm-roundness);
+}
+#crm-recently-viewed .crm-recentview-wrapper a {
+  opacity: 0.6;
+}
+#crm-recently-viewed .crm-recentview-wrapper a:hover,
+#crm-recently-viewed .crm-recentview-wrapper a:focus {
+  opacity: 1;
+}
+#crm-quick-create input {
+  max-width: 100%;
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_dialogs.css b/civicrm/ext/riverlea/core/css/components/_dialogs.css
new file mode 100644
index 0000000000000000000000000000000000000000..5e7758186ca990cdeca16900f576bc42acedcadb
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_dialogs.css
@@ -0,0 +1,225 @@
+/* Main modal */
+/* Header */
+.crm-container.ui-dialog {
+  background: var(--crm-dialog-bg);
+  border: 0;
+  border-radius: var(--crm-dialog-radius);
+  box-shadow: var(--crm-popup-shadow);
+  color: var(--crm-c-text);
+  max-height: 90%;
+  padding: var(--crm-dialog-padding);
+}
+.crm-container.ui-dialog .ui-dialog-header,
+.crm-container.ui-dialog .ui-dialog-titlebar,
+.crm-container .modal-header,
+.crm-container .ui-dialog .ui-dialog-titlebar {
+  border: 0;
+  border: 1px solid transparent;
+  border-color: var(--crm-dialog-header-border-col);
+  box-shadow: var(--crm-dialog-inner-shadow);
+  color: var(--crm-dialog-header-col);
+  background: var(--crm-dialog-header-bg);
+  font-size: var(--crm-dialog-header-size);
+  border-radius: var(--crm-dialog-header-radius);
+  padding: var(--crm-dialog-header-padding);
+  position: relative;
+  overflow: auto;
+  display: flex;
+  flex-wrap: nowrap;
+  align-items: center;
+  gap: var(--crm-m3);
+}
+.crm-container.ui-dialog .ui-dialog-header .ui-dialog-title,
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-dialog-title {
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+  padding: 0;
+  float: none;
+  flex: 1;
+  margin: 0;
+  width: auto;
+}
+.crm-container.ui-dialog .ui-dialog-header .ui-button,
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-button {
+  background: transparent;
+  color: var(--crm-dialog-header-col);
+  display: block;
+  font-size: var(--crm-dialog-header-size);
+  padding: 0;
+  position: relative !important;
+  margin: 0;
+  right: unset !important /* vs inline - ie CiviCase Actiity View */;
+  top: unset;
+}
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-state-hover .ui-icon,
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-state-focus .ui-icon,
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-button:hover,
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-button:focus {
+  background: transparent;
+}
+.crm-container.ui-dialog .ui-button:has(.fa-times) {
+  order: 1;
+}
+.crm-container.ui-dialog .ui-dialog-header .ui-button-icon.ui-icon[class*=" fa-"],
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-button-icon.ui-icon[class*=" fa-"] {
+  font-size: var(--crm-dialog-header-size);
+  height: 2ch;
+  color: var(--crm-dialog-header-col);
+  opacity: 0.8;
+  width: auto;
+}
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-button-icon.ui-icon[class*=" fa-"]:hover,
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-button-icon.ui-icon[class*=" fa-"]:focus {
+  color: var(--crm-dialog-header-col);
+  opacity: 1;
+}
+
+/* Body */
+.crm-container.ui-dialog .ui-dialog-content[id*="crm-ajax-dialog"] {
+  background: var(--crm-dialog-body-bg);
+}
+.crm-container.ui-dialog .ui-dialog-content {
+  max-height: calc(100vh - 280px) !important;
+  border-radius: var(--crm-dialog-radius);
+  background: var(--crm-dialog-body-bg);
+  color: var(--crm-c-text);
+  height: auto !important;
+  margin: var(--crm-dialog-padding) 0 calc(var(--crm-btn-height) + var(--crm-m) + var(--crm-m));
+  position: static;
+  z-index: 1;
+  padding: var(--crm-dialog-body-padding);
+}
+.crm-container.ui-dialog .ui-dialog-content .crm-container {
+  background: var(--crm-dialog-bg);
+}
+.crm-container.ui-dialog .ui-dialog-content .crm-block,
+.crm-container.ui-dialog details table {
+  box-shadow: none;
+  padding: var(--crm-dialog-body-padding);
+}
+.crm-container.ui-dialog .form-layout-compressed {
+  background: transparent;
+  box-shadow: none;
+  border: 0 solid transparent;
+}
+.crm-container.ui-dialog .ui-dialog-content tr,
+.crm-container.ui-dialog .ui-dialog-content td,
+.crm-container.ui-dialog .ui-dialog-content th {
+  border-bottom: 0;
+}
+.crm-container.ui-dialog details {
+  margin: var(--crm-dialog-body-padding) 0;
+}
+.crm-container.ui-dialog .help,
+.crm-container.ui-dialog .status,
+.crm-container.ui-dialog .alert,
+.crm-container.ui-dialog .alert-success {
+  margin: var(--crm-dialog-body-padding);
+}
+/* Footer */
+.crm-container.ui-dialog .ui-dialog-buttonpane,
+.crm-container.ui-dialog .modal-dialog .modal-footer {
+  background: var(--crm-dialog-bg);
+  border-radius: 0 0 var(--crm-dialog-radius) var(--crm-dialog-radius);
+  border-top: var(--crm-dialog-line) !important;
+  box-shadow: var(--crm-dialog-inner-shadow);
+  display: flex;
+  padding: 0;
+  margin: 0;
+  position: absolute;
+  width: 100%;
+  bottom: 0;
+  left: 0;
+}
+.crm-container.ui-dialog .ui-dialog-buttonset {
+  width: 100%;
+  display: flex;
+  gap: var(--crm-m);
+  padding: var(--crm-m);
+  justify-content: flex-end;
+  flex-wrap: wrap;
+}
+.crm-container.ui-dialog .buttons.pull-right {
+  display: flex;
+  gap: var(--crm-flex-gap);
+}
+.crm-container.ui-dialog .ui-dialog-buttonpane button {
+  margin: 0;
+}
+
+/* System notifications */
+
+#crm-notification-container {
+  width: 350px;
+  position: fixed;
+  top: 64px;
+  right: var(--crm-r2);
+  z-index: 999999;
+}
+#crm-notification-container div.ui-notify-message-style {
+  background: var(--crm-notify-background);
+  box-shadow: var(--crm-popup-shadow);
+  color: var(--crm-notify-col);
+  border-radius: var(--crm-notify-radius);
+  padding: var(--crm-notify-padding);
+  margin-bottom: var(--crm-r);
+  max-height: 600px;
+  overflow: auto;
+  border-width: var(--crm-notify-accent-border);
+  border-style: solid;
+  border-color: transparent;
+}
+#crm-notification-container div.ui-notify-message-style a {
+  color: var(--crm-notify-col);
+  text-decoration: underline;
+}
+#crm-notification-container div.ui-notify-message-style.error {
+  border-color: var(--crm-c-alert);
+}
+#crm-notification-container div.ui-notify-message-style.alert,
+#crm-notification-container div.ui-notify-message-style.warning {
+  border-color: var(--crm-c-warning);
+}
+#crm-notification-container div.ui-notify-message-style.success {
+  border-color: var(--crm-c-success);
+}
+#crm-notification-container div.ui-notify-message-style.info {
+  border-color: var(--crm-c-info);
+}
+#crm-notification-container div.ui-notify-message:last-child {
+  margin-bottom: 0;
+}
+#crm-notification-container div.ui-notify-message h1 {
+  font-size: var(--crm-font-size);
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+  margin: 0 2ch var(--m) 0;
+  color: var(--crm-notify-col);
+}
+#crm-notification-container div.ui-notify-message h1:empty {
+  float: left;
+  margin: 0;
+}
+#crm-notification-container div.ui-notify-message-style {
+  color: var(--crm-notify-col);
+}
+#crm-notification-container div.ui-notify-message .notify-content ul,
+#crm-notification-container div.ui-notify-message .alert.notify-content ul {
+  margin: 0 var(--crm-r);
+  padding: var(--crm-m) 0 var(--crm-m) var(--crm-m);
+  color: var(--crm-notify-col);
+  list-style: unset;
+}
+#crm-notification-container div.ui-notify-message .notify-content ul li,
+#crm-notification-container div.ui-notify-message.alert .notify-content ul li {
+  color: var(--crm-notify-col);
+}
+#crm-notification-container div.ui-notify-message .notify-content p {
+  color: var(--crm-notify-col);
+}
+#crm-notification-container div.ui-notify-message-style a.ui-button.ui-widget,
+#crm-notification-container div.ui-notify-message-style a.ui-button.ui-widget:hover,
+#crm-notification-container div.ui-notify-message-style a.ui-button.ui-widget:focus {
+  background: var(--crm-c-alert);
+  border: 0;
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_dropdowns.css b/civicrm/ext/riverlea/core/css/components/_dropdowns.css
new file mode 100644
index 0000000000000000000000000000000000000000..aa59c45aa64dd4ef11584fa5a60d209d7bdd423d
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_dropdowns.css
@@ -0,0 +1,459 @@
+/* Actions dropdowns */
+
+#crm-create-new-list {
+  position: absolute;
+  display: none;
+  width: 220px;
+  left: 0;
+  z-index: 2;
+}
+#crm-contribpage-links-wrapper,
+#crm-event-links-wrapper,
+#crm-participant-wrapper,
+#crm-contact-actions-wrapper {
+  position: relative;
+}
+#crm-contribpage-links-list,
+#crm-event-links-list,
+#crm-participant-list,
+#crm-contact-actions-list {
+  top: calc(var(--crm-btn-height) + 5px);
+  position: absolute;
+  display: none;
+  left: 0;
+  z-index: 5;
+}
+.ac_results-inner,
+.crm-participant-list-inner,
+.crm-event-links-list-inner,
+.crm-contribpage-links-list-inner,
+.crm-contact-actions-list-inner,
+.crm-participant-list-inner,
+.crm-create-new-list-inner ul.ui-widget,
+.vakata-context {
+  background-color: var(--crm-dropdown-2-bg);
+  color: var(--crm-dropdown-2-col);
+  border-radius: var(--crm-roundness);
+  box-shadow: var(--crm-popup-shadow);
+  padding: var(--crm-dropdown-2-padding);
+  min-width: var(--crm-dropdown-width);
+}
+.ac_results::before,
+.crm-create-new-list-inner::before {
+  content: '';
+  display: inline-block;
+  position: absolute;
+  width: 0px;
+  height: 0px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-bottom: 5px solid var(--crm-dropdown-2-bg);
+  top: -5px;
+  left: 12px;
+}
+.crm-create-new-list-inner::before {
+  top: 3px;
+}
+#crm-contact-actions-list ul,
+.crm-contribpage-links-list-inner ul,
+.crm-event-links-list-inner ul,
+.crm-participant-list-inner ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+#crm-contact-actions-list ul li,
+.crm-contribpage-links-list-inner ul li,
+.crm-event-links-list-inner ul li,
+.crm-participant-list-inner ul li {
+  padding: 0;
+}
+#crm-contact-actions-list ul a,
+.crm-contribpage-links-list-inner ul a,
+.crm-event-links-list-inner ul a,
+.crm-participant-list-inner ul a,
+#crm-create-new-list ul a {
+  color: var(--crm-c-secondary-text);
+  padding: var(--crm-xs2) var(--crm-s);
+  border-radius: var(--crm-roundness);
+  display: block;
+}
+#crm-contact-actions-list ul a:hover,
+#crm-contact-actions-list ul a:focus,
+.crm-contribpage-links-list-inner ul a:hover,
+.crm-contribpage-links-list-inner ul a:focus,
+.crm-event-links-list-inner ul a:hover,
+.crm-event-links-list-inner ul a:focus,
+.crm-participant-list-inner ul a:hover,
+.crm-participant-list-inner ul a:focus,
+#crm-create-new-list ul a:hover,
+#crm-create-new-list ul a:focus {
+  text-decoration: none;
+  color: var(--crm-c-text);
+  background-color: var(--crm-c-page-background);
+}
+
+/* In-table dropdown */
+
+.crm-container .btn-slide::after {
+  font-family: "FontAwesome";
+  content: "\f0da";
+  padding-left: 0.5ch;
+}
+.crm-container .btn-slide {
+  position: relative;
+}
+.crm-container .btn-slide ul.panel {
+  display: none;
+  z-index: 9999;
+  position: absolute;
+  right: 0;
+  padding: 0;
+  margin: var(--crm-m) 0;
+  min-width: var(--crm-dropdown-width);
+  background: var(--crm-dropdown-bg);
+  border-radius: var(--crm-roundness);
+  border: var(--crm-dropdown-border);
+  box-shadow: var(--crm-popup-shadow);
+}
+.crm-container .btn-slide ul.panel::before,
+.crm-container .btn-group .dropdown-menu::before {
+  content: '';
+  display: inline-block;
+  position: absolute;
+  width: 0px;
+  height: 0px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-bottom: 5px solid var(--crm-dropdown-bg);
+  top: -5px;
+  right: var(--crm-r);
+}
+.crm-container .btn-group .dropdown-menu::before {
+  left: var(--crm-l);
+  right: auto;
+}
+.crm-container .btn-group .dropdown-menu-right::before,
+.crm-container .btn-group.pull-right .dropdown-menu::before {
+  right: var(--crm-r);
+  left: auto;
+}
+.crm-container .btn-slide ul.panel li {
+  padding: var(--crm-dropdown-padding);
+  list-style: none;
+  width: auto;
+}
+.crm-container .btn-slide ul.panel li a {
+  text-decoration: none;
+  padding: var(--crm-s);
+  display: block;
+  cursor: var(--crm-hover-clickable);
+  color: var(--crm-dropdown-col);
+  text-align: left;
+}
+.crm-container .btn-slide ul.panel li a:hover,
+.crm-container .btn-slide ul.panel li a:focus {
+  color: var(--crm-dropdown-hover);
+  background-color: var(--crm-dropdown-hover-bg);
+}
+
+/* Tooltip - used on the contact dashboard but no-where else? */
+
+.crm-container .crm-tooltip-wrapper {
+  position: absolute;
+  z-index: 10000;
+  background: none;
+  padding-bottom: 0;
+  margin: -12px;
+  display: none;
+}
+.crm-container .crm-summary-display_name .crm-tooltip-wrapper {
+  margin: -10px -5px;
+}
+.crm-container .crm-tooltip-active .crm-tooltip-wrapper {
+  display: block;
+}
+.crm-container .crm-tooltip-wrapper .crm-tooltip {
+  box-shadow: var(--crm-popup-shadow);
+  background: var(--crm-c-background);
+  border-radius: var(--crm-roundness);
+}
+.crm-container .crm-tooltip-wrapper::before {
+  border-bottom: 10px solid var(--crm-c-background2);
+  border-left: 10px solid rgba(0,0,0,0);
+  border-right: 10px solid rgba(0,0,0,0);
+  content: "";
+  left: var(--crm-m2);
+  position: relative;
+  top: -7px;
+}
+.crm-container .crm-tooltip .crm-summary-group {
+  width: 700px;
+  padding-bottom: 1rem;
+}
+.crm-container .crm-tooltip table,
+.crm-container .crm-tooltip table tr,
+.crm-container .crm-tooltip table tr td {
+  background-color: var(--crm-c-background);
+  border: none;
+  color: var(--crm-c-text);
+  word-wrap: break-word;
+  width: 100%;
+}
+.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr > td {
+  vertical-align: top;
+  white-space: normal;
+}
+.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr > td.crm-section {
+  padding: var(--crm-s) 0;
+}
+.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr:nth-child(1) > td {
+  background: var(--crm-c-background2);
+  color: var(--crm-c-text);
+  font-size: var(--crm-r1);
+  padding: var(--crm-m2) var(--crm-r1);
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+}
+.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr:nth-child(2) > td {
+  border-top: var(--crm-c-divider) !important;
+  width: 50%;
+  padding: var(--crm-r1) var(--crm-m1) 0;
+}
+.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr:nth-child(2) > td:first-child {
+  padding-left: var(--crm-r1);
+}
+
+/* BS3 Dropdowns */
+
+.crm-container .caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin: -2px 1px 0 2px;
+  vertical-align: middle;
+  border-top: 4px dashed;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+.crm-container .dropup,
+.crm-container .dropdown {
+  position: relative;
+}
+.crm-container .dropdown-toggle:focus {
+  outline: 0;
+}
+.crm-container .btn-group .dropdown-menu,
+.crm-container .btn.dropdown-toggle + .dropdown-menu {
+  position: absolute;
+  top: 100%;
+  z-index: 1000;
+  display: none;
+  min-width: var(--crm-dropdown-width);
+  padding: var(--crm-dropdown-padding) !important;
+  margin-top: var(--crm-s);
+  text-align: left;
+  list-style: none;
+  background-color: var(--crm-dropdown-bg);
+  background-clip: padding-box;
+  border: var(--crm-dropdown-border);
+  border-radius: var(--crm-roundness);
+  box-shadow: var(--crm-popup-shadow);
+}
+.crm-container .crm-search .api4-add-where-group-menu {
+  min-width: 80px;
+  background-color: var(--crm-dropdown-bg) !important;
+}
+.crm-container .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.crm-container .dropdown-menu .divider {
+  height: 1px;
+  margin: var(--crm-m) 0;
+  overflow: hidden;
+  background-color: var(--crm-c-background3);
+}
+#bootstrap-theme .dropdown-menu li .form-inline,
+#bootstrap-theme .dropdown-menu li .form-inline a {
+  color: var(--crm-dropdown-col);
+}
+.crm-container .dropdown-menu > li {
+  border-radius: var(--crm-roundness);
+}
+.crm-container .dropdown-menu > li > a {
+  display: block;
+  padding: var(--crm-dropdown-padding);
+  clear: both;
+  color: var(--crm-dropdown-col);
+  border-radius: var(--crm-roundness);
+  white-space: nowrap;
+}
+.crm-container .dropdown-menu > li:not(.disabled) > a i.crm-i {
+  padding-right: var(--crm-s);
+  color: var(--crm-dropdown-col);
+}
+.crm-container .dropdown-menu > li > a:hover,
+.crm-container .dropdown-menu > li > a:focus,
+.crm-container .dropdown-menu > .active > a,
+.crm-container .dropdown-menu > .active > a:hover,
+.crm-container .dropdown-menu > .active > a:focus {
+  color: var(--crm-dropdown-hover);
+  background-color: var(--crm-dropdown-hover-bg);
+  text-decoration: none;
+  border-radius: var(--crm-roundness);
+}
+.crm-container .dropdown-menu > li:not(.disabled) > a:hover i.crm-i,
+.crm-container .dropdown-menu > li:not(.disabled) > a:focus i.crm-i {
+  color: var(--crm-dropdown-hover);
+}
+.crm-container .dropdown-menu > .disabled > a,
+.crm-container .dropdown-menu > .disabled > a:hover,
+.crm-container .dropdown-menu > .disabled > a:focus {
+  color: var(--crm-c-inactive);
+}
+.crm-container .dropdown-menu > .disabled > a:hover,
+.crm-container .dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+.crm-container .open > .dropdown-menu,
+.crm-container .open .btn.dropdown-toggle + .dropdown-menu {
+  display: flex;
+  flex-direction: column;
+  gap: var(--crm-s);
+}
+.crm-container .open > a {
+  outline: 0;
+}
+.crm-container .dropdown-menu-right {
+  right: 0;
+  left: auto;
+}
+.crm-container .dropdown-menu-left {
+  right: auto;
+  left: 0;
+}
+.crm-container li.dropdown-header {
+  display: block;
+  padding: var(--crm-dropdown-padding);
+  white-space: nowrap;
+  color: var(--crm-dropdown-col);
+  font-family: var(--crm-font-bold);
+  font-weight: bold;
+  padding: var(--crm-m) var(--crm-xs) var(--crm-xs) !important;
+  border-bottom: 1px solid var(--crm-dropdown-col);
+  border-radius: 0;
+}
+.crm-container .pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.crm-container .dropup .caret,
+.crm-container .navbar-fixed-bottom .dropdown .caret {
+  content: "";
+  border-top: 0;
+  border-bottom: 4px dashed;
+}
+.crm-container .dropup .dropdown-menu,
+.crm-container .navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+.crm-container .nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.crm-container .open > .dropdown-menu {
+  display: block;
+}
+.crm-container .dropdown-menu {
+  position: absolute;
+  top: 100%;
+  /* left: 0; */
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: var(--crm-dropdown-width);
+  padding: var(--crm-dropdown-padding);
+  margin: 2px 0 0;
+  text-align: left;
+  list-style: none;
+  background-color: var(--crm-dropdown-bg);
+  background-clip: padding-box;
+  border: 1px solid var(--crm-dropdown-border);
+  border: 1px solid rgba(0, 0, 0, .15);
+  border-radius: var(--crm-roundness);
+  box-shadow: var(--crm-popup-shadow);
+}
+.crm-container .dropdown-menu.dropdown-menu-right {
+  right: 0;
+  left: unset;
+}
+.crm-container .dropdown-menu li input {
+  width: -moz-available;
+}
+@media (min-width: 768px) {
+  .crm-container .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto;
+  }
+  .crm-container .navbar-right .dropdown-menu-left {
+    left: 0;
+    right: auto;
+  }
+}
+
+/* Dropdown alert links */
+
+#afGuiEditor  .af-gui-bar .dropdown-menu a:has(.text-danger) {
+  display: flex;
+  justify-content: center;
+  background: var(--crm-dropdown-alert-bg);
+}
+#afGuiEditor  .af-gui-bar .dropdown-menu .text-danger {
+  color: var(--crm-c-alert-text);
+}
+
+/* JsTree Dropdown - all of Vakata Context, from jstree/dist has to be overwritten with !important */
+
+.vakata-context {
+  min-width: var(--crm-dropdown-width);
+  background-color: var(--crm-dropdown-bg) !important;
+  border: 1px solid var(--crm-dropdown-border) !important;
+  border-radius: var(--crm-roundness);
+  box-shadow: var(--crm-popup-shadow) !important;
+  padding: var(--crm-dropdown-padding) !important;
+}
+.vakata-context li > a {
+  line-height: unset !important;
+  color: var(--crm-dropdown-col) !important;
+  text-shadow: none !important;
+  font-weight: normal !important;
+  padding: 0 !important;
+  border: 0 !important;
+  border-radius: var(--crm-roundness) !important;
+}
+.vakata-context li > a:hover,
+.vakata-context .vakata-context-hover > a {
+  background-color: var(--crm-dropdown-hover-bg) !important;
+  box-shadow: none !important;
+  color: var(--crm-dropdown-hover) !important;
+}
+.vakata-context li > a > i {
+  margin: 0 !important;
+  line-height: inherit !important;
+  height: inherit !important;
+}
+.vakata-context li > a .vakata-contextmenu-sep {
+  border-left: 0 !important;
+  background: transparent !important;
+  height: auto !important;
+  width: auto !important;
+  margin: 0 !important;
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_form.css b/civicrm/ext/riverlea/core/css/components/_form.css
new file mode 100644
index 0000000000000000000000000000000000000000..ecf6793d02fd987ff190ef8c821581ce715e16fb
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_form.css
@@ -0,0 +1,834 @@
+/* Form parts */
+.crm-container div.crm-field-wrapper {
+  margin-bottom: var(--crm-r);
+}
+.crm-section {
+  padding: var(--crm-s);
+}
+.crm-container table.form-layout td,
+.crm-container table.form-layout-compressed td,
+.crm-form-block .crm-section {
+  padding: var(--crm-m) var(--crm-s2);
+  border: none !important /* vs contactSummary.css */;
+  height: auto;
+  vertical-align: top;
+}
+.crm-container div.form-layout-compressed {
+  display: flex;
+  gap: var(--crm-s);
+  padding: var(--crm-r) 0;
+  align-items: center;
+}
+.crm-container .crm-results-block-empty {
+  margin: var(--crm-padding-reg) 0;
+}
+
+/* Labels */
+.crm-container .form-layout td.label,
+.crm-container .form-layout-compressed td.label,
+.crm-container .selector td.label,
+.crm-container .form-layout-compressed th.label {
+  width: var(--crm-input-label-width);
+  text-align: var(--crm-input-label-align);
+  margin: var(--crm-m) var(--crm-m2) 0 0;
+  font-family: var(--crm-input-label-font);
+  font-weight: var(--crm-input-label-weight);
+  display: table-cell;
+}
+.crm-container .crm-summary-group .crm-section .label,
+.crm-container label {
+  text-align: left;
+  font-family: var(--crm-input-label-font);
+  font-weight: var(--crm-input-label-weight);
+  padding-right: var(--crm-m2);
+}
+.crm-container .label > label { /* Fix for dble label specification */
+  padding-right: 0;
+  text-align: unset;
+}
+.crm-container .crm-summary-group .crm-section .label {
+  width: 40%;
+}
+.crm-container .radio-inline label,
+.crm-container .checkbox-inline label {
+  font-family: inherit;
+  font-weight: inherit;
+}
+.crm-container .form-layout label,
+.crm-container .form-layout-compressed label,
+.crm-container .form-item label,
+.crm-container .crm-accordion-body label,
+.crm-container .crm-form-block label,
+.crm-container #task-section label {
+  color: var(--crm-input-label-color);
+  font-family: var(--crm-input-label-font);
+  font-weight: var(--crm-input-label-weight);
+  font-size: var(--crm-input-label-size);
+  display: inline-block;
+  margin-bottom: var(--crm-s);
+}
+.crm-container .form-layout td.label label {
+  margin-bottom: 0;
+}
+.crm-container .form-layout label:not(+ .helpicon) {
+  width: var(--crm-input-label-width);
+}
+.crm-contribution_search_form-accordion .form-layout label,
+.crm-advanced_search_form-accordion .form-layout label,
+.crm-search-form-block .form-layout label {
+  width: auto;
+}
+.crm-container .description:not(#help),
+.crm-container td.description {
+  color: var(--crm-input-description);
+  font-size: var(--crm-input-label-size);
+  margin-bottom: var(--crm-flex-gap);
+}
+.crm-container .crm-marker {
+  color: var(--crm-c-alert);
+}
+.crm-container .form-inline {
+  padding: var(--crm-s) 0;
+}
+.crm-search-display .form-inline {
+  padding: var(--crm-padding-reg) 0;
+}
+/* Fieldset */
+.crm-container fieldset {
+  border: var(--crm-c-divider);
+}
+.crm-container fieldset:not(.collapsed,
+.crm-inactive-dashlet-fieldset,
+.crm-search-admin-edit-columns) {
+  padding: var(--crm-fieldset-padding);
+  margin: var(--crm-padding-reg) 0;
+  border: 1px solid var(--crm-fieldset-border-color);
+  border-width: var(--crm-fieldset-border);
+}
+.crm-container fieldset legend {
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+  padding-inline: var(--crm-s);
+  color: var(--crm-c-text);
+}
+
+/* Required Mark */
+.crm-container .required-mark::after {
+  color: var(--crm-c-alert);
+  content: "*";
+  margin-left: var(--crm-s);
+}
+/* Input */
+
+.crm-container input.dateplugin,
+.crm-container input.form-control,
+input.crm-form-text,
+input.crm-form-password,
+.crm-icon-picker-button,
+.crm-container .replace-plain,
+.crm-container input,
+.crm-container textarea,
+select.crm-form-multiselect,
+select.crm-form-select,
+.crm-container .ui-widget input,
+.crm-container select,
+.ui-datepicker .ui-datepicker-header select {
+  transition: var(--crm-input-active-ani);
+  font-size: var(--crm-input-font-size);
+  background-color: var(--crm-input-background);
+  border-radius: var(--crm-input-border-radius);
+  box-shadow: var(--crm-input-box-shadow);
+  color: var(--crm-input-color);
+  border: 1px solid var(--crm-input-border-color);
+  padding: var(--crm-input-padding);
+  height: var(--crm-input-height);
+  width: var(--crm-big-input);
+  font-family: inherit; /* for extra JQuery UI protection */
+}
+.crm-container .replace-plain,
+.crm-container textarea,
+select.crm-form-multiselect {
+  padding: var(--crm-input-padding-large);
+  height: auto;
+  min-height: var(--crm-input-height);
+  width: 100%;
+}
+.crm-container input.crm-form-color {
+  width: var(--crm-input-height);
+  padding: 0;
+  border: 1px solid var(--crm-c-darkest);
+}
+.crm-container .replace-plain {
+  background-color: var(--crm-c-background3);
+  min-width: var(--crm-huge-input);
+}
+input.crm-form-text:focus,
+input.crm-form-password:focus,
+select.crm-form-multiselect:focus,
+select.crm-form-select:focus,
+.crm-icon-picker-button:focus,
+.crm-container input.form-control:focus,
+.crm-container input.dateplugin:focus,
+.crm-container .replace-plain:focus,
+.crm-container textarea:focus,
+.crm-container select[aria-controls]:focus,
+.crm-container .select2-container-active *:focus,
+.crm-container .select2-container-active a.select2-choice {
+  border-color: var(--crm-c-focus);
+  outline: 0;
+  box-shadow: none;
+}
+.crm-container input.error,
+input.crm-error,
+select.crm-error {
+  border-color: var(--crm-c-alert);
+}
+.crm-container :focus,
+.crm-container .ui-dialog :focus {
+  border-color: var(--crm-c-focus);
+  box-shadow: none;
+}
+.crm-container input.crm-placeholder-icon::placeholder {
+  font-family: "FontAwesome";
+  text-align: right;
+}
+.crm-icon-picker-button {
+  margin: 0 0 var(--crm-s);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  float: left;
+}
+.crm-container .crm-form-number {
+  width: auto; /* resets fixed width on input field with browser default */
+}
+
+/* Input size modifiers */
+
+.crm-container .two {
+  width: 3rem; /* .two is used on number inputs that need 1rem for the controls */
+}
+.crm-container .four {
+  width: 4rem;
+}
+.crm-container .six {
+  width: 6rem;
+}
+.crm-container .eight {
+  width: 8rem;
+}
+.crm-container .twelve,
+.crm-container .medium {
+  width: 12rem;
+}
+.crm-container .twenty {
+  width: 20rem;
+}
+.crm-container .big {
+  width: var(--crm-big-input);
+}
+.crm-container .huge,
+input.crm-form-autocomplete,
+input.crm-form-entityref {
+  width: var(--crm-huge-input);
+}
+
+/* Inline edit */
+
+.crm-inline-edit {
+  border: var(--crm-dash-edit-border);
+  border-color: transparent;
+  background: none;
+  position: relative;
+}
+.crm-container .crm-editable-form {
+  display: flex;
+}
+.crm-container .crm-editable-form input {
+  height: var(--crm-input-height);
+  box-shadow: var(--crm-input-box-shadow);
+  padding: var(--crm-input-padding);
+  font-size: var(--crm-input-font-size);
+}
+.crm-container .crm-editable-form button {
+  background: transparent;
+  padding: var(--crm-padding-small);
+}
+.crm-container .crm-editable-form [type="submit"] {
+  color: var(--crm-c-success) !important;
+}
+.crm-container .crm-editable-form [type="cancel"] {
+  color: var(--crm-c-alert) !important;
+}
+/* in place edit  */
+.crm-container .crm-inline-edit,
+.crm-container .crm-editable-disabled,
+.crm-container .crm-editable-enabled {
+  border: var(--crm-dash-edit-border);
+  border-color: transparent;
+}
+.crm-container .crm-editable-textarea-enabled {
+  white-space: normal;
+}
+.crm-container .crm-inline-edit:hover,
+.crm-container .crm-editable-enabled:hover {
+  border: var(--crm-dash-edit-border);
+  cursor: var(--crm-hover-clickable);
+}
+.crm-container .crm-editable-enabled.crm-editable-editing:hover {
+  border-color: transparent;
+  cursor: auto;
+}
+.crm-container span.crm-editable-disabled,
+.crm-container span.crm-editable-enabled {
+  display: inline-block;
+  padding-right: var(--crm-s);
+  min-height: var(--crm-r);
+  min-width: 3em;
+}
+.crm-container .crm-editable-enabled .crm-i {
+  opacity: .5;
+}
+.crm-container .replace-plain a:active:before,
+.crm-container .replace-plain:focus:before,
+.crm-container .replace-plain:hover:before,
+.crm-container .crm-editable-enabled:hover .crm-i {
+  opacity: 1;
+}
+.crm-container .crm-editable-saving {
+  background: #ffffcc!important;
+  opacity: 0.8;
+}
+.crm-editable-form {
+  margin: 0;
+  padding: 0;
+  width: auto !important;
+  /* position: relative; */
+  overflow: visible;
+  display: flex;
+  gap: 0;
+  flex-direction: row;
+}
+.crm-editable-form > * {
+  margin: 0;
+}
+.crm-editable-form input {
+  min-width: 14ch;
+}
+.crm-container .crm-editable-form button {
+  padding: 0 !important;
+}
+.crm-container .crm-editable-form button i.crm-i {
+  margin: 0;
+  border: 0;
+}
+
+/* Checkboxes & radios */
+
+input.crm-form-radio + label,
+input.crm-form-checkbox + label,
+.crm-container input[type="checkbox"] + label[for],
+.crm-container input[type="radio"] + label[for] {
+  margin: 0 var(--crm-m) 0 var(--crm-s);
+  cursor: var(--crm-hover-clickable);
+  width: unset;
+  font-weight: normal;
+  font-family: var(--crm-font);
+}
+.crm-container input[type="checkbox"],
+.crm-container input[type="radio"] {
+  accent-color: var(--crm-input-radio-color);
+  margin: -2px 4px 0 0;
+  width: auto;
+  appearance: auto;
+  height: auto;
+  box-shadow: none;
+}
+/* Checkbox/radio fields with n-per-line. See https://lab.civicrm.org/dev/core/-/issues/4985 */
+.crm-container .crm-multiple-checkbox-radio-options {
+  --gap: 1em;
+  --checkbox-width: 2em;
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--gap);
+}
+/* Override more general styling */
+.crm-container .crm-multiple-checkbox-radio-options :where(input.crm-form-radio,
+input.crm-form-checkbox) + label {
+  margin-left: 0;
+}
+.crm-container .crm-multiple-checkbox-radio-options .crm-option-label-pair {
+  display: grid;
+  grid-template-columns: var(--checkbox-width) 1fr;
+  align-items: baseline;
+}
+.crm-container .crm-multiple-checkbox-radio-options.crm-options-per-line .crm-option-label-pair {
+  flex: 0 0 calc((100% - (var(--crm-opts-per-line) - 1) * var(--gap)) / var(--crm-opts-per-line));
+}
+/* Slider */
+.crm-container .ui-slider {
+  background: var(--crm-c-background4);
+}
+.crm-container .ui-slider .ui-slider-handle {
+  border: 0;
+  background: var(--crm-c-background5);
+}
+
+/* Input types */
+
+.crm-container input[type="file"] {
+  height: auto;
+  padding: var(--crm-s);
+}
+
+/* Select2 */
+
+.crm-container .select2-container:not(.select2-container-multi,
+.collapsible-optgroups) {
+  width: auto;
+  max-width: 100%;
+}
+.crm-container .select2-container {
+  width: var(--crm-big-input) !important /* vs inline fixed width */;
+}
+.crm-container .select2-container-multi {
+  min-width: 96px;
+  max-width: 100%;
+}
+.crm-container select.form-control,
+.crm-container .select2-container-multi .select2-choices,
+.crm-container .select2-container .select2-choice {
+  background: var(--crm-input-background);
+  border: 1px solid var(--crm-input-border-color);
+  border-radius: var(--crm-input-border-radius);
+  box-shadow: var(--crm-input-box-shadow);
+  height: var(--crm-input-height) !important /* vs select2.min.css */;
+  padding: var(--crm-input-padding);
+  font-size: var(--crm-input-font-size);
+  color: var(--crm-input-color);
+  display: flex;
+  align-items: center;
+  margin-right: 0;
+}
+.crm-container .select2-container .select2-choice .select2-arrow {
+  background: transparent;
+  border-left: 0;
+  border-radius: 0 var(--crm-input-border-radius) var(--crm-input-border-radius) 0;
+  width: var(--crm-r3);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.crm-container .select2-container .select2-choice .select2-arrow b {
+  display: none;
+}
+.select2-container.select2-allowclear .select2-choice abbr {
+  position: relative;
+  margin-left: auto;
+  right: var(--crm-r);
+  top: auto;
+}
+.crm-container .select2-container-multi .select2-choices::before,
+.crm-container .select2-container .select2-choice .select2-arrow::before {
+  font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands", "FontAwesome";
+  font-style: normal;
+  text-rendering: auto;
+  color: var(--crm-c-text);
+  background: none;
+  content: var(--crm-input-dropdown-icon);
+}
+.crm-container .select2-container-multi .select2-choices::before {
+  margin-left: auto;
+  order: 1;
+}
+.crm-container .select2-dropdown-open .select2-choice,
+.crm-container .select2-dropdown-open .select2-choices {
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+  border-color: var(--crm-c-focus);
+  box-shadow: none;
+}
+.crm-container .select2-container-multi .select2-choices .select2-search-field input {
+  font-family: var(--crm-font);
+  line-height: normal;
+  margin: 0;
+  padding: 0;
+  min-height: unset;
+  height: unset;
+  color: var(--crm-input-color);
+}
+.crm-container .select2-default {
+  color: var(--crm-input-color) !important /* vs important in select2.min.css */;
+}
+.crm-container .select2-container-multi .select2-choices .select2-search-field input.select2-default {
+  color: var(--crm-input-color);
+}
+.select2-container-disabled a {
+  box-shadow: none;
+  background: var(--crm-c-page-background);
+}
+.select2-container-disabled .select2-arrow {
+  background: transparent;
+}
+.crm-container .select2-container.select2-container-disabled .select2-choice {
+  background-color: var(--crm-c-background);
+  border: 1px dotted var(--crm-c-inactive);
+  cursor: default;
+}
+.select2-container.select2-container-disabled .select2-choice .select2-arrow {
+  border-left: 0;
+  background: var(--crm-c-background);
+}
+.crm-container .select2-container-multi .select2-choices {
+  display: flex;
+  flex-flow: wrap;
+  gap: var(--crm-s);
+  padding: 2px var(--crm-s);
+  align-items: center;
+  font-size: var(--crm-input-font-size);
+  min-height: var(--crm-input-height);
+  height: auto !important;
+}
+.select2-container-multi .select2-choices .select2-search-field {
+  max-width: calc(100% - 2rem);
+}
+.select2-container-multi .select2-choices .select2-search-choice {
+  padding: 1px var(--crm-m) 1px var(--crm-r1);
+  margin: 0;
+  position: relative;
+  line-height: unset;
+  color: var(--crm-c-text);
+  cursor: default;
+  border: var(--crm-c-divider);
+  border-radius: var(--crm-roundness);
+  background-clip: padding-box;
+  user-select: none;
+  background-color: var(--crm-form-select-bg);
+  background-image: none;
+  box-shadow: none;
+}
+.select2-container-multi .select2-choices .select2-search-choice p {
+  margin: 0;
+}
+.select2-container .crm-select2-row-description {
+  display: none;
+}
+.select2-input.select2-default {
+  width: auto;
+}
+.select2-container-multi.loading .select2-choices::before,
+.select2-container.loading .select2-choice .select2-arrow b {
+  content: "\f110";
+  position: absolute;
+  right: var(--crm-m);
+  top: var(--crm-s);
+  animation-name: fa-spin;
+  animation-duration: var(--fa-animation-duration,2s);
+  animation-iteration-count: var(--fa-animation-iteration-count,infinite);
+  animation-timing-function: var(--fa-animation-timing,linear);
+}
+
+/* Select dropdown */
+
+.select2-drop.select2-drop-active.crm-container {
+  background: var(--crm-input-background);
+  border-bottom-left-radius: var(--crm-roundness);
+  border-bottom-right-radius: var(--crm-roundness);
+  border-color: var(--crm-c-focus);
+  right: -1px;
+}
+.select2-drop.select2-drop-active.crm-container.select2-drop-above {
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.select2-search::after {
+  font-family: "FontAwesome";
+  font-style: normal;
+  text-rendering: auto;
+  font-size: .8em;
+  color: #4d4d69;
+  color: #464354;
+  content: "";
+  font-size: 14px;
+  position: relative;
+  right: 20px;
+}
+.select2-search input {
+  background-image: none !important;
+  border-color: #66afe9;
+  font-family: var(--crm-font);
+  line-height: 20px;
+  max-width: 100%;
+}
+.crm-container .select2-results {
+  font-size: var(--crm-m2);
+  padding: 0;
+  margin: 0;
+}
+.select2-drop.select2-drop-active.crm-container .select2-results li {
+  color: var(--crm-c-text);
+  padding-block: var(--crm-s);
+  border-top: 1px solid var(--crm-c-background4);
+  margin: 0;
+}
+.select2-results .select2-ajax-error,
+.select2-results .select2-no-results,
+.select2-results .select2-searching,
+.select2-results .select2-selection-limit {
+  background: var(--crm-input-background);
+}
+.select2-drop.select2-drop-active.crm-container .select2-results .select2-highlighted {
+  background: var(--crm-c-drag-background);
+}
+.select2-drop.select2-drop-active.crm-container .crm-entityref-filters select,
+.select2-drop.select2-drop-active.crm-container .crm-entityref-filters input {
+  background: var(--crm-c-background);
+  border: 1px solid var(--crm-input-border-color);
+  border-radius: var(--crm-roundness);
+  box-sizing: border-box;
+  height: var(--crm-l);
+  margin-top: var(--crm-s);
+}
+.select2-drop.select2-drop-active.crm-container .select2-results > li {
+  color: var(--crm-c-text);
+  padding: var(--crm-m);
+  border-top: 0;
+}
+.select2-drop .crm-entityref-links {
+  border-top: 1px solid var(--crm-input-border-color);
+  margin-top: var(--crm-m);
+}
+.crm-container .select2-results .select2-result-label {
+  font-size: var(--crm-input-font-size);
+  padding: var(--crm-s) var(--crm-m);
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.crm-container .select2-results > li .select2-result-label {
+  padding: 0;
+}
+.select2-results li.select2-result-with-children > .select2-result-label {
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+  background: var(--crm-c-background3);
+  padding: var(--crm-s);
+}
+.crm-container .crm-select2-row-description p {
+  font-weight: normal;
+  font-family: var(--crm-font);
+  font-size: var(--crm-m2);
+  margin: 0;
+  padding: 0;
+}
+
+/* Dates */
+
+.form-inline:has(.crm-form-date-wrapper) {
+  display: flex;
+  align-items: center;
+  gap: var(--crm-xs);
+}
+.crm-form-date-wrapper {
+  display: flex;
+  align-items: center;
+  flex-flow: wrap;
+  gap: var(--crm-flex-gap);
+}
+.crm-container input.crm-form-time {
+  width: 9ch;
+}
+.crm-container input.dateplugin,
+.crm-container input.crm-form-date,
+#bootstrap-theme input.dateplugin,
+#bootstrap-theme .input-group input.crm-form-date {
+  width: 14ch;
+}
+.crm-form-date-wrapper a.crm-clear-link {
+  display: flex;
+  align-items: center;
+}
+.crm-container input.crm-placeholder-icon {
+  padding-right: var(--crm-m);
+}
+.ui-datepicker,
+.ui-datepicker * {
+  border-radius: 0;
+  font-family: var(--crm-font);
+  height: unset;
+}
+.ui-datepicker {
+  background: var(--crm-input-background) !important;
+  border-radius: 0;
+  box-shadow: var(--crm-popup-shadow);
+  min-width: 30ch;
+  padding: var(--crm-m1);
+  width: auto;
+  z-index: 100003 !important; /* vs menubar for datepickers in modals */
+}
+.ui-datepicker .ui-datepicker-header {
+  border: 0;
+  margin-bottom: var(--crm-s);
+}
+.ui-datepicker :not(b) {
+  background: none !important;
+  border: 0 solid transparent !important;
+}
+.ui-datepicker .ui-datepicker-header .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-header .ui-datepicker-next {
+  border-radius: var(--crm-roundness);
+  box-shadow: none !important;
+  cursor: var(--crm-hover-clickable);
+  text-align: center;
+  top: var(--crm-s3);
+  border: 0 solid transparent;
+}
+.ui-datepicker-next.ui-corner-all:hover,
+.ui-datepicker-prev.ui-corner-all:hover {
+  background: var(--crm-c-gray-100) !important;
+  border: 0 solid transparent;
+}
+.ui-datepicker .ui-datepicker-header .ui-datepicker-prev::before,
+.ui-datepicker .ui-datepicker-header .ui-datepicker-next::before {
+  font-family: "FontAwesome";
+  color: var(--crm-c-text);
+  font-size: var(--crm-small-font-size);
+  line-height: var(--crm-l);
+  padding: 0;
+}
+.ui-datepicker .ui-datepicker-prev::before {
+  content: "";
+}
+.ui-datepicker .ui-datepicker-next::before {
+  content: "";
+}
+.ui-datepicker .ui-datepicker-header select {
+  font-family: var(--crm-font);
+  margin: 0 var(--crm-m1);
+  padding-left: 5px !important;
+  font-size: var(--crm-m3);
+  width: 7ch;
+}
+.ui-datepicker-calendar thead tr {
+  border-top: 1px solid var(--crm-c-gray-300);
+}
+.ui-datepicker-calendar thead th {
+  color: var(--crm-c-text);
+  font-size: var(--crm-small-font-size);
+}
+.ui-datepicker-calendar tr {
+  border-bottom: none;
+}
+.ui-datepicker-calendar [data-handler],
+.ui-datepicker-calendar .ui-state-disabled {
+  background-color: var(--crm-gray-50) !important;
+  border: 0;
+  font-size: var(--crm-small-font-size);
+  opacity: 1;
+  padding: var(--crm-s);
+}
+.ui-datepicker-calendar .ui-state-disabled {
+  opacity: 0.35;
+}
+.ui-datepicker-calendar [data-handler] .ui-state-active,
+.ui-datepicker-calendar .ui-state-disabled .ui-state-active {
+  background-color: var(--crm-c-primary) !important;
+  color: var(--crm-c-primary-text) !important;
+}
+.ui-datepicker-calendar [data-handler] a,
+.ui-datepicker-calendar .ui-state-disabled a {
+  border: 0;
+  border-radius: 20px;
+  cursor: var(--crm-hover-clickable);
+  padding: var(--crm-s);
+  text-align: center;
+}
+
+/* JQ spinner */
+
+.crm-container .ui-spinner input,
+#crm-search-results-page-size /* SK pagination */ {
+  width: 8ch;
+}
+.crm-container .ui-spinner a.ui-spinner-button {
+  width: var(--crm-r2);
+  margin: 1px;
+  cursor: var(--crm-hover-clickable);
+  color: var(--crm-c-link);
+  border-radius: 0;
+  border-left: 1px solid var(--crm-input-border-color);
+}
+.crm-container .ui-spinner a.ui-spinner-button:hover,
+.crm-container .ui-spinner a.ui-spinner-button:focus {
+  color: var(--crm-c-light-text);
+}
+.crm-container .ui-spinner a.ui-spinner-button span::before {
+  font-family: "FontAwesome";
+  font-style: normal;
+  font-weight: normal;
+  font-size: var(--crm-m3);
+  text-indent: 0;
+  display: block;
+}
+.crm-container .ui-spinner a.ui-spinner-up {
+  border-top-right-radius: var(--crm-input-border-radius);
+}
+.crm-container .ui-spinner a.ui-spinner-down {
+  border-bottom-right-radius: var(--crm-input-border-radius);
+}
+.crm-container .ui-spinner a.ui-spinner-up span::before {
+  content: var(--crm-icon-sort-asc);
+  margin-top: 3px;
+}
+.crm-container .ui-spinner a.ui-spinner-down span::before {
+  content: var(--crm-icon-sort-desc);
+  margin-top: -4px;
+}
+
+/* BS3 radio/checklbox */
+
+#bootstrap-theme .radio,
+#bootstrap-theme .checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+#bootstrap-theme .radio.disabled label,
+#bootstrap-theme fieldset[disabled].radio label,
+#bootstrap-theme .checkbox.disabled label,
+#bootstrap-theme fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+#bootstrap-theme .radio label,
+#bootstrap-theme .checkbox label {
+  min-height: 20px;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: 400;
+  cursor: var(--crm-hover-clickable);
+}
+#bootstrap-theme .radio + .radio,
+#bootstrap-theme .checkbox + .checkbox {
+  margin-top: -5px;
+}
+#bootstrap-theme .radio-inline,
+#bootstrap-theme .checkbox-inline {
+  position: relative;
+  display: inline-block;
+  margin-bottom: 0;
+  font-weight: 400;
+  vertical-align: middle;
+  cursor: var(--crm-hover-clickable);
+}
+#bootstrap-theme .radio-inline.disabled,
+fieldset[disabled] #bootstrap-theme .radio-inline,
+#bootstrap-theme .checkbox-inline.disabled,
+fieldset[disabled] #bootstrap-theme .checkbox-inline {
+  cursor: not-allowed;
+}
+#bootstrap-theme .radio-inline + .radio-inline,
+#bootstrap-theme .checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: var(--crm-m);
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_front.css b/civicrm/ext/riverlea/core/css/components/_front.css
new file mode 100644
index 0000000000000000000000000000000000000000..390095effb1f9a24ec96101794ca5395b35eca74
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_front.css
@@ -0,0 +1,219 @@
+/* Front-end specific */
+
+/* General */
+
+.crm-container.crm-public {
+  --crm-font: inherit;
+  --crm-font-bold: inherit;
+  --crm-font-italic: inherit;
+  --crm-font-bold-italic: inherit;
+}
+.crm-container.crm-public #crm-main-content-wrapper {
+  margin-inline: auto;
+  width: clamp(calc(var(--crm-f-form-width) / 2),100%,var(--crm-f-form-width));
+}
+.crm-container.crm-public fieldset:not(.collapsed,
+.crm-inactive-dashlet-fieldset,
+.af-container-style-pane),
+.crm-container.crm-public .crm-event-info-form-block,
+.crm-container.crm-public #crm-profile-block,
+.crm-container.crm-public .crm-container.crm-public .af-container:not(.af-container-style-pane),
+.crm-container.crm-public .email-5-section {
+  background-color: var(--crm-f-fieldset-bg);
+  margin: var(--crm-f-fieldset-margin);
+  padding: var(--crm-f-fieldset-padding);
+  border: var(--crm-f-fieldset-border);
+  box-shadow: var(--crm-f-box-shadow);
+}
+.crm-container.crm-public fieldset legend {
+  padding-block: var(--crm-f-fieldset-padding);
+  font-size: var(--crm-f-legend-size);
+  text-align: var(--crm-f-legend-align);
+}
+af-form > fieldset > legend {
+  position: relative;
+  top: calc(2 * var(--crm-f-fieldset-padding));
+  margin-bottom: var(--crm-f-fieldset-padding);
+  width: 100%;
+  float: none;
+}
+.crm-container.crm-public .header-dark {
+  background: var(--crm-c-secondary);
+  color: var(--crm-c-light-text);
+  padding: var(--crm-m1) var(--crm-f-fieldset-padding);
+  font-family: var(--crm-font-bold);
+  font-weight: bold;
+  font-size: var(--crm-r1);
+  border-radius: var(--crm-roundness);
+}
+.crm-contribution-confirm-form-block fieldset legend:has(~ .header-dark) {
+  display: none; /* fix for duplication on confirmation screen of legend text with Header Dark text */
+}
+.crm-container.crm-public .crm-section {
+  padding: 0;
+}
+.crm-container.crm-public fieldset > fieldset,
+.crm-container.crm-public fieldset:has(> fieldset) {
+  padding-top: 0;
+}
+.crm-container.crm-public .af-container:not(.af-container-style-pane) .af-container:not(.af-container-style-pane),
+.crm-container.crm-public fieldset .crm-form-block {
+  box-shadow: none !important; /* vs _page.css */
+}
+.crm-container.crm-public h3 {
+  background: transparent;
+  padding: 0;
+}
+.crm-container.crm-public .form-layout-compressed {
+  display: block;
+}
+.crm-container.crm-public span#msgbox {
+  border-radius: var(--crm-roundness);
+  padding: var(--crm-padding-small);
+}
+.crm-container.crm-public #civicrm-footer::after {
+  display: none;
+}
+/* Input */
+.crm-container.crm-public .crm-section:has( > .label) {
+  padding: var(--crm-f-form-padding);
+  display: var(--crm-f-form-layout);
+  grid-template-columns: var(--crm-f-label-width) 1fr 0;
+  margin: 0 calc(-1 * var(--crm-f-form-padding));
+}
+.crm-container.crm-public .crm-section:has( > .content input:focus),
+.crm-container.crm-public .crm-section:has( > .content select:focus),
+.crm-container.crm-public .crm-section:has( > .content textarea:focus) {
+  background-color: var(--crm-f-form-focus-bg);
+}
+.crm-container.crm-public .crm-section:has( > .content input.error),
+.crm-container.crm-public .crm-section:has( > .content textarea.error),
+.crm-container.crm-public .crm-section:has( > .content select.error),
+.crm-container.crm-public .crm-section:has( > .content input.crm-inline-error),
+.crm-container.crm-public .crm-section:has( > .content textarea.crm-inline-error),
+.crm-container.crm-public .crm-section:has( > .content select.crm-inline-error) {
+  background-color: var(--crm-f-form-error-bg);
+}
+.crm-container.crm-public input[type="text"],
+.crm-container.crm-public input[type="password"],
+.crm-container.crm-public input[type="email"],
+.crm-container.crm-public input,
+.crm-container.crm-public select,
+.crm-container.crm-public textarea,
+.crm-container.crm-public .select2-container .select2-choice {
+  border-radius: var(--crm-f-input-radius);
+  padding: var(--crm-f-input-padding);
+  font-size: var(--crm-f-input-font-size);
+  min-width: var(--crm-f-input-width);
+}
+.crm-container.crm-public .select2-search input[type="text"] {
+  min-width: unset;
+}
+.crm-container.crm-public input[type="radio"] {
+  margin: var(--crm-s2) var(--crm-s3) 0 0;
+  min-width: auto;
+}
+.crm-container.crm-public input[type="checkbox"] {
+  margin: var(--crm-s2) var(--crm-s3) 0 0;
+  float: left;
+  min-width: auto;
+}
+.crm-container.crm-public .crm-checkbox-list input[type="checkbox"] {
+  margin: inherit; /* resets margin in checkbox list grids */
+}
+.crm-container.crm-public .big {
+  width: var(--crm-f-input-width);
+}
+.crm-container.crm-public .select2-search input,
+.crm-container.crm-public .select2-results select,
+.crm-container.crm-public .select2-results input {
+  padding: var(--crm-s) var(--crm-r1) var(--crm-s);
+}
+.crm-container.crm-public .select2-dropdown-open .select2-choice,
+.crm-container.crm-public .select2-dropdown-open .select2-choices {
+  border-radius: var(--crm-f-input-radius) var(--crm-f-input-radius) 0 0;
+}
+.crm-container.crm-public .crm-submit-buttons {
+  padding-inline: 0;
+}
+/* Afform */
+.crm-container.crm-public af-field {
+  padding-block: var(--crm-f-form-padding);
+  display: block;
+}
+.crm-container.crm-public .af-container.af-layout-inline,
+.crm-container.crm-public .af-container.af-layout-cols {
+  padding: var(--crm-f-form-padding);
+}
+/* Contribution pages */
+.crm-container.crm-public .other_amount-section {
+  padding-top: 0;
+}
+.crm-container.crm-public table#membership-listings {
+  border: 0;
+}
+.crm-container.crm-public .amount_display-group .display-block,
+.crm-container.crm-public .event_fees-group > .crm-section {
+  padding: var(--crm-f-form-padding);
+}
+.crm-container.crm-public #attachments table.form-layout-compressed {
+  margin-block: var(--crm-m) 0;
+}
+.crm-container.crm-public #attachments table.form-layout-compressed tr {
+  display: flex;
+  flex-direction: column;
+  gap: var(--crm-s);
+}
+.crm-container.crm-public #attachments table.form-layout-compressed td {
+  width: 100%;
+  padding: 0;
+  text-align: var(--crm-f-label-align);
+}
+.crm-container.crm-public .crm-profile-view-title {
+  padding-inline: var(--crm-f-form-padding);
+  font-size: var(--crm-r1);
+}
+/* Empowered by logo */
+
+.crm-public-footer {
+  display: flex;
+  align-items: center;
+  justify-content: var(--crm-f-logo-align);
+  gap: var(--crm-s);
+  width: var(--crm-f-form-width);
+  margin: 0 auto;
+}
+.crm-container a.empowered-by-link {
+  background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg id='Layer_1' data-name='Layer 1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 229.76 59.78'%3E%3Cdefs%3E%3Cstyle%3E .cls-1 %7B fill: %23086287; %7D .cls-2 %7B fill: %2381c459; %7D %3C/style%3E%3C/defs%3E%3Cg%3E%3Cpath class='cls-1' d='m191.47,59.78h0c-3.77-.07-5.2-4.43-5.35-4.92l-12.85-42.11c-.76-2.47-.58-4.46.51-5.92.71-.94,2.12-2.04,4.83-1.99.99.02,1.77.19,1.85.21l42.78,9.97c2.75.64,4.44,1.94,5.02,3.85.93,3.04-1.65,5.92-1.95,6.24l-29.94,32.12c-1.59,1.72-3.25,2.58-4.9,2.55Zm-13.07-50.53c-.77,0-1.02.19-1.06.26-.22.31-.26.44.19,1.93l12.85,42.11c.29.9.76,1.74,1.18,1.77h0s.52,0,1.57-1.13l29.94-32.12c.55-.61,1.06-1.6.95-1.9-.08-.22-.43-.5-1.77-.81l-42.78-9.97h0s-.56-.13-1.07-.14Z'/%3E%3Cpath class='cls-2' d='m186.66,56.35c-1.38.51-2.83.61-3.96.24h0c-3.57-1.17-3.68-5.74-3.68-6.26V9.33l4.21.94.02,40.15c0,.94.25,1.84.83,1.94h0s.3.09,1.15-.3l1.43,4.29Zm2.57-6.52l34.62-20.03c.7-.42,1.53-1.04,1.46-1.54,0-.07-.17-.52-.92-1.05l2.9-3.3c1.64,1.25,2.47,2.71,2.47,4.35,0,3.17-3.3,5.17-3.68,5.39l-35.51,20.4-1.34-4.22Zm31.12-24.89l-34.02-19.79s-.85-.54-1.34-.7c-.73-.24-1.08,0-1.15.05-.2.14-.27.24-.35,1.24l-4.38-.82c.24-1.82.95-3.17,2.12-4.03.95-.69,2.62-1.33,5.19-.5.94.31,1.63.7,1.71.74l35.39,20.42-3.17,3.39Z'/%3E%3C/g%3E%3Cpath class='cls-1' d='m158.23,22.34c-.48-.28-.86-.67-1.15-1.15-.28-.48-.42-1-.42-1.57s.14-1.09.42-1.57.66-.86,1.15-1.15,1-.42,1.57-.42,1.09.14,1.57.42.86.66,1.15,1.15.42,1,.42,1.57-.14,1.09-.42,1.57-.66.86-1.15,1.15-1,.42-1.57.42-1.09-.14-1.57-.42Zm2.91-.4c.41-.24.74-.57.98-.98.24-.41.36-.86.36-1.35s-.12-.93-.36-1.34-.57-.73-.98-.98c-.41-.24-.86-.36-1.35-.36s-.93.12-1.34.36-.73.57-.98.98c-.24.41-.36.85-.36,1.34s.12.94.36,1.35c.24.41.57.74.98.98s.85.36,1.34.36c.49.01.94-.12,1.35-.36Zm-2.56-.62c-.06-.05-.08-.12-.08-.21v-2.83c0-.11.04-.21.11-.28s.17-.12.28-.12h1.05c.46,0,.8.1,1.03.29s.34.45.34.76c0,.21-.06.39-.18.53s-.28.25-.46.32c.16.06.3.18.42.35.12.18.18.42.18.74v.24c0,.08-.03.15-.09.21s-.13.09-.21.09-.15-.03-.21-.09c-.06-.06-.09-.13-.09-.21v-.16c0-.25-.04-.46-.11-.63s-.25-.26-.53-.26h-.95v1.06c0,.08-.03.15-.09.21s-.13.08-.21.08c-.08,0-.15-.03-.2-.09Zm1.33-1.78c.25,0,.45-.05.6-.15.15-.1.22-.25.22-.44,0-.18-.06-.32-.19-.42s-.34-.14-.65-.14h-.81v1.15h.83Z'/%3E%3Cg%3E%3Cpath class='cls-1' d='m6.93,44.07c-2.15-1.18-3.85-2.87-5.08-5.08s-1.85-4.79-1.85-7.74.62-5.53,1.85-7.74,2.93-3.9,5.08-5.08,4.58-1.77,7.29-1.77c1.84,0,3.49.22,4.94.65,1.45.43,2.89,1.06,4.33,1.87.6.32.89.84.89,1.54,0,.41-.15.77-.45,1.08-.3.31-.69.47-1.18.47-.27,0-.51-.05-.73-.16-1.19-.62-2.36-1.1-3.49-1.42-1.14-.32-2.45-.49-3.94-.49-2.33,0-4.31.48-5.95,1.44s-2.87,2.28-3.7,3.94c-.83,1.67-1.24,3.55-1.24,5.67s.41,4,1.24,5.67,2.06,2.98,3.7,3.94c1.64.96,3.62,1.44,5.95,1.44,1.49,0,2.8-.16,3.94-.49,1.14-.32,2.3-.8,3.49-1.42.22-.11.46-.16.73-.16.49,0,.88.15,1.18.45.3.3.45.66.45,1.1,0,.7-.3,1.22-.89,1.54-1.44.81-2.88,1.44-4.33,1.87s-3.09.65-4.94.65c-2.71,0-5.14-.59-7.29-1.77Z'/%3E%3Cpath class='cls-1' d='m28.68,19.87c-.41-.41-.61-.89-.61-1.46v-.16c0-.57.2-1.06.61-1.46.41-.41.89-.61,1.46-.61h.24c.57,0,1.06.2,1.46.61s.61.89.61,1.46v.16c0,.57-.2,1.06-.61,1.46-.41.41-.89.61-1.46.61h-.24c-.56,0-1.05-.2-1.46-.61Zm.25,25.23c-.35-.35-.53-.79-.53-1.3v-17.42c0-.51.18-.96.53-1.32.35-.37.79-.55,1.3-.55.54,0,.99.18,1.34.53s.53.8.53,1.34v17.43c0,.51-.18.95-.55,1.3-.37.35-.81.53-1.32.53-.52,0-.95-.18-1.3-.54Z'/%3E%3Cpath class='cls-1' d='m43.71,45.21c-.41-.28-.7-.64-.89-1.08l-7.07-16.9c-.14-.32-.2-.61-.2-.85,0-.51.18-.96.53-1.32.35-.37.79-.55,1.3-.55.35,0,.68.1,1,.3.31.2.53.45.67.75l6.22,15.76,6.22-15.76c.14-.3.36-.55.67-.75s.64-.3,1-.3c.51,0,.95.18,1.3.55.35.37.53.81.53,1.32,0,.24-.07.53-.2.85l-7.07,16.9c-.19.43-.49.79-.89,1.08s-.85.43-1.34.43h-.41c-.51-.01-.96-.15-1.37-.43Z'/%3E%3Cpath class='cls-1' d='m58.71,19.87c-.41-.41-.61-.89-.61-1.46v-.16c0-.57.2-1.06.61-1.46.41-.41.89-.61,1.46-.61h.24c.57,0,1.06.2,1.46.61s.61.89.61,1.46v.16c0,.57-.2,1.06-.61,1.46-.41.41-.89.61-1.46.61h-.24c-.57,0-1.06-.2-1.46-.61Zm.24,25.23c-.35-.35-.53-.79-.53-1.3v-17.42c0-.51.18-.96.53-1.32.35-.37.79-.55,1.3-.55.54,0,.99.18,1.34.53s.53.8.53,1.34v17.43c0,.51-.18.95-.55,1.3-.37.35-.81.53-1.32.53-.51,0-.95-.18-1.3-.54Z'/%3E%3Cpath class='cls-1' d='m72.86,44.07c-2.15-1.18-3.85-2.87-5.08-5.08s-1.85-4.79-1.85-7.74.62-5.53,1.85-7.74c1.23-2.21,2.93-3.9,5.08-5.08s4.58-1.77,7.29-1.77c1.84,0,3.49.22,4.94.65,1.45.43,2.89,1.06,4.33,1.87.6.32.89.84.89,1.54,0,.41-.15.77-.45,1.08-.3.31-.69.47-1.18.47-.27,0-.51-.05-.73-.16-1.19-.62-2.36-1.1-3.49-1.42-1.14-.32-2.45-.49-3.94-.49-2.33,0-4.31.48-5.95,1.44s-2.87,2.28-3.7,3.94c-.83,1.67-1.24,3.55-1.24,5.67s.41,4,1.24,5.67c.83,1.67,2.06,2.98,3.7,3.94s3.62,1.44,5.95,1.44c1.49,0,2.8-.16,3.94-.49,1.14-.32,2.3-.8,3.49-1.42.22-.11.46-.16.73-.16.49,0,.88.15,1.18.45.3.3.45.66.45,1.1,0,.7-.3,1.22-.89,1.54-1.44.81-2.88,1.44-4.33,1.87-1.45.43-3.09.65-4.94.65-2.7,0-5.13-.59-7.29-1.77Z'/%3E%3Cpath class='cls-1' d='m95.11,45.1c-.35-.35-.53-.79-.53-1.3v-24.86c0-.51.18-.96.53-1.32s.79-.55,1.3-.55h9.47c3.68,0,6.45.76,8.29,2.28s2.76,3.51,2.76,5.97c0,1.62-.45,3.11-1.36,4.45s-2.23,2.31-3.96,2.9c1.95.51,3.28,1.73,4,3.64.72,1.91,1.08,3.79,1.08,5.63v1.87c0,.51-.18.95-.53,1.3-.35.35-.79.53-1.3.53-.57,0-1.02-.17-1.36-.51-.34-.34-.51-.78-.51-1.32v-1.22c0-1.35-.12-2.61-.37-3.76s-.83-2.18-1.75-3.09c-.92-.91-2.32-1.36-4.18-1.36h-8.41v9.43c0,.51-.18.95-.55,1.3s-.81.53-1.32.53c-.52,0-.95-.18-1.3-.54Zm10.52-14.21c2.33,0,4.18-.46,5.55-1.38,1.37-.92,2.05-2.22,2.05-3.9s-.59-2.87-1.77-3.74c-1.18-.87-3.19-1.3-6.03-1.3h-7.15v10.32h7.35Z'/%3E%3Cpath class='cls-1' d='m121.92,45.1c-.35-.35-.53-.79-.53-1.3v-24.25c0-.73.26-1.36.77-1.89.51-.53,1.14-.79,1.87-.79h1.34c.54,0,1.04.16,1.48.49.45.33.78.73,1,1.22l9.22,22.99,9.22-22.99c.22-.49.55-.89,1-1.22.45-.32.94-.49,1.48-.49h1.34c.73,0,1.35.26,1.87.79.51.53.77,1.16.77,1.89v24.25c0,.51-.18.95-.53,1.3-.35.35-.79.53-1.3.53s-.96-.18-1.32-.53c-.37-.35-.55-.79-.55-1.3v-23.07l-9.38,23.2c-.22.51-.56.93-1.04,1.24-.47.31-1,.47-1.56.47s-1.09-.16-1.56-.47-.82-.72-1.04-1.24l-9.38-23.2v23.08c0,.51-.18.95-.55,1.3s-.81.53-1.32.53c-.51-.01-.95-.18-1.3-.54Z'/%3E%3C/g%3E%3C/svg%3E");
+  background-repeat: no-repeat;
+  display: inline-block;
+  height: var(--crm-f-logo-height);
+  width: calc(var(--crm-f-logo-height) * 3.5);
+}
+.crm-container div.empowered-by-logo span {
+  visibility: hidden;
+}
+@media (min-width: 480px) {
+  .crm-container.crm-public {
+    --crm-page-padding: var(--crm-f-form-padding);
+  }
+  .crm-container.crm-public .crm-section .label {
+    float: none;
+    width: inherit;
+    text-align: var(--crm-f-label-align);
+    font-weight: var(--crm-f-label-weight);
+  }
+  .crm-container.crm-public .crm-section .content {
+    margin-left: 0;
+  }
+}
+@media (max-width: 479px) {
+  .crm-container.crm-public {
+    --crm-f-input-width: 100%;
+    --crm-page-padding: 0;
+    width: 100%;
+  }
+  .crm-container af-field {
+    width: 100%;
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_icons.css b/civicrm/ext/riverlea/core/css/components/_icons.css
new file mode 100644
index 0000000000000000000000000000000000000000..3762eaaffae7d93deee8020de7b6fae0ab24e084
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_icons.css
@@ -0,0 +1,351 @@
+.crm-container .messages .crm-i {
+  padding: 0 var(--crm-m) var(--crm-s) 0;
+  float: left;
+}
+.crm-container div:not(.crm-search-display-editable-buttons) > button.btn-xs:has(.fa-times),
+#bootstrap-theme button.btn-xs:has(.fa-times),
+.crm-container .crm-hover-button:has(.crm-i),
+.crm-container .crm-hover-button:has(.crm-i):hover,
+.crm-container .crm-hover-button:has(.crm-i):focus {
+  background: transparent;
+  color: var(--crm-c-link) !important;
+  padding: var(--crm-btn-small-padding);
+}
+.crm-container .select2-container[class*=" fa-"]::before,
+.crm-container .messages.crm-empty-table > img /* removes inform.gif icon */ {
+  display: none;
+}
+input#crm-qsearch-input::placeholder {
+  font-family: sans-serif, 'FontAwesome'; /* Fix for type in placeholders */
+}
+
+/* Notification icons */
+.crm-container #crm-notification-container div.ui-notify-message.error .notify-content .crm-i.fa-exclamation-triangle,
+.crm-container #crm-notification-container div.ui-notify-message div.icon {
+  display: none;
+}
+#crm-notification-container .ui-notify-message a.ui-notify-cross::before,
+.crm-container #crm-notification-container div.ui-notify-message h1::before,
+div.civicrm-community-messages a.civicrm-community-message-dismiss::before,
+.crm-container .delete-icon,
+.crm-container span.batch-valid,
+.crm-container span.batch-invalid,
+.crm-container .messages.crm-empty-table::before {
+  font-family: "Font Awesome 6 Free", "FontAwesome";
+  font-style: normal;
+  font-weight: normal;
+  text-rendering: auto;
+  font-size: var(--crm-font-size);
+  margin: 0 var(--crm-m) 0 0;
+}
+.crm-container #crm-notification-container div.ui-notify-message.error h1::before,
+.crm-container span.batch-invalid::before {
+  content: var(--crm-icon-alert);
+  color: var(--crm-c-alert);
+}
+.crm-container #crm-notification-container div.ui-notify-message.success h1::before,
+.crm-container span.batch-valid::before {
+  content: var(--crm-icon-success);
+  color: var(--crm-c-success);
+}
+.crm-container #crm-notification-container div.ui-notify-message.info h1::before,
+.crm-container .messages.crm-empty-table::before {
+  content: var(--crm-icon-info);
+  color: var(--crm-c-info);
+}
+.crm-container .messages.crm-empty-table > i.crm-i {
+  display: none; /* removes double icon when markup uses both */
+}
+
+/* Help icon */
+.crm-container a.helpicon::before {
+  content: "\f059";
+}
+.crm-container a.helpicon:hover,
+.crm-container a.helpicon:focus {
+  text-decoration: none;
+}
+
+/* Check icon */
+.crm-container .crm-i.fa-check,
+.crm-container .crm-i.fa-check-circle,
+.crm-container .btn-success .crm-i,
+.crm-container .crm-i.fa-plus-circle {
+  color: var(--crm-icon-success-color);
+}
+
+/* Close icon */
+#crm-notification-container .ui-notify-message a.ui-notify-cross,
+div.civicrm-community-messages a.civicrm-community-message-dismiss,
+.crm-container .ui-icon-circle-close {
+  font-size: 0;
+  float: right;
+  text-decoration: none;
+  padding: 0 0 0 0.5rem;
+  opacity: 0.5; /* matches Bootstrap */
+  background-image: none;
+  position: relative !important;
+  text-indent: 0;
+  height: auto;
+  width: auto;
+}
+#crm-notification-container .ui-notify-message a.ui-notify-cross::before,
+div.civicrm-community-messages a.civicrm-community-message-dismiss::before,
+.crm-container .ui-icon-circle-close::before {
+  content: var(--crm-icon-close);
+  color: var(--crm-notify-col);
+}
+.crm-container .ui-icon-circle-close:hover,
+.crm-container .ui-icon-circle-close:focus,
+#crm-notification-container .ui-notify-message a.ui-notify-cross:hover,
+#crm-notification-container .ui-notify-message a.ui-notify-cross:focus {
+  opacity: 1;
+  transition: 0.2s;
+}
+.crm-container .crm-i.fa-times,
+.crm-container .btn-danger .crm-i,
+.crm-container button .fa-times {
+  color: var(--crm-icon-alert-color);
+}
+.crm-container .crm-dashlet-header a.fa-times {
+  color: var(--crm-dashlet-header-col);
+}
+
+/* Info icon */
+.crm-container .crm-i.fa-info,
+.crm-container .btn-info .crm-i::before {
+  color: var(--crm-icon-info-color);
+}
+
+/* Warning icon */
+.crm-container .crm-i.fa-warning,
+.crm-container .btn-warning .crm-i::before {
+  color: var(--crm-icon-warning-color);
+}
+
+/* Table sorting icons */
+.crm-container tr a.sorting,
+.crm-container tr a.sorting_asc,
+.crm-container tr a.sorting_desc,
+.crm-search-display th.crm-sortable-col,
+.crm-container table.dataTable thead th.sorting,
+.crm-container table.dataTable thead th.sorting_asc,
+.crm-container table.dataTable thead th.sorting_desc {
+  background-image: none;
+  color: var(--crm-table-header-col);
+  box-shadow: none;
+  line-height: 1;
+}
+.crm-container tr a.sorting,
+.crm-container tr a.sorting_asc,
+.crm-container tr a.sorting_desc {
+  display: flex;
+  flex-direction: row-reverse;
+  justify-content: start;
+  gap: var(--crm-flex-gap);
+  align-items: center;
+}
+.crm-container th a:hover,
+.crm-container th a:focus {
+  text-decoration: none;
+}
+.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon {
+  /* Bootstrap & SearchKit sort resets */
+  position: absolute;
+  margin-left: -1.5ch;
+  color: var(--crm-table-sort-col);
+  line-height: inherit;
+  font-style: normal;
+  text-rendering: auto;
+  font-family: "Font Awesome 6 Free", "FontAwesome";
+  font-style: normal;
+  font-weight: normal;
+  cursor: var(--crm-hover-clickable);
+  opacity: 1;
+}
+.crm-container .table > thead > tr > th:has(.crm-search-table-column-sort-icon) {
+  padding-left: 2ch;
+}
+.crm-container a.sorting::after,
+.crm-container a.sorting_asc::after,
+.crm-container a.sorting_desc::after,
+.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon::before,
+.crm-container table.dataTable thead th.sorting::before,
+.crm-container table.dataTable thead th.sorting_asc::before,
+.crm-container table.dataTable thead th.sorting_desc::before,
+.jstree-default .jstree-icon {
+  font-family: "Font Awesome 6 Free", "FontAwesome";
+  font-style: normal;
+  text-rendering: auto;
+  font-size: var(--crm-dash-icon-size);
+  content: var(--crm-icon-sort);
+  color: var(--crm-table-sort-col);
+  cursor: var(--crm-hover-clickable);
+}
+.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon::before,
+.crm-container table.dataTable thead th.sorting::before,
+.crm-container table.dataTable thead th.sorting_asc::before,
+.crm-container table.dataTable thead th.sorting_desc::before,
+.jstree-default .jstree-icon {
+  margin-right: 0.5rem;
+}
+.crm-container a.sorting_asc::after,
+.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon.fa-sort-asc::before,
+.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon.fa-sort-asc::before,
+.crm-container table.dataTable thead th.sorting_asc::before {
+  content: var(--crm-icon-sort-asc);
+  color: var(--crm-table-sort-active-col);
+}
+.crm-container a.sorting_desc::after,
+.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon.fa-sort-desc::before,
+.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon.fa-sort-desc::before,
+.crm-container table.dataTable thead th.sorting_desc::before {
+  content: var(--crm-icon-sort-desc);
+  color: var(--crm-table-sort-active-col);
+}
+
+/* Trash icons */
+.crm-container .delete-icon {
+  background-image: none;
+}
+.crm-container .delete-icon::before,
+.crm-container .crm-i.fa-trash::before {
+  content: "\f1f8";
+  color: var(--crm-icon-alert-color);
+}
+.crm-container .delete-icon:hover::before,
+.crm-container .delete-icon:focus::before {
+  color: var(--crm-icon-alert-color);
+}
+
+/* Jqueery UI icons (tags) */
+.crm-container .jstree-wholerow-ul {
+  display: flex;
+  flex-direction: column;
+  gap: var(--crm-xs);
+}
+.jstree-default > .jstree-wholerow-ul > li.jstree-node {
+  margin-inline: 0;
+}
+.jstree-default .jstree-wholerow-clicked,
+.jstree-default .jstree-wholerow-hovered {
+  background: transparent !important;
+}
+.crm-container .jstree-default .jstree-icon {
+  background-image: inherit;
+  font-size: var(--crm-r1);
+  margin-right: var(--btn-icon-spacing);
+}
+.crm-container .jstree-default .jstree-checkbox::before {
+  content: '\f096';
+}
+.crm-container .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox::before,
+.crm-container .jstree-default .jstree-checked > .jstree-checkbox::before {
+  content: '\f046';
+  color: var(--crm-c-success);
+}
+.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl::before,
+.jstree .jstree-closed > .jstree-ocl::before {
+  display: block;
+  content: '\f105';
+  color: var(--crm-c-text);
+}
+.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl::before,
+.jstree .jstree-open > .jstree-ocl::before {
+  display: block;
+  content: '\f107';
+  color: var(--crm-c-text);
+}
+.crm-container .jstree-default .jstree-search {
+  color: var(--crm-c-alert);
+  font-weight: normal;
+}
+.crm-container #navigation-tree li.jstree-node {
+  background-image: none;
+}
+
+/* Resets icons with unwanted backgrounds */
+.crm-container a.crm-hover-button:has(span.icon) {
+  background-color: transparent;
+  padding: 0;
+}
+
+/* Spinners */
+.crm-container button i.crm-i.fa-spinner,
+.crm-container #bootstrap-theme .btn i.crm-i.fa-spinner {
+  padding: 0;
+  background: transparent;
+  border: 0;
+}
+
+/* Ban icon - lower opacity as it's double layered */
+
+.crm-i.fa-ban.fa-stack-2x {
+  opacity: 0.5;
+}
+
+/* Icon picker - vs crm-iconPicker.css */
+#crmIconPicker .icon-ctrls {
+  display: flex;
+}
+#crmIconPicker .icon-ctrls > button {
+  float: none;
+  margin-left: auto;
+  display: flex;
+}
+#crmIconPicker a.ui-button .ui-icon {
+  margin-top: 0;
+  font-size: var(--crm-r2);
+}
+#crmIconPicker .icons {
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--crm-m2);
+  margin-top: 1rem;
+}
+#crmIconPicker a.ui-button {
+  color: var(--crm-c-text) !important;
+  background: transparent;
+  width: var(--crm-r2);
+  height: var(--crm-r2);
+  border: 0;
+  padding: 0;
+  display: inline-block;
+}
+/* Credit Card Icons */
+
+.crm-credit_card_type-icons {
+  display: flex;
+  gap: var(--crm-flex-gap);
+}
+.crm-credit_card_type-icons a::before {
+  font-family: "Font Awesome 6 Free", "FontAwesome";
+  font-style: normal;
+  text-rendering: auto;
+  font-size: var(--crm-dash-icon-size);
+  display: inline-block;
+  content: '\f09d';
+  font-size: 2.5rem;
+  line-height: 1;
+}
+.crm-credit_card_type-icons a span {
+  display: none;
+}
+.crm-credit_card_type-icons a.crm-credit_card_type-icon-visa::before {
+  content: '\f1f0';
+}
+.crm-credit_card_type-icons a.crm-credit_card_type-icon-mastercard::before {
+  content: '\f1f1';
+}
+.crm-credit_card_type-icons a.crm-credit_card_type-icon-amex::before {
+  content: '\f1f3';
+}
+.crm-credit_card_type-icons a.crm-credit_card_type-icon-discover::before {
+  content: '\f1f2';
+}
+.crm-credit_card_type-icons a.crm-credit_card_type-icon-jcb::before {
+  content: '\f24b';
+}
+.crm-credit_card_type-icons a.crm-credit_card_type-icon-unionpay::before {
+  content: '\f09d'; /* uses generic, see https://github.com/FortAwesome/Font-Awesome/issues/4561 */
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_nav.css b/civicrm/ext/riverlea/core/css/components/_nav.css
new file mode 100644
index 0000000000000000000000000000000000000000..d6bd5eca9107971363f85fec4f88d221f3405537
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_nav.css
@@ -0,0 +1,62 @@
+/* Bootstrap Nav */
+
+.crm-container .nav {
+  padding-left: 0;
+  margin: 0;
+  list-style: none;
+  display: flex;
+  flex-wrap: wrap;
+  cursor: var(--crm-hover-clickable);
+}
+.crm-container .nav > li {
+  position: relative;
+  display: block;
+}
+.crm-container .nav > li > a {
+  padding: var(--crm-m) var(--crm-r);
+}
+.crm-container .nav > li > a:hover,
+.crm-container .nav > li > a:focus {
+  text-decoration: none;
+  background-color: var(--crm-c-background2);
+}
+.crm-container .nav > li.disabled > a {
+  color: var(--crm-c-inactive);
+}
+.crm-container .nav > li.disabled > a:hover,
+.crm-container .nav > li.disabled > a:focus {
+  color: var(--crm-c-inactive);
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+}
+.crm-container .nav .open > a,
+.crm-container .nav .open > a:hover,
+.crm-container .nav .open > a:focus {
+  background-color: var(--crm-c-background2);
+  border-color: var(--crm-c-link);
+}
+.crm-container .nav .nav-divider {
+  height: 1px;
+  margin: var(--crm-m) 0;
+  overflow: hidden;
+  background-color: var(--crm-c-divider);
+}
+.crm-container .nav > li > a > img {
+  max-width: none;
+}
+.crm-container .nav.nav-stacked {
+  flex-direction: column;
+}
+#civicrm-menu-nav .crm-logo-sm {
+  background: url('data:image/svg+xml,<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 792 612" style="enable-background:new 0 0 792 612;" xml:space="preserve"><style type="text/css">.st0{fill:%23086287;}.st1{fill:%2381C459;}</style><g><g><path class="st0" d="M342.05,470.43C342.05,470.43,342.05,470.43,342.05,470.43c-20.72-0.4-28.62-24.34-29.45-27.07l-70.69-231.67c-4.16-13.61-3.21-24.56,2.83-32.55c3.9-5.16,11.67-11.25,26.56-10.96c5.45,0.1,9.72,1.07,10.19,1.17l235.37,54.83c15.13,3.52,24.43,10.66,27.64,21.21c5.09,16.72-9.08,32.57-10.72,34.32L369.09,456.41C360.25,465.89,351.15,470.61,342.05,470.43z M270.14,192.48c-4.21-0.08-5.58,1.07-5.84,1.44c-1.19,1.68-1.45,2.43,1.05,10.62l70.69,231.66c1.58,4.95,4.2,9.55,6.48,9.72l0,0c0.03,0,2.84-0.02,8.64-6.23l164.69-176.68c3.04-3.34,5.84-8.78,5.2-10.46c-0.46-1.19-2.35-2.75-9.76-4.48l-235.37-54.84l0,0C275.92,193.23,272.97,192.54,270.14,192.48z"/></g><g><path class="st1" d="M315.61,451.6c-7.61,2.82-15.56,3.37-21.8,1.34c0,0,0,0,0,0c-19.66-6.41-20.24-31.58-20.24-34.42l0.02-225.56l23.16,5.19L296.84,419c0.06,5.18,1.4,10.13,4.56,10.68l0,0c0.02,0.01,1.64,0.52,6.35-1.63L315.61,451.6z M329.71,415.68l190.44-110.19c3.87-2.3,8.39-5.74,8.01-8.48c-0.06-0.41-0.96-2.89-5.08-5.75l15.97-18.15c9.02,6.88,13.59,14.89,13.59,23.91c0,17.44-18.16,28.45-20.23,29.65L337.06,438.9L329.71,415.68z M500.93,278.76L313.77,169.87c0,0-4.67-2.98-7.36-3.86c-4-1.3-5.96,0.02-6.33,0.27c-1.12,0.75-1.48,1.34-1.95,6.84l-24.11-4.49c1.31-10.03,5.23-17.46,11.68-22.15c5.22-3.79,14.42-7.34,28.55-2.73c5.17,1.69,8.97,3.85,9.38,4.09l194.69,112.31L500.93,278.76z"/></g></g></svg>');
+  background-repeat: no-repeat;
+  background-size: cover;
+  width: 2.25rem;
+  height: 2.25rem;
+  margin: 0;
+  background-position: center center;
+}
+.crm-container .nav.nav-pills {
+  gap: var(--crm-flex-gap);
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_page.css b/civicrm/ext/riverlea/core/css/components/_page.css
new file mode 100644
index 0000000000000000000000000000000000000000..9531da0ac862ef5a90119b37930452ed37a2c65e
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_page.css
@@ -0,0 +1,216 @@
+/* For page edges, borders and structures */
+
+/* Page backgrounds - default */
+
+.crm-container .crm-form-block { /* darkened page bg style */
+  box-shadow: var(--crm-form-block-box-shadow);
+  background-color: var(--crm-form-block-background);
+  border-radius: var(--crm-form-block-border-radius);
+  padding: var(--crm-form-block-padding);
+  margin: 0;
+}
+.crm-container .ui-tabs-panel .crm-form-block {
+  box-shadow: none;
+}
+/* Page backgrounds - potential for no padding */
+.crm-container .crm-group-search-form-block,
+.CRM_Contact_Form_Search_Advanced .crm-form-block,
+.CRM_Contact_Form_Search_Basic .crm-form-block,
+.CRM_Case_Form_Search .crm-form-block,
+.CRM_Contribute_Form_Search .crm-form-block,
+.CRM_Member_Form_Search .crm-form-block,
+.CRM_Event_Form_Search .crm-form-block,
+.CRM_Pledge_Form_Search .crm-form-block,
+.CRM_Activity_Form_Search .crm-form-block,
+.crm-container .crm-report-instanceList-form-block,
+.CRM_Financial_Form_Search .crm-form-block,
+.CRM_Event_Form_SearchEvent .crm-form-block {
+  padding: var(--crm-padding-inset);
+  /* box-shadow: none; */
+}
+/* Page backgrounds - potential for outset accordions */
+.crm-container .crm-contribution-contributionpage-premium-form-block details,
+.crm-container .crm-contribution-contributionpage-widget-form-block details,
+.crm-container .crm-activity-form-block details,
+.crm-container .crm-contactEmail-form-block details,
+.crm-container .crm-contribution-form-block details,
+.crm-container .crm-pledge-form-block details,
+.crm-container .crm-payment-form-block details,
+.crm-container .crm-import-preview-form-block details,
+.crm-container .crm-event-manage-eventinfo-form-block details,
+.crm-container .crm-wizard-step,
+.crm-container .CRM_Admin_Form_MessageTemplates details,
+.crm-container .crm-case-caseview-form-block details,
+.crm-container .crm-case-activity-form-block details {
+  margin: var(--crm-padding-inset) calc((-1 * var(--crm-form-block-padding)) + var(--crm-padding-inset));
+}
+/* Page backgrounds - reset of elements cought up in outset accordions (!) */
+.crm-container .crm-payment-form-block details #payment_information {
+  margin: 0 var(--crm-form-block-padding);
+}
+/* Reset elements for potential no padding */
+.crm-group-search-form-block .crm-datatable-pager-top,
+.crm-group-search-form-block .crm-datatable-pager-bottom {
+  margin-inline: var(--crm-form-block-padding);
+}
+.crm-contribution-contributionpage-premium-form-block .messages {
+  margin: calc(var(--crm-form-block-padding) - var(--crm-padding-inset));
+}
+.crm-contact-block > .help,
+.CRM_Mailing_Form_Search .messages {
+  margin: var(--crm-padding-reg) 0;
+}
+#crm-main-content-wrapper .newGroup {
+  margin: var(--crm-form-block-padding) calc(var(--crm-form-block-padding) - var(--crm-padding-inset)) 0;
+}
+
+/* Pagination */
+
+.crm-datatable-pager-top,
+.crm-datatable-pager-bottom {
+  display: flex;
+  justify-content: space-between;
+  font-size: var(--crm-m3);
+  margin-inline: var(--crm-m);
+}
+.crm-datatable-pager-top {
+  margin-block: var(--crm-r);
+}
+.crm-datatable-pager-bottom {
+  margin-top: var(--crm-r);
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current {
+  background: var(--crm-c-secondary);
+  color: var(--crm-c-secondary-text) !important;
+  border: 0 solid transparent;
+  padding: var(--crm-s);
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+  background: var(--crm-c-secondary-hover);
+}
+
+/* Pagination quickforms */
+
+.crm-pager {
+  display: flex;
+  flex-direction: row-reverse;
+  align-items: center;
+  margin-block: 1rem;
+}
+.crm-pager .crm-pager-nav {
+  margin: 0 auto;
+}
+.crm-container .crm-pager-nav a.crm-hover-button {
+  background: var(--crm-c-secondary);
+  color: var(--crm-c-secondary-text);
+  padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline);
+}
+.crm-container .crm-pager-nav a.crm-hover-button:hover,
+.crm-container .crm-pager-nav a.crm-hover-button:focus {
+  background: var(--crm-c-secondary-hover);
+}
+.crm-search-results .form-item.float-right {
+  margin-bottom: 1rem;
+}
+
+/*  Pagination - from BS3 */
+
+.crm-container .pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: var(--crm-padding-reg) 0;
+  border-radius: var(--crm-roundness);
+}
+.crm-container .pagination > li {
+  display: inline;
+}
+.crm-container .pagination > li > a,
+.crm-container .pagination > li > span {
+  position: relative;
+  float: left;
+  padding: var(--crm-s) var(--crm-m);
+  margin-left: -1px;
+  line-height: 1.4;
+  color: var(--crm-c-link);
+  text-decoration: none;
+  background-color: var(--crm-c-page-background);
+  border: var(--crm-c-divider);
+}
+.crm-container .pagination > li > a:hover,
+.crm-container .pagination > li > a:focus,
+.crm-container .pagination > li > span:hover,
+.crm-container .pagination > li > span:focus {
+  z-index: 2;
+  color: var(--crm-c-link-hover);
+  background-color: var(--crm-c-background);
+  border-color: var(--crm-c-background4);
+}
+.crm-container .pagination > li:first-child > a,
+.crm-container .pagination > li:first-child > span {
+  margin-left: 0;
+  border-top-left-radius: var(--crm-roundness);
+  border-bottom-left-radius: var(--crm-roundness);
+}
+.crm-container .pagination > li:last-child > a,
+.crm-container .pagination > li:last-child > span {
+  border-top-right-radius: var(--crm-roundness);
+  border-bottom-right-radius: var(--crm-roundness);
+}
+.crm-container .pagination > .active > a,
+.crm-container .pagination > .active > a:hover,
+.crm-container .pagination > .active > a:focus,
+.crm-container .pagination > .active > span,
+.crm-container .pagination > .active > span:hover,
+.crm-container .pagination > .active > span:focus {
+  z-index: 3;
+  color: var(--crm-c-primary-text);
+  cursor: default;
+  background-color: var(--crm-c-primary);
+  border: var(--crm-c-divider);
+}
+.crm-container .pagination > .disabled > span,
+.crm-container .pagination > .disabled > span:hover,
+.crm-container .pagination > .disabled > span:focus,
+.crm-container .pagination > .disabled > a,
+.crm-container .pagination > .disabled > a:hover,
+.crm-container .pagination > .disabled > a:focus {
+  color: var(--crm-c-inactive);
+  cursor: not-allowed;
+  background-color: transparent;
+  border: var(--crm-c-divider);
+}
+.crm-container .pagination-lg > li > a,
+.crm-container .pagination-lg > li > span {
+  padding: var(--crm-m2) var(--crm-r);
+  font-size: var(--crm-r1);
+  line-height: 1.3;
+}
+.crm-container .pagination-lg > li:first-child > a,
+.crm-container .pagination-lg > li:first-child > span {
+  border-top-left-radius: calc(1.5 * var(--crm-roundness));
+  border-bottom-left-radius: calc(1.5 * var(--crm-roundness));
+}
+.crm-container .pagination-lg > li:last-child > a,
+.crm-container .pagination-lg > li:last-child > span {
+  border-top-right-radius: calc(1.5 * var(--crm-roundness));
+  border-bottom-right-radius: calc(1.5 * var(--crm-roundness));
+}
+.crm-container .pagination-sm > li > a,
+.crm-container .pagination-sm > li > span {
+  padding: var(--crm-padding-small);
+  font-size: var(--crm-font-size-small);
+  line-height: 1.5;
+}
+.crm-container .pagination-sm > li:first-child > a,
+.crm-container .pagination-sm > li:first-child > span {
+  border-top-left-radius: calc(0.75 * var(--crm-roundness));
+  border-bottom-left-radius: calc(0.75 * var(--crm-roundness));
+}
+.crm-container .pagination-sm > li:last-child > a,
+.crm-container .pagination-sm > li:last-child > span {
+  border-top-right-radius: calc(0.75 * var(--crm-roundness));
+  border-bottom-right-radius: calc(0.75 * var(--crm-roundness));
+}
+.crm-search-display-pager {
+  padding-inline: var(--crm-padding-reg);
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_tables.css b/civicrm/ext/riverlea/core/css/components/_tables.css
new file mode 100644
index 0000000000000000000000000000000000000000..5f0cca8d310a2163c8c593ba7e2170153a30638b
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_tables.css
@@ -0,0 +1,508 @@
+.crm-container table:not(.crm-inline-edit-form,
+.crm-table-group-summary) {
+  border: var(--crm-table-outside-border);
+  background: var(--crm-table-background);
+  box-shadow: var(--crm-block-shadow);
+  margin: 0 0 var(--crm-r);
+  border-collapse: collapse;
+  width: 100%;
+  max-width: 100%;
+}
+.crm-container table thead {
+  background-color: var(--crm-table-header-bg);
+}
+.crm-container th,
+.crm-container table thead.sticky th,
+.crm-container table.dataTable thead th,
+.crm-container tr.columnheader td {
+  background-color: var(--crm-table-header-bg);
+  border-bottom: var(--crm-table-header-bottom);
+  color: var(--crm-table-header-col);
+  font-family: var(--crm-font-bold);
+  font-weight: bold;
+  padding: var(--crm-table-padding);
+  text-align: left;
+}
+.crm-container table:not(thead) tr {
+  border-bottom: var(--crm-table-row-border);
+  background-color: transparent;
+}
+.crm-container .odd-row,
+.crm-container .odd,
+tbody.scrollContent,
+.crm-container table.dataTable.stripe tbody tr.odd,
+.crm-container table.dataTable.display tbody tr.odd {
+  background-color: var(--crm-table-odd-row);
+}
+.crm-container table.dataTable.hover tbody tr.odd:hover,
+.crm-container table.dataTable.display tbody tr.odd:hover,
+.crm-container table.row-highlight tr:hover,
+.crm-container .crm-row-selected,
+.crm-container .odd-row:hover,
+.crm-container .odd:hover {
+  background-color: var(--crm-table-odd-hover);
+}
+table.dataTable.display tbody tr.odd > .sorting_1,
+table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.05),rgba(0, 0, 0, 0.05)) var(--crm-table-odd-row);
+}
+.crm-container .even-row,
+.crm-container .even,
+tbody.scrollContent tr.alternateRow {
+  background-color: var(--crm-table-even-row);
+}
+.crm-container table.dataTable.hover tbody tr.even:hover,
+.crm-container table.dataTable.display tbody tr.even:hover,
+.crm-container table.row-highlight tr.even-row:hover,
+.crm-container table.row-highlight tr.even:hover,
+.crm-container .even-row.crm-row-selected,
+.crm-container .even.crm-row-selected ,
+.crm-container .even-row:hover,
+.crm-container .even:hover,
+tbody.scrollContent tr.alternateRow:hover {
+  background-color: var(--crm-table-even-hover);
+}
+table.dataTable.display tbody tr.even > .sorting_1,
+table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.05),rgba(0, 0, 0, 0.05)) var(--crm-table-even-row);
+}
+.crm-container .extension-installed {
+  background: var(--crm-c-green-light);
+  color: var(--crm-alert-text-help);
+}
+.crm-container .extension-installed summary {
+  color: var(--crm-alert-text-help);
+}
+table.dataTable.display tbody tr.extension-installed.odd {
+  background: linear-gradient(to top,rgba(256,256,256,0.25),rgba(256,256,256,0.25)) var(--crm-c-green-light);
+}
+table.dataTable.display tbody tr.extension-installed.odd:hover {
+  background-color: var(--crm-table-odd-hover);
+}
+table.dataTable.display tbody tr.extension-installed.odd > .sorting_1,
+table.dataTable.order-column.stripe tbody tr.extension-installed.odd > .sorting_1 {
+  background: var(--crm-c-green-light) !important;
+}
+table.dataTable.display tbody tr.extension-installed.even > .sorting_1,
+table.dataTable.order-column.stripe tbody tr.extension-installed.even > .sorting_1 {
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.05),rgba(0, 0, 0, 0.05)) var(--crm-c-green-light);
+}
+.crm-container td,
+.crm-container table.dataTable thead td {
+  padding: var(--crm-table-padding);
+}
+.crm-container table.selector td {
+  border-right: var(--crm-table-column-border);
+}
+.crm-container table td:has(.btn-slide),
+.crm-container table td:not(.crm-case-date):has(.action-item) {
+  text-align: right;
+}
+.crm-container table.crm-mailing-ab-table td:has(.action-item) {
+  text-align: unset;
+}
+.crm-container table.form-layout td:has(details) {
+  padding: 0;
+}
+.crm-form-block .form-item table,
+.crm-form-block .form-item table tr,
+.crm-container .crm-form-block:not( .crm-report-field-form-block,
+.crm-group-search-form-block,
+#map-field,
+#payLaterOptions,
+.crm-membership-form-block,
+.crm-contribution-form-block,
+.crm-case-caseview-form-block,
+.crm-case-activity-form-block) table:not(#preview-counts),
+.crm-container .crm-form-block:not( .crm-report-field-form-block,
+.crm-group-search-form-block,
+.crm-membership-form-block,
+.crm-contribution-form-block,
+.crm-case-caseview-form-block,
+.crm-case-activity-form-block) table:not(#preview-counts) tr,
+.crm-container .crm-accordion-body table.form-layout-compressed,
+.crm-container .crm-search-form-block table.form-layout-compressed,
+.crm-container .crm-case-activity-form-block > table,
+.crm-container table.no-border,
+.crm-container table.no-border tr,
+.crm-container table#crm-activity-view-table,
+.crm-container .crm-report-form-block table.form-layout-compressed {
+  box-shadow: none;
+  border: 0 solid transparent;
+  background: transparent;
+}
+.crm-container .crm-form-block.crm-report-field-form-block table,
+.crm-container .CRM_Contribute_Form_ContributionCharts #chartData table,
+.crm-container .crm-case-caseview-form-block table {
+  box-shadow: none;
+}
+/*.crm-container .dataTables_wrapper,
+.crm-container .form-item:has(> table),
+.crm-container div:has(> table) {  simple fix-all for making many tables scroll when needed
+  overflow-x: auto;
+  max-width: 100%;
+}*/
+/* needed to reset the scroll in Thames but causes other problem - #91)
+.crm-container div:has(td span > .panel),
+.crm-container div:has(td > div > .dropdown-menu) {
+  overflow: initial;
+}*/
+.crm-selection-reset {
+  padding: var(--crm-m) 0;
+  margin-bottom: var(--crm-m);
+  display: block;
+}
+
+/* Data Tables */
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: var(--crm-c-text);
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+  color: var(--crm-c-text) !important; /* vs jqueery.dataTables.css */
+}
+
+/* Nested table */
+.crm-container .crm-child-row tr:first-child {
+  border: 1px solid var(--crm-c-page-background);
+}
+.crm-container .crm-child-row {
+  border-top: 1px solid var(--crm-c-gray-400);
+  border-bottom: 1px solid var(--crm-c-gray-025);
+}
+.crm-container .crm-child-row table {
+  box-shadow: none;
+  border: var(--crm-table-nested-border);
+}
+.crm-container .crm-child-row th {
+  opacity: 0.7;
+}
+.crm-container .crm-child-row > td:has(table) {
+  padding: var(--crm-table-nested-padding);
+}
+.crm-container tr.crm-child-row:hover {
+  background-color: transparent;
+}
+.crm-container tr.crm-child-row > td {
+  box-shadow: inset 0 10px 8px -10px rgba(0,0,0,.3), inset 0 -11px 8px -9px rgba(0,0,0,.15);
+  background: var(--crm-table-inset-bg);
+}
+
+/* Nested, inset table - groups page */
+tbody .crm-row-child {
+  border-top: 1px solid var(--crm-c-gray-400);
+}
+tbody .crm-row-child ~ .crm-row-child {
+  border-top: 0;
+}
+tbody .crm-row-child:not(:has(~ .crm-row-child)) {
+  border-bottom: 1px solid var(--crm-c-gray-025);
+}
+tbody .crm-row-child td {
+  box-shadow: inset 0 10px 8px -10px rgba(0,0,0,.15);
+  background: var(--crm-table-inset-bg);
+}
+tbody .crm-row-child:hover td {
+  background: var(--crm-table-odd-hover);
+  cursor: var(--crm-hover-clickable);
+}
+tbody .crm-row-child ~ .crm-row-child td {
+  box-shadow: none;
+}
+tbody .crm-row-child:not(:has(~ .crm-row-child)) td {
+  box-shadow: inset 0 -11px 8px -9px rgba(0,0,0,.15);
+}
+
+/* Compressed table */
+.crm-container table.form-layout-compressed {
+  width: var(--crm-table-compressed-width);
+  border: var(--crm-table-outside-border);
+  background: var(--crm-table-background);
+  box-shadow: var(--crm-block-shadow);
+  margin: var(--crm-m) 0 var(--crm-l);
+}
+.crm-container table.form-layout-compressed th {
+  background: transparent;
+  border: none;
+  padding: var(--crm-table-padding);
+}
+.crm-container .crm-form-block > .form-layout-compressed {
+  /* handles double box/border issue when table is in a form block,
+    e.g. civicrm/member/add?reset=1&action=add&context=standalone */
+  box-shadow: none;
+  border: 0 solid transparent;
+  background: transparent;
+}
+
+/* Advance search compressed table */
+#search-status table.form-layout-compressed {
+  border: 0;
+  background: var(--crm-c-background);
+  width: 100%;
+  border: 0;
+  padding: var(--crm-padding-reg);
+  border-radius: var(--crm-roundness);
+  margin: 0;
+}
+#search-status table.form-layout-compressed tr {
+  border: 0;
+}
+#search-status table.form-layout-compressed td {
+  padding-inline: var(--crm-padding-reg);
+}
+#search-status table.form-layout-compressed tr:first-of-type td,
+#search-status table.form-layout-compressed tr:last-of-type td {
+  padding-block: var(--crm-padding-reg);
+}
+
+/* Report table */
+.crm-container table.report {
+  width: auto;
+}
+.crm-container table.report td {
+  border: var(--crm-table-row-border);
+  background-color: var(--crm-table-even-row);
+}
+.crm-container tr.columnheader-dark th {
+  background-color: var(--crm-c-gray-700);
+  color: var(--crm-c-light-text);
+  border: 1px solid var(--crm-c-gray-800);
+}
+
+/* Batch entry table */
+.crm-container .crm-grid-table {
+  display: table;
+  border-collapse: collapse;
+  border: var(--crm-table-outside-border);
+  background-color: var(--crm-table-background);
+}
+.crm-container .crm-grid-row,
+.crm-container .crm-grid-header {
+  display: table-row;
+}
+.crm-container .crm-grid-header {
+  white-space: nowrap;
+}
+.crm-container .crm-grid-cell {
+  display: table-cell;
+  border-right: 1px solid var(--crm-table-column-border);
+  padding: var(--crm-table-padding);
+  vertical-align: top;
+}
+
+/* Fees tables (contribs/events) */
+.crm-container table#map-field-table {
+  width: auto;
+  border: var(--crm-table-outside-border);
+  margin-top: var(--crm-padding-reg);
+}
+
+/* Pay later table (nested inside another table) */
+
+.crm-container table#payLater table#payLaterOptions.form-layout {
+  border: 1px solid #dedede;
+  background: var(--crm-c-page-background);
+}
+
+/* Table bg colours */
+
+.crm-container .table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: var(--crm-r1);
+}
+.crm-container .table > thead > tr > th,
+.crm-container .table > thead > tr > td,
+.crm-container .table > tbody > tr > th,
+.crm-container .table > tbody > tr > td,
+.crm-container .table > tfoot > tr > th,
+.crm-container .table > tfoot > tr > td {
+  padding: var(--crm-table-padding);
+}
+.crm-container .crm-search-display-table > table.table > thead > tr > th.crm-search-result-select {
+  padding-inline: 0.5em;
+}
+.crm-container .table > tbody + tbody {
+  border-top: var(--crm-table-header-bottom);
+}
+.crm-container .table-condensed > thead > tr > th,
+.crm-container .table-condensed > thead > tr > td,
+.crm-container .table-condensed > tbody > tr > th,
+.crm-container .table-condensed > tbody > tr > td,
+.crm-container .table-condensed > tfoot > tr > th,
+.crm-container .table-condensed > tfoot > tr > td {
+  padding: var(--crm-s1);
+}
+.crm-container .table-bordered {
+  border: var(--crm-table-outside-border);
+}
+.crm-container .table-bordered > thead > tr > th,
+.crm-container .table-bordered > thead > tr > td,
+.crm-container .table-bordered > tbody > tr > th,
+.crm-container .table-bordered > tbody > tr > td,
+.crm-container .table-bordered > tfoot > tr > th,
+.crm-container .table-bordered > tfoot > tr > td {
+  border: var(--crm-table-outside-border);
+}
+.crm-container .table-bordered > thead > tr > th,
+.crm-container .table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.crm-container .table-striped > tbody > tr {
+  background-color: var(--crm-table-even-row);
+}
+.crm-container .table-striped > tbody > tr:nth-of-type(2n+1) {
+  background-color: var(--crm-table-odd-row);
+}
+.crm-container .table-striped > tbody > tr:hover {
+  background-color: var(--crm-table-even-hover);
+}
+.crm-container .table-striped > tbody > tr:nth-of-type(2n+1):hover {
+  background-color: var(--crm-table-odd-hover);
+}
+.crm-container .table > thead > tr > td.active,
+.crm-container .table > thead > tr > th.active,
+.crm-container .table > thead > tr.active > td,
+.crm-container .table > thead > tr.active > th,
+.crm-container .table > tbody > tr > td.active,
+.crm-container .table > tbody > tr > th.active,
+.crm-container .table > tbody > tr.active > td,
+.crm-container .table > tbody > tr.active > th,
+.crm-container .table > tfoot > tr > td.active,
+.crm-container .table > tfoot > tr > th.active,
+.crm-container .table > tfoot > tr.active > td,
+.crm-container .table > tfoot > tr.active > th {
+  background-color: var(--crm-table-odd-row);
+}
+.crm-container .table-hover > tbody > tr > td.active:hover,
+.crm-container .table-hover > tbody > tr > th.active:hover,
+.crm-container .table-hover > tbody > tr.active:hover > td,
+.crm-container .table-hover > tbody > tr:hover > .active,
+.crm-container .table-hover > tbody > tr.active:hover > th {
+  background-color: var(--crm-table-odd-hover);
+}
+.crm-container .table td.success,
+.crm-container .table th.success,
+.crm-container .table tr.success > td,
+.crm-container .table tr.success > th,
+.crm-container table tr.crm-row-ok,
+.crm-container table tr.crm-row-ok > td {
+  background-color: var(--crm-alert-background-help);
+}
+.crm-container .table-hover > tbody > tr > td.success:hover,
+.crm-container .table-hover > tbody > tr > th.success:hover,
+.crm-container .table-hover > tbody > tr.success:hover > td,
+.crm-container .table-hover > tbody > tr:hover > .success,
+.crm-container .table-hover > tbody > tr.success:hover > th,
+.crm-container table tr.crm-row-ok:hover > td,
+.crm-container table tr.crm-row-ok > td:hover {
+  background-color: var(--crm-alert-border-help);
+}
+.crm-container .table td.warning,
+.crm-container .table th.warning,
+.crm-container .table tr.warning > td,
+.crm-container .table tr.warning > th {
+  background-color: var(--crm-alert-background-warning);
+}
+.crm-container .table-hover > tbody > tr > td.warning:hover,
+.crm-container .table-hover > tbody > tr > th.warning:hover,
+.crm-container .table-hover > tbody > tr.warning:hover > td,
+.crm-container .table-hover > tbody > tr:hover > .warning,
+.crm-container .table-hover > tbody > tr.warning:hover > th {
+  background-color: var(--crm-alert-border-warning);
+}
+.crm-container .table td.danger,
+.crm-container .table th.danger,
+.crm-container .table tr.danger > td,
+.crm-container .table tr.danger > th,
+.crm-container table tr.crm-row-error,
+.crm-container table tr.crm-row-error > td {
+  background-color: var(--crm-alert-background-danger);
+}
+.crm-container .table-hover > tbody > tr > td.danger:hover,
+.crm-container .table-hover > tbody > tr > th.danger:hover,
+.crm-container .table-hover > tbody > tr.danger:hover > td,
+.crm-container .table-hover > tbody > tr:hover > .danger,
+.crm-container .table-hover > tbody > tr.danger:hover > th,
+.crm-container table tr.crm-row-error:hover > td,
+.crm-container table tr.crm-row-error > td:hover {
+  background-color: var(--crm-alert-border-danger);
+}
+.crm-container .table td.info,
+.crm-container .table th.info,
+.crm-container .table tr.info > td,
+.crm-container .table tr.info > th,
+.crm-container table tr.crm-row-selected,
+.crm-container table tr.crm-row-selected > td {
+  background-color: var(--crm-alert-background-info);
+}
+.crm-container .table-hover > tbody > tr > td.info:hover,
+.crm-container .table-hover > tbody > tr > th.info:hover,
+.crm-container .table-hover > tbody > tr.info:hover > td,
+.crm-container .table-hover > tbody > tr:hover > .info,
+.crm-container .table-hover > tbody > tr.info:hover > th,
+.crm-container table tr.crm-row-selected:hover > td,
+.crm-container table tr.crm-row-selected > td:hover {
+  background-color: var(--crm-alert-border-info);
+}
+.crm-container .table-responsive {
+  min-height: .01%;
+  overflow-x: auto;
+}
+
+/* Responsive table */
+
+@media screen and (max-width: 767px) {
+  .crm-container .table-responsive,
+  .crm-container table {
+    width: 100%;
+    margin-bottom: var(--crm-r);
+    overflow-y: hidden;
+    border: var(--crm-table-outside-border);
+    display: contents; /* expirmental addition to provide more responsive behaviour */
+  }
+  .crm-container .table-responsive > .table {
+    margin-bottom: 0;
+  }
+  .crm-container .table-responsive > .table > thead > tr > th,
+  .crm-container .table-responsive > .table > thead > tr > td,
+  .crm-container .table-responsive > .table > tbody > tr > th,
+  .crm-container .table-responsive > .table > tbody > tr > td,
+  .crm-container .table-responsive > .table > tfoot > tr > th,
+  .crm-container .table-responsive > .table > tfoot > tr > td,
+  .crm-container th,
+  .crm-container td {
+    white-space: nowrap;
+  }
+  .crm-container .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .crm-container .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .crm-container .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .crm-container .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .crm-container .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .crm-container .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .crm-container .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+
+  .crm-container .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .crm-container .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .crm-container .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .crm-container .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .crm-container .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .crm-container .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .crm-container .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .crm-container .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .crm-container .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .crm-container .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/components/_tabs.css b/civicrm/ext/riverlea/core/css/components/_tabs.css
new file mode 100644
index 0000000000000000000000000000000000000000..287c1ecbf8028ed94d5a6fa38d80f6fd6b560b98
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/components/_tabs.css
@@ -0,0 +1,179 @@
+/* JQuery UI tabs */
+
+.crm-container .ui-tabs,
+.crm-container .crm-search-nav-tabs,
+.crm-container .afadmin-list .nav.nav-tabs { /* entire tab region */
+  border: var(--crm-tabs-border);
+  border-radius: var(--crm-tabs-radius);
+  margin-bottom: var(--crm-r1);
+}
+.crm-container .ui-widget-header,
+.crm-container .ui-tabs .ui-tabs-nav,
+.crm-container .nav.nav-tabs { /* tab header */
+  font-family: var(--crm-font);
+  background: var(--crm-tabs-bg);
+  border: 0 solid transparent;
+  border-radius: var(--crm-tabs-radius) var(--crm-tabs-radius) 0 0;
+  border-bottom: var(--crm-tabs-border);
+  margin: 0;
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--crm-tabs-gap);
+  padding: var(--crm-tabs-padding);
+  width: 100%;
+}
+.crm-container .ui-tabs .ui-tabs-nav li,
+.crm-container .ui-button,
+.crm-container .ui-button.ui-state-disabled:hover,
+.crm-container .ui-button.ui-state-disabled:active,
+.crm-container .nav-tabs > li { /* individual tab */
+  background: var(--crm-tab-bg);
+  border-radius: var(--crm-tab-roundness);
+  border: 0 solid transparent;
+  font-family: inherit;
+  color: var(--crm-c-text);
+  padding: 0;
+}
+.crm-container .ui-tabs .ui-tabs-nav li:hover,
+.crm-container .ui-tabs .ui-tabs-nav li:focus,
+.crm-container .nav-tabs > li:hover,
+.crm-container .nav-tabs > li:focus { /* individual tab hover */
+  background: var(--crm-tab-bg-hover);
+}
+.crm-container .nav-tabs > li > a:hover,
+.crm-container .nav-tabs > li > a:focus { /* reset from _nav.css */
+  background-color: transparent;
+}
+.crm-container .ui-tabs ul.ui-tabs-nav li.ui-tabs-selected,
+.crm-container .ui-tabs .ui-tabs-nav li.ui-tabs-active,
+.crm-container .nav-tabs > li.active , /* using # to occlude BS */
+.crm-container .nav-tabs > li.active:hover,
+.crm-container .nav-tabs > li.active:focus { /* individual tab active */
+  background: var(--crm-tab-bg-active);
+  border: var(--crm-tab-border-active);
+  border-bottom: 0 solid transparent;
+  margin: var(--crm-tab-hang);
+}
+.crm-container .ui-tabs ul.ui-tabs-nav a:not(.button),
+.crm-container .nav-tabs > li > a,
+.crm-container .panel-heading .nav-tabs > li > a {
+  color: var(--crm-tab-col);
+  padding: var(--crm-tab-padding);
+  font-weight: var(--crm-tab-weight);
+  font-family: var(--crm-tab-font);
+  font-size: var(--crm-font-size);
+  line-height: var(--crm-r1);
+  text-decoration: none;
+  border-radius: var(--crm-tab-roundness);
+  display: block;
+}
+.crm-container .ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
+  background: transparent;
+  color: var(--crm-tab-col);
+  padding: var(--crm-tab-padding);
+}
+.crm-container .ui-tabs ul.ui-tabs-nav a em,
+.crm-container .nav-tabs a .badge {
+  font-family: inherit;
+  font-style: inherit;
+  background: var(--crm-tab-count-bg);
+  color: var(--crm-tab-count-col);
+  border-radius: var(--crm-m2);
+  min-width: var(--crm-r2);
+  display: inline-block;
+  text-align: center;
+  font-size: var(--crm-m2);
+  /* padding: 0;   */
+}
+.crm-container #mainTabContainer ul.ui-tabs-nav a em {
+  background: var(--crm-dash-tab-count-bg);
+  color: var(--crm-dash-tab-count-col);
+}
+.crm-container li.crm-count-0 a.ui-tabs-anchor,
+.crm-container li.crm-count-0 a.ui-tabs-anchor em {
+  color: var(--crm-tab-col);
+}
+.crm-container .ui-tabs ul.ui-tabs-nav .crm-count-0 a em,
+.crm-container #mainTabContainer ul.ui-tabs-nav .crm-count-0 a em {
+  background: var(--crm-c-background5);
+  color: var(--crm-c-light-text);
+}
+.crm-container .ui-tabs ul li em:empty,
+.crm-container .nav-tabs .badge:empty { /* this is to keep the height of tabs with empty badges */
+  min-width: 1px !important;
+  visibility: hidden;
+  width: 0 !important;
+  padding: 0;
+}
+.crm-container .ui-tabs .ui-tabs-panel {
+  background: var(--crm-tab-bg-active);
+  padding: var(--crm-tab-padding);
+  container-type: inline-size;
+}
+
+/* Dashboard */
+
+.crm-contact-page #mainTabContainer.ui-tabs {
+  border: var(--crm-dash-border);
+  display: var(--crm-dash-direction);
+  grid-template-columns: var(--crm-side-tabs-width) auto;
+  flex-direction: column;
+}
+.crm-contact-page #mainTabContainer .crm-contact-tabs-list {
+  background: var(--crm-dash-tabs-bg);
+  flex-direction: var(--crm-dash-tabs-flow);
+  border-radius: var(--crm-dash-tabs-roundness);
+  gap: var(--crm-dash-tabs-gap);
+  padding: var(--crm-dash-tabs-padding);
+  border: 0 solid transparent;
+  z-index: 1;
+}
+#mainTabContainer .crm-contact-tabs-list ~ .ui-tabs-panel {
+  box-shadow: var(--crm-dash-box-shadow);
+}
+.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor:has(.crm-i) {
+  grid-template-columns: min-content auto min-content;
+}
+.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor i {
+  font-size: var(--crm-dash-icon-size);
+}
+#mainTabContainer .crm-contact-tabs-list ~ .ui-tabs-panel {
+  flex-grow: 1;
+  padding: var(--crm-dash-panel-padding);
+  border: var(--crm-dash-panel-border);
+  border-radius: var(--crm-dash-panel-radius);
+}
+.crm-contact-page #mainTabContainer .crm-contact-tabs-list li {
+  background: var(--crm-dash-tab-bg);
+  margin: var(--crm-dash-tab-hang);
+}
+.crm-contact-page #mainTabContainer .crm-contact-tabs-list li .ui-tabs-anchor {
+  display: grid;
+  grid-template-columns: min-content auto;
+  width: var(--crm-dash-tab-width);
+  gap: var(--crm-m);
+  align-items: center;
+  float: var(--crm-dash-tab-align);
+  border-radius: var(--crm-dash-tab-radius);
+  padding: var(--crm-dash-tab-padding);
+  border: var(--crm-dash-tab-border);
+  text-align: var(--crm-dash-tab-align);
+  /* border-width: var(--crm-dash-tab-border-width); */
+}
+.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li.ui-tabs-active a,
+.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li:hover a,
+.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li:focus a {
+  color: var(--crm-c-link);
+  background: var(--crm-dash-tab-bg-hover);
+  border: var(--crm-dash-tab-border-hover);
+  border-width: var(--crm-dash-tab-border-width);
+}
+.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li.ui-tabs-active {
+  border: 0 solid transparent;
+}
+.crm-container .crm-contact-page .ui-tabs-panel {
+  background: var(--crm-dash-panel-bg);
+}
+.crm-container .crm-contact-page .ui-tabs-panel .ui-tabs-panel { /* handles tabs inside a tab panel */
+  background: var(--crm-tab-bg-active);
+}
diff --git a/civicrm/ext/riverlea/core/css/contactSummary.css b/civicrm/ext/riverlea/core/css/contactSummary.css
new file mode 100644
index 0000000000000000000000000000000000000000..97c45c10efa20de211a85ff7aee85ef4841936d0
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/contactSummary.css
@@ -0,0 +1,412 @@
+/* Style rules for Contact Summary.
+   Forked on 12 June 24. Called on contact Summary/Edit/Inline-Edit pages.
+   Status: merged  */
+
+.crm-container .primary .crm-label {
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+}
+
+/* Contact name/header */
+
+.crm-summary-contactname-block {
+  background: var(--crm-dash-header-bg);
+  color: var(--crm-dash-header-col);
+  padding: var(--crm-dash-header-padding);
+  margin-left: var(--crm-dash-heading-inset);
+}
+
+/* Image */
+
+#crm-main-content-wrapper {
+  position: relative;
+}
+#mainTabContainer {
+  position: inherit;
+}
+.crm-inline-edit-container .crm-contact_image {
+  position: absolute;
+  top: var(--crm-dash-image-top);
+  right: var(--crm-dash-image-right);
+  z-index: 1;
+}
+.crm-inline-edit-container .crm-image-popup {
+  width: var(--crm-dash-image-size);
+  height: var(--crm-dash-image-size);
+  display: block;
+  background-size: cover;
+  border-radius: var(--crm-dash-image-radius);
+  box-shadow: var(--crm-bottom-shadow);
+  overflow: hidden;
+  border: var(--crm-dash-image-border);
+}
+.crm-container div.contact_panel {
+  display: block;
+}
+.crm-container table.image_URL-section td {
+  text-align: inherit;
+  display: flex;
+  align-items: start;
+  gap: var(--crm-flex-gap);
+}
+
+/* Inline edit */
+
+.crm-inline-edit.form {
+  cursor: default;
+  border: 1px solid var(--crm-c-focus);
+  border-radius: var(--crm-roundness);
+  background: var(--crm-inline-edit-bg);
+  padding: var(--crm-r);
+  width: fit-content;
+  z-index: 99;
+  position: absolute;
+  left: 0;
+}
+#mainTabContainer:not(.narrowpage) .contactCardRight div.crm-inline-edit.form {
+  right: 0;
+  left: initial;
+  position: absolute;
+}
+.crm-container .crm-inline-edit.add-new {
+  min-height: 2.5em;
+}
+.crm-container div.crm-summary-block .crm-edit-help {
+  display: block;
+  position: absolute;
+  color: transparent;
+  right: 0;
+  top: 0;
+  opacity: .6;
+  padding: var(--crm-padding-small);
+}
+.crm-container .crm-address-block+.crm-address-block .add-new .crm-edit-help {
+  display: block;
+  background-color: transparent;
+}
+.crm-container #crm-contactname-content .crm-edit-help:hover,
+.crm-edit-ready .crm-summary-block .crm-inline-edit:hover .crm-edit-help {
+  color: var(--crm-c-text);
+  display: block;
+  opacity: 1;
+  background-color: var(--crm-dash-summary-row-bg);
+  z-index: 3;
+}
+#contact-summary .crm-edit-help .crm-i.fa-pencil {
+  float: right;
+  color: var(--crm-c-text);
+  margin: var(--crm-xs) 0 0 var(--crm-m);
+}
+.crm-container div.crm-inline-edit.form .crm-edit-help {
+  display: none !important;
+}
+.crm-container .crm-address-block+.crm-address-block .add-new .crm-summary-row {
+  display: none;
+}
+.crm-container span.crm-custom-greeting {
+  font-size: var(--crm-small-font-size);
+}
+.crm-container table.crm-inline-edit-form td,
+.crm-container div.crm-inline-edit-form {
+  background-color: transparent;
+  white-space: nowrap;
+  text-align: left !important /* vs _tables.css:95 */;
+}
+.crm-container table.crm-inline-edit-form td.crm-label,
+.crm-container div.crm-inline-edit-form .crm-label,
+.crm-container div.crm-inline-edit-form .messages {
+  white-space: normal;
+}
+.crm-container div.crm-inline-edit-field {
+  display: inline-block;
+  padding: 4px 5px;
+}
+.crm-inline-edit.form td {
+  background: transparent;
+  padding: var(--crm-m);
+  border-bottom: 0 solid transparent;
+}
+.CRM_Contact_Form_Inline_ContactName div.crm-inline-edit-form {
+  white-space: nowrap;
+  padding: var(--crm-dash-block-padding);
+  display: flex;
+  color: var(--crm-c-text);
+  background-color: var(--crm-inline-edit-bg);
+}
+div.crm-inline-edit-form div.crm-clear {
+  padding: var(--crm-m) 0 0;
+}
+#contactname-block,
+#contactname-block .crm-inline-edit,
+.crm-inline-edit-form div.crm-summary-row {
+  border: 0 solid transparent;
+  width: 100%;
+}
+#contactname-block .crm-inline-edit .crm-container {
+  overflow: scroll !important; /* vs inline css */
+}
+.crm-inline-edit-form div.crm-summary-row div.crm-label,
+.crm-inline-edit-form div.crm-summary-row .label {
+  background: transparent;
+}
+.crm-inline-edit-form div.crm-summary-row div.crm-content {
+  display: table-cell;
+  padding: 0;
+}
+#contact-summary .crm-inline-button,
+#contact-summary .crm-submit-buttons {
+  margin-bottom: 0;
+  padding-bottom: var(--crm-m2);
+}
+.CRM_Contact_Form_Inline_ContactName .crm-inline-button {
+  margin-left: auto;
+  order: 2;
+  align-self: end;
+}
+#crm-contactname-content > .crm-inline-block-content {
+  display: flex;
+  gap: var(--crm-r);
+  align-items: center;
+  border: 2px dashed transparent;
+}
+#crm-contactname-content > .crm-inline-block-content:hover,
+#crm-contactname-content > .crm-inline-block-content:focus {
+  border-color: var(--crm-c-gray-200);
+}
+#crm-contactname-content .crm-summary-display_name {
+  padding: var(--crm-dash-header-padding);
+  font-size: var(--crm-dash-header-size);
+  padding-inline: 0;
+}
+.crm-container div.contact_panel {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  column-gap: var(--crm-dash-panel-padding);
+}
+.crm-container div.contactCardLeft,
+.crm-container div.contactCardRight {
+  width: 100%;
+}
+.crm-container div.contact_panel table {
+  margin-bottom: 0;
+  width: auto;
+}
+.crm-container div.contact_panel td.last {
+  border-bottom: 0;
+}
+.crm-container #customFields {
+  width: 100%;
+}
+.crm-container #customFields div.contact_panel td.talabel {
+  padding: 4px 0 0 4px;
+  border: 0;
+}
+.crm-container #customFields .contact_panel .customFieldGroup {
+  line-height: 1.4em;
+  padding: 4px;
+  width: 100%;
+}
+.crm-container div.contact_panel td.grouplabel {
+  border-bottom: var(--crm-c-divider);
+  border-width: 2px;
+}
+.crm-container div.contact_panel .crm-address-block {
+  margin-bottom: 6px;
+}
+.crm-container .crm-add-address-wrapper {
+  height: 25px;
+}
+.crm-container .crm-summary-row:after {
+  clear: both;
+  content: ".";
+  display: block;
+  height: 0;
+  visibility: hidden;
+}
+.crm-container div.crm-summary-row {
+  background-color: var(--crm-dash-summary-row-bg);
+  border-top: 1px solid var(--crm-dash-summary-row-bg);
+  display: flex;
+}
+.crm-container div.crm-summary-row div.crm-label {
+  background-color: var(--crm-dash-label-bg);
+  color: var(--crm-input-label-color);
+  font-weight: var(--crm-input-label-weight);
+  font-family: var(--crm-input-label-font);
+  font-size: var(--crm-font-size);
+  padding: var(--crm-m);
+  min-width: var(--crm-input-label-width);
+  text-align: left;
+}
+.crm-container div.crm-summary-row div.crm-content {
+  padding: var(--crm-m);
+}
+.crm-container #customFields div.contact_panel td {
+  border-bottom: 1px solid #ffffff;
+  padding: 4px;
+  vertical-align: top;
+}
+#crm-record-log {
+  padding: 0.8em 0.8em 0 0;
+  text-align: right;
+}
+
+/* contact actions menu */
+
+#crm-contact-actions-list {
+  width: 495px;
+}
+.crm-contact-actions-list-inner {
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr 0;
+}
+#crm-contact-actions-list .crm-contact_print-list {
+  grid-column: 3;
+  grid-row: 1;
+}
+.crm-contact_print-list ul {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+#crm-contact-actions-list ul a {
+  display: block;
+}
+.crm-contact-crm-contact-delete {
+  margin-top: auto;
+}
+#crm-contact-actions-list .crm-contact_activities-list select {
+  margin-top: 4px;
+}
+.crm-container table.crm-address-element {
+  border: none;
+  margin-bottom: .25em;
+}
+#crm-contact-actions-list a.delete {
+  background: var(--crm-dropdown-alert-bg);
+  color: var(--crm-c-alert-text);
+  border-radius: var(--crm-roundness);
+}
+#crm-contact-actions-list a.delete .crm-i.fa-trash::before {
+  color: var(--crm-c-alert-text);
+}
+#crm-contact-actions-list a.delete:hover,
+#crm-contact-actions-list a.delete:focus {
+  color: var(--crm-c-alert-text);
+  background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-alert);
+}
+
+/* Tags */
+
+#tagtree {
+  max-height: 500px;
+  overflow: auto;
+}
+#tagtree li {
+  margin-top: 5px;
+}
+#tagtree ins.jstree-icon {
+  cursor: var(--crm-hover-clickable);
+  position: relative;
+  top: -3px;
+}
+#tagtree .jstree-disabled {
+  cursor: not-allowed;
+}
+#tagtree .jstree-disabled > .jstree-checkbox {
+  opacity: .2;
+}
+#tagGroup table .label {
+  color: #fff;
+}
+#tagGroup table {
+  color: #000;
+}
+.crm-contact-page #tags {
+  display: flex;
+  gap: var(--crm-s);
+  align-items: center;
+}
+.crm-contact-page .crm-tag-item {
+  border-radius: var(--crm-roundness);
+  padding: 0 var(--crm-m);
+  background-color: var(--crm-c-background2);
+}
+#crm-main-content-wrapper:has(.crm-contact-page) {
+  box-shadow: var(--crm-block-shadow);
+}
+#contact-summary .crm-summary-block {
+  background: var(--crm-dash-block-bg);
+  border-radius: var(--crm-roundness);
+  box-shadow: var(--crm-block-shadow);
+  margin-bottom: var(--crm-dash-panel-padding);
+}
+#contact-summary .crm-summary-block .crm-summary-block {
+  box-shadow: none;
+}
+#contact-summary div.crm-clear {
+  padding: var(--crm-dash-block-padding);
+}
+#mainTabContainer .crm-summary-block .crm-container-snippet table {
+  box-shadow: none;
+  border: 0;
+  padding: 0;
+  margin: 0;
+}
+div.crm-summary-contactname-block + .crm-actions-ribbon {
+  color: var(--crm-dash-header-col);
+  background-color: var(--crm-dash-header-bg2);
+  margin-bottom: 0;
+  clear: both;
+  margin-left: var(--crm-dash-heading-inset);
+}
+.crm-actions-ribbon ul#actions {
+  display: grid;
+  grid-template-columns: min-content min-content auto min-content min-content;
+  gap: var(--crm-m);
+  margin: 0;
+  padding: var(--crm-dash-header-padding);
+}
+.crm-actions-ribbon ul#actions > * {
+  width: max-content;
+  display: flex;
+  list-style: none;
+}
+.crm-search-col-type-field span.ng-scope a {
+  display: flex;
+  gap: var(--crm-btn-icon-spacing);
+  align-items: center;
+}
+/* Contact dashboard responsive (using Bootstrap viewports) */
+
+@media (max-width: 768px) {
+  #crm-main-content-wrapper {
+    --crm-dash-heading-inset: 0; /* resets any inset on the title/action links */
+  }
+  .crm-container #mainTabContainer,
+  .crm-container div.crm-summary-row {
+    flex-direction: column;
+  }
+  .crm-container .crm-actions-ribbon ul#actions {
+    display: flex;
+    flex-wrap: wrap;
+  }
+  .crm-actions-ribbon .crm-next-action,
+  .crm-actions-ribbon .crm-previous-action {
+    margin-left: 0;
+  }
+}
+@media (max-width: 500px) { /* shows only icons for contact dashboard */
+  .crm-contact-page #mainTabContainer.ui-tabs {
+    grid-template-columns: auto 1fr;
+  }
+  .crm-contact-page #mainTabContainer .crm-contact-tabs-list {
+    width: fit-content;
+  }
+  .crm-container #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor i {
+    font-size: var(--crm-font-size);
+  }
+  .crm-container #mainTabContainer ul.ui-tabs-nav a span {
+    display: none;
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/crm-i.css b/civicrm/ext/riverlea/core/css/crm-i.css
new file mode 100644
index 0000000000000000000000000000000000000000..7c80ad7b9278aa55a1c577c56cc41accbc8446ab
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/crm-i.css
@@ -0,0 +1,44 @@
+/* Direct copy of .fa from font-awesome.css
+This is separate to avoid conflict with a site theme's implementation of FA.  It
+is loaded before font-awesome.css so that .fa-XXX classes can modify it. */
+.crm-container .ui-icon[class*=" fa-"],
+.crm-container a.helpicon,
+.crm-container .help a.helpicon,
+.crm-container .replace-plain::before,
+.crm-i {
+  display: inline-block;
+  font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands", "FontAwesome";
+  font-weight: 400;
+  font-size: inherit;
+  font-style: normal;
+  font-variant: normal;
+  text-rendering: auto;
+  text-decoration: none;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.crm-container a.helpicon {
+  margin-inline: var(--crm-s);
+}
+
+/* Make jQuery UI icons use FA */
+.crm-container .ui-icon[class*=" fa-"] {
+  background: none repeat scroll 0 0 transparent;
+  margin: 0;
+  text-indent: 0;
+}
+
+/* Extra icons to augment Font Awesome, e.g. fa-crm-formula */
+.crm-i[class*="fa-crm-"] {
+  height: 1rem;
+  width: 1rem;
+  vertical-align: middle;
+  background-color: currentColor;
+  mask: var(--icon);
+  mask-size: cover;
+  -webkit-mask: var(--icon);
+  -webkit-mask-size: cover;
+}
+.crm-i.fa-crm-formula {
+  --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 121.83 122.88' style='enable-background:new 0 0 121.83 122.88' xml:space='preserve'%3E%3Cg%3E%3Cpath d='M27.61 34.37l-4.07 4.6l0.4 1.74h10.48c-2.14 12.38-3.74 23.54-6.81 40.74c-3.67 21.94-5.78 27.33-7.03 29.3 c-1.1 1.95-2.68 2.96-4.82 2.96c-2.35 0-6.6-1.86-8.88-3.97c-0.82-0.56-1.79-0.42-2.82 0.26C2 111.74 0 114.42 0 116.82 c-0.12 3.24 4.21 6.06 8.34 6.06c3.64 0 9-2.28 14.64-7.64c7.71-7.31 13.48-17.34 18.3-39.02c3.1-13.84 4.56-22.84 6.74-35.5 l13.02-1.18l2.82-5.17H49.2C52.99 10.53 55.95 7 59.59 7c2.42 0 5.24 1.86 8.48 5.52c0.96 1.32 2.4 1.18 3.5 0.28 c1.85-1.1 4.13-3.92 4.28-6.48C75.96 3.5 72.6 0 66.82 0C61.58 0 53.55 3.5 46.8 10.38c-5.92 6.27-9.02 14.1-11.16 23.99H27.61 L27.61 34.37z M69.27 50.33c4.04-5.38 6.46-7.17 7.71-7.17c1.29 0 2.32 1.27 4.53 8.41l3.78 12.19 c-7.31 11.18-12.66 17.41-15.91 17.41c-1.08 0-2.17-0.34-2.94-1.1c-0.76-0.76-1.6-1.39-2.42-1.39c-2.68 0-6 3.25-6.06 7.28 c-0.06 4.11 2.82 7.05 6.6 7.05c6.49 0 11.98-6.37 22.58-23.26l3.1 10.45c2.66 8.98 5.78 12.81 9.68 12.81 c4.82 0 11.3-4.11 18.37-15.22l-2.96-3.38c-4.25 5.12-7.07 7.52-8.74 7.52c-1.86 0-3.49-2.84-5.64-9.82l-4.53-14.73 c2.68-3.95 5.32-7.27 7.64-9.92c2.76-3.15 4.89-4.49 6.34-4.49c1.22 0 2.28 0.52 2.94 1.25c0.87 0.96 1.39 1.41 2.42 1.41 c2.33 0 5.93-2.96 6.06-6.88c0.12-3.64-2.14-6.74-6.06-6.74c-5.92 0-11.14 5.1-21.19 20.04l-2.07-6.41 c-2.9-9-4.82-13.63-8.86-13.63c-4.7 0-11.16 5.78-17.48 14.94L69.27 50.33L69.27 50.33z'/%3E%3C/g%3E%3C/svg%3E");
+}
diff --git a/civicrm/ext/riverlea/core/css/crm-iconPicker.css b/civicrm/ext/riverlea/core/css/crm-iconPicker.css
new file mode 100644
index 0000000000000000000000000000000000000000..d322415106e4f603041f370719d5f02f718f0760
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/crm-iconPicker.css
@@ -0,0 +1,27 @@
+/* icon picker styles */
+
+#crmIconPicker .icon-ctrls input::placeholder {
+  font-family: FontAwesome;
+}
+#crmIconPicker .icon-ctrls > * {
+  margin-right: 1rem;
+}
+#crmIconPicker .icon-ctrls > button {
+  float: right;
+  margin-right: 0;
+}
+#crmIconPicker .icons {
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--crm-m);
+  margin-top: 2rem;
+}
+#crmIconPicker a.ui-button {
+  color: var(--crm-c-text) !important;
+  background: transparent;
+  width: var(--crm-r2);
+  height: var(--crm-r2);
+  border: 0;
+  padding: 0;
+  display: inline-block;
+}
diff --git a/civicrm/ext/riverlea/core/css/dashboard.css b/civicrm/ext/riverlea/core/css/dashboard.css
new file mode 100644
index 0000000000000000000000000000000000000000..ef73f6576bee138acf977282ae3ae703d0c58c0d
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/dashboard.css
@@ -0,0 +1,203 @@
+/* Style rules for Dashboard.
+   Forked on 11 June 24. Called on main Civi dashboard home screen.
+   Status: merged (theme edits integrated)
+   NB - all Important Declarations can be removed for > 5.75 */
+
+#civicrm-dashboard > .crm-flex-box {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: var(--crm-r);
+  /* avoid total collapse else no droppable area if all widgets removed */
+  min-height: var(--crm-r);
+}
+.crm-container .crm-dashlet {
+  border-radius: var(--crm-dashlet-radius);
+  background-color: var(--crm-dashlet-bg);
+  padding: var(--crm-dashlet-padding);
+  box-shadow: var(--crm-dashlet-box-shadow);
+  margin-bottom: var(--crm-padding-reg);
+  border: var(--crm-dashlet-border);
+}
+.crm-container .ui-sortable-helper.crm-dashlet {
+  box-shadow: var(--crm-block-shadow);
+}
+.crm-container #civicrm-dashboard .crm-dashlet-header {
+  background-color: var(--crm-dashlet-header-bg);
+  border-radius: var(--crm-dashlet-radius);
+  border: var(--crm-dashlet-header-border);
+  border-width: var(--crm-dashlet-header-border-width);
+  padding: var(--crm-dashlet-header-padding);
+  display: flex;
+  align-items: center;
+  flex-direction: row-reverse;
+  cursor: move;
+}
+.crm-container .crm-dashlet-header h3 {
+  background: transparent;
+  cursor: move;
+  margin: 0 auto 0 0 !important;
+  padding: 0;
+  color: var(--crm-dashlet-header-col);
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  color: var(--crm-dashlet-header-col);
+  font-size: var(--crm-dashlet-header-font-size);
+}
+.crm-container .crm-dashlet-header a {
+  color: var(--crm-dashlet-header-col);
+  padding: var(--crm-xs) var(--crm-s);
+  text-decoration: none;
+  font-size: var(--crm-font-size);
+  font-weight: normal;
+  cursor: var(--crm-hover-clickable);
+  opacity: .7;
+  float: right;
+}
+.crm-container .crm-dashlet-header:hover .crm-i {
+  opacity: 1;
+}
+.crm-container .crm-dashlet-header a.crm-dashlet-collapse {
+  order: 1;
+}
+crm-dashlet[is-fullscreen=true] > .crm-dashlet-content {
+  height: calc(100% - 1em);
+}
+.crm-container .crm-dashlet-content {
+  background: var(--crm-dashlet-bg);
+  padding: var(--crm-dashlet-content-padding);
+  overflow: auto;
+}
+.crm-container .crm-dashlet-content > .ng-scope { /* for FormBuilder dashlets */
+  padding: var(--crm-dash-block-padding);
+}
+.crm-container .crm-dashlet details.crm-accordion-bold > .crm-accordion-body {
+  padding: 0;
+  border-bottom: var(--crm-expand-border);
+}
+.crm-container .crm-dashlet .crm-accordion-body table {
+  margin: 0;
+  border: 0;
+  box-shadow: var(--crm-input-box-shadow);
+}
+.crm-container .crm-dashlet .crm-accordion-body table tr {
+  padding: var(--crm-dash-block-padding);
+  display: flex;
+  border: 0 solid transparent;
+  gap: var(--crm-r);
+}
+.crm-dashlet .dataTables_wrapper {
+  border-radius: 0;
+  box-shadow: none;
+  margin: 0;
+  padding: var(--crm-dash-block-padding);
+  background: var(--crm-dashlet-bg);
+}
+.crm-dashlet table.dataTable {
+  overflow: scroll;
+  padding: 0;
+  border-bottom: 0 solid transparent;
+  width: 99% !important;
+}
+.crm-dashlet #help {
+  margin: var(--crm-dash-block-padding);
+}
+.crm-container .crm-inactive-dashlet-fieldset .help {
+  width: 100%;
+  margin: 0;
+}
+.crm-container .crm-inactive-dashlet {
+  display: inline-block;
+  width: 230px;
+  height: var(--crm-xxl);
+  margin: 10px;
+  box-shadow: 1px 1px 4px 1px rgba(0,0,0,0.2);
+  box-shadow: var(--crm-popup-shadow);
+  background-color: var(--crm-c-background4);
+  border-radius: var(--crm-dashlet-radius);
+  margin: 0;
+}
+.crm-container .crm-inactive-dashlet .crm-dashlet-header {
+  border-radius: var(--crm-dashlet-radius) var(--crm-dashlet-radius) 0 0;
+}
+.crm-container .crm-inactive-dashlet .crm-dashlet-header h3 {
+  font-size: 100%;
+  padding-left: var(--crm-s1);
+}
+#civicrm-dashboard .ui-sortable-placeholder {
+  border: 2px dashed var(--crm-c-gray-700);
+  visibility: visible !important;
+  width: 226px;
+  height: 66px !important;
+  vertical-align: bottom;
+}
+#civicrm-dashboard .ui-sortable-placeholder * {
+  visibility: hidden;
+}
+
+/* News feed */
+.crm-container #civicrm-news-feed {
+  border: 0 solid transparent;
+  border-radius: var(--crm-dashlet-radius);
+}
+#civicrm-news-feed ul {
+  border-bottom: var(--crm-dashlet-tabs-border);
+  border-radius: var(--crm-roundness);
+}
+#civicrm-news-feed .ui-tabs-panel {
+  padding: var(--crm-s) 0 0;
+}
+.crm-container #civicrm-news-feed .crm-accordion-body {
+  padding: var(--crm-expand-body-padding);
+}
+
+/* Getting statrted */
+#civicrm-getting-started table {
+  box-shadow: none;
+  border: 0 solid transparent;
+  margin: 0;
+}
+#civicrm-getting-started table tr:last-of-type {
+  border-bottom: 0 solid transparent;
+}
+
+/* Activity dashlet */
+.crm-container .crm-dashlet table.activity-search-options {
+  width: 100%;
+}
+.crm-container .crm-activity-selector-dashlet .crm-accordion-body table tr {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  border: 0 solid transparent;
+}
+
+/* Add dashlet */
+fieldset.crm-inactive-dashlet-fieldset {
+  padding: 0;
+  border: 0;
+  margin-bottom: var(--crm-r);
+}
+fieldset.crm-inactive-dashlet-fieldset > div {
+  background-color: var(--crm-dashlet-dashlets-bg) !important;
+  box-shadow: var(--crm-dashlet-box-shadow);
+  border-radius: var(--crm-dashlet-radius);
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--crm-r);
+  padding: var(--crm-r);
+}
+fieldset.crm-inactive-dashlet-fieldset legend {
+  background-color: transparent;
+  display: block;
+  margin-bottom: var(--crm-r);
+  top: var(--crm-s);
+}
+fieldset.crm-inactive-dashlet-fieldset legend .crm-hover-button {
+  padding: var(--crm-btn-large-padding);
+  margin-right: var(--crm-r);
+}
+/* Searchkit Dashlets */
+
+.crm-dashlet .crm-search-display .form-inline {
+  padding: var(--crm-padding-reg);
+}
diff --git a/civicrm/ext/riverlea/core/css/joomla.css b/civicrm/ext/riverlea/core/css/joomla.css
new file mode 100644
index 0000000000000000000000000000000000000000..f786dd617c2c2eeadfed5339e5a0b57f93eb7755
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/joomla.css
@@ -0,0 +1,72 @@
+/*  Joomla-specific css directives for CiviCRM.
+    These are namespaced to Joomla so could be loaded on other CMSs. */
+
+/* Joomla 3 - body.com_civicrm */
+
+body.com_civicrm {
+  font-size: 100%;
+}
+body.admin.com_civicrm {
+  --crm-page-padding: 3rem;
+  --crm-page-width: 100%;
+}
+body.admin.com_civicrm #subhead-container,
+body.admin.com_civicrm .subhead-collapse,
+body.admin.com_civicrm.layout-default a[target="_blank"]::before {
+  display: none;
+}
+body.admin.com_civicrm .crm-container details { /* Atum J4 reset */
+  background: inherit;
+  border: none;
+  border-radius: inherit;
+  margin: 0;
+  padding: 0;
+}
+body.admin.com_civicrm .crm-container details + details {
+  margin: 0.25rem 0 0;
+}
+body.admin.com_civicrm .crm-container details summary ~ * { /* Atum J4 reset */
+  margin-top: 0;
+}
+body.admin.com_civicrm .crm-container.ui-dialog {
+  z-index: 100000;
+}
+body.admin.com_civicrm .ui-widget-overlay {
+  z-index: 100001;
+}
+body.admin.com_civicrm .select2-drop {
+  z-index: 100002;
+}
+body.admin.com_civicrm .modal-dialog {
+  max-width: inherit;
+  margin: 0;
+  padding: 0;
+  overflow: scroll;
+  pointer-events: all;
+}
+
+/* Joomla 4 - body.com_civicrm.layout-default */
+
+body.admin.com_civicrm.layout-default {
+  --crm-page-padding: 1rem;
+}
+body.admin.com_civicrm.layout-default .breadcrumb {
+  background: transparent;
+}
+body.admin.com_civicrm.task-civicrmcontactview .breadcrumb, /* Hides breadcrumb on contact dashboard */
+body.admin.com_civicrm.layout-default .crm-container .dropdown-toggle::after {
+  display: none;
+}
+body.admin.com_civicrm.layout-default .container-main {
+  padding-bottom: 0; /* removes bottom space */
+}
+body.admin.com_civicrm.layout-default #content,
+body.admin.com_civicrm.layout-default #content > .row > .col-md-12 {
+  padding: 0;
+}
+body.admin.com_civicrm.layout-default #content > .row {
+  margin-inline: 0;
+}
+body.com_civicm.layout-default .table tbody a:not(.badge):not(.btn):not(.dropdown-item) {
+  text-decoration: var(--crm-link-decoration);
+}
diff --git a/civicrm/ext/riverlea/core/css/rename-css-var.php b/civicrm/ext/riverlea/core/css/rename-css-var.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ef304b798845395ec186aa37d77022667cbd320
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/rename-css-var.php
@@ -0,0 +1,89 @@
+<?php
+if (PHP_SAPI !== 'cli') {
+  http_response_code(404);
+  exit;
+}
+
+// Put old var name then some spaces, then new var name.
+// Run with: php fix.php from within the css/ dir.
+$names = explode("\n", <<<TXT
+--crm-alert             --crm-c-alert
+--crm-alert-text        --crm-c-alert-text
+--crm-amber             --crm-c-amber
+--crm-background        --crm-c-background
+--crm-background2       --crm-c-background2
+--crm-background3       --crm-c-background3
+--crm-background4       --crm-c-background4
+--crm-background5       --crm-c-background5
+--crm-blue              --crm-c-blue
+--crm-blue-dark         --crm-c-blue-dark
+--crm-blue-darker       --crm-c-blue-darker
+--crm-blue-light        --crm-c-blue-light
+--crm-dark-teal         --crm-c-dark-teal
+--crm-dark-text         --crm-c-dark-text
+--crm-darkest           --crm-c-darkest
+--crm-divider           --crm-c-divider
+--crm-drag-background   --crm-c-drag-background
+--crm-focus             --crm-c-focus
+--crm-gray-025          --crm-c-gray-025
+--crm-gray-050          --crm-c-gray-050
+--crm-gray-100          --crm-c-gray-100
+--crm-gray-200          --crm-c-gray-200
+--crm-gray-300          --crm-c-gray-300
+--crm-gray-400          --crm-c-gray-400
+--crm-gray-500          --crm-c-gray-500
+--crm-gray-600          --crm-c-gray-600
+--crm-gray-700          --crm-c-gray-700
+--crm-gray-800          --crm-c-gray-800
+--crm-gray-900          --crm-c-gray-900
+--crm-green             --crm-c-green
+--crm-green-dark        --crm-c-green-dark
+--crm-green-light       --crm-c-green-light
+--crm-inactive          --crm-c-inactive
+--crm-info              --crm-c-info
+--crm-info-text         --crm-c-info-text
+--crm-light-text        --crm-c-light-text
+--crm-link              --crm-c-link
+--crm-link-hover        --crm-c-link-hover
+--crm-page-background   --crm-c-page-background
+--crm-primary           --crm-c-primary
+--crm-primary-hover     --crm-c-primary-hover
+--crm-primary-text      --crm-c-primary-text
+--crm-purple            --crm-c-purple
+--crm-purple-dark       --crm-c-purple-dark
+--crm-red               --crm-c-red
+--crm-red-dark          --crm-c-red-dark
+--crm-red-light         --crm-c-red-light
+--crm-secondary         --crm-c-secondary
+--crm-secondary-hover   --crm-c-secondary-hover
+--crm-secondary-text    --crm-c-secondary-text
+--crm-success           --crm-c-success
+--crm-success-text      --crm-c-success-text
+--crm-teal              --crm-c-teal
+--crm-text              --crm-c-text
+--crm-warning           --crm-c-warning
+--crm-warning-text      --crm-c-warning-text
+--crm-yellow            --crm-c-yellow
+--crm-yellow-less-light --crm-c-yellow-less-light
+--crm-yellow-light      --crm-c-yellow-light
+--crm-amber-light       --crm-c-amber-light
+TXT);
+$map = [];
+foreach ($names as $pair) {
+  [$old, $new] = preg_split('/\s+/', $pair);
+  $map[$old] = $new;
+}
+$di = new RecursiveDirectoryIterator(__DIR__, RecursiveDirectoryIterator::SKIP_DOTS);
+$it = new RecursiveIteratorIterator($di);
+foreach ($it as $filepath) {
+  if (pathinfo($filepath, PATHINFO_EXTENSION) == "css") {
+    $orig = $css = file_get_contents($filepath);
+    foreach ($map as $old => $new) {
+      $css = preg_replace("/$old(?!-)/", $new, $css);
+    }
+    if ($orig !== $css) {
+      echo "Updated $filepath\n";
+      file_put_contents($filepath, $css);
+    }
+  }
+}
diff --git a/civicrm/ext/riverlea/core/css/searchForm.css b/civicrm/ext/riverlea/core/css/searchForm.css
new file mode 100644
index 0000000000000000000000000000000000000000..a383b621faef8ae241e087e0368260e5e855f0e9
--- /dev/null
+++ b/civicrm/ext/riverlea/core/css/searchForm.css
@@ -0,0 +1,45 @@
+/* Style rules for some search forms and results.
+   Forked on 1 JuAugustne 24.
+   Status: merged */
+
+/* Alpha filter */
+
+.crm-container div#alpha-filter {
+  background-color: var(--crm-filter-bg);
+  margin: var(--crm-r) 0;
+  padding: var(--crm-filter-padding);
+  text-align: left;
+  box-shadow: var(--crm-block-shadow);
+  border-radius: var(--crm-roundness);
+}
+#crm-container #alpha-filter ul {
+  margin: 0;
+  display: flex;
+  gap: var(--crm-flex-gap);
+  justify-content: var(--crm-filter-spacing);
+}
+.crm-container #alpha-filter li {
+  color: var(--crm-c-text);
+}
+.crm-container #alpha-filter a {
+  font-weight: normal;
+  background: var(--crm-filter-item-bg);
+  padding: var(--crm-s) var(--crm-m);
+  box-shadow: var(--crm-filter-item-shadow);
+}
+
+/* Advanced Search - basic criteria */
+
+.advanced-search-fields {
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  width: 100%;
+  column-gap: var(--crm-r);
+  row-gap: var(--crm-s);
+}
+.advanced-search-fields .search-field__span-2 {
+  grid-column: 1 / span 2;
+}
+.advanced-search-fields .search-field__span-3 {
+  grid-column: 1 / span 3;
+}
diff --git a/civicrm/ext/riverlea/core/org.civicrm.afform-ang/afCore.css b/civicrm/ext/riverlea/core/org.civicrm.afform-ang/afCore.css
new file mode 100644
index 0000000000000000000000000000000000000000..8c0b2555760c034ba646165ea959a076d2fe6cf6
--- /dev/null
+++ b/civicrm/ext/riverlea/core/org.civicrm.afform-ang/afCore.css
@@ -0,0 +1,101 @@
+/* Style rules for Form Builder Admin
+   Forked on 29 July 24. Called on Form Builder front-end
+   Status: merged */
+
+.af-api4-action-running {
+  cursor: not-allowed;
+  color: var(--crm-c-darkest);
+}
+a.af-api4-action-idle {
+  cursor: var(--crm-hover-clickable);
+}
+.crm-container .af-container.af-layout-cols,
+.af-container.af-layout-inline {
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--crm-flex-gap);
+}
+.af-container.af-layout-cols > *,
+.af-container.af-layout-inline > * {
+  flex: 1;
+}
+.af-container.af-layout-inline {
+  flex-direction: row;
+}
+.af-container.af-layout-cols > .af-title {
+  flex: 0 0 100%;
+}
+.af-container.af-layout-inline > .af-title {
+  display: block;
+  width: 100%;
+}
+.afform-directive,
+af-form {
+  display: block;
+  position: relative;
+}
+#bootstrap-theme .input-group .crm-af-field {
+  display: inline-block;
+}
+#bootstrap-theme .input-group .afform-search-operator {
+  width: 6rem;
+}
+[af-repeat-item] {
+  position: relative;
+}
+#bootstrap-theme [af-repeat-item] .af-repeat-remove-btn {
+  min-width: 30px;
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.crm-container details.af-container {
+  border: var(--crm-expand-border);
+  border-radius: var(--crm-expand-radius);
+  padding-block: 0;
+}
+
+/* Card style */
+.af-container-style-pane {
+  background-color: var(--crm-form-block-background);
+  border-radius: var(--crm-form-block-border-radius);
+  box-shadow: var(--crm-form-block-box-shadow);
+  position: relative;
+  padding: var(--crm-form-block-padding);
+  padding-top: 50px !important;
+}
+#bootstrap-theme .af-container-style-pane > .af-title {
+  background-color: var(--crm-c-background5);
+  color: var(--crm-c-light-text);
+  border-radius: var(--crm-form-block-border-radius) var(--crm-form-block-border-radius) 0 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  padding: var(--crm-m) var(--crm-r);
+  margin-top: 0;
+}
+
+/* Admin edit links */
+.afform-directive .af-admin-edit-form-link {
+  position: absolute !important;
+  right: 0;
+  top: 0;
+  opacity: .5;
+}
+.afform-directive .af-admin-edit-form-link.open,
+.afform-directive:hover .af-admin-edit-form-link {
+  opacity: 1;
+}
+
+/* Fieldset */
+
+fieldset.af-container.af-layout-inline {
+  border: 0;
+}
+
+/* Multiple button gap */
+
+#bootstrap-theme .crm-search-col-type-buttons .btn {
+  margin: 0 var(--crm-flex-gap) var(--crm-flex-gap) 0;
+}
diff --git a/civicrm/ext/riverlea/core/org.civicrm.afform_admin-ang/afGuiEditor.css b/civicrm/ext/riverlea/core/org.civicrm.afform_admin-ang/afGuiEditor.css
new file mode 100644
index 0000000000000000000000000000000000000000..ca5c3574bc022eef45fd2c93167e96f683e8b384
--- /dev/null
+++ b/civicrm/ext/riverlea/core/org.civicrm.afform_admin-ang/afGuiEditor.css
@@ -0,0 +1,696 @@
+/* Style rules for Form Builder Admin
+   Forked on 24 July 24. Called on Form Builder
+   Status: merged */
+
+/* List page */
+.afadmin-list th[ng-click] {
+  cursor: var(--crm-hover-clickable);
+}
+.afadmin-list th i.fa-sort-desc,
+.afadmin-list th i.fa-sort-asc {
+  color: var(--crm-c-link);
+}
+.afadmin-list th:not(:hover) i.fa-sort {
+  opacity: .5;
+}
+#afform-list-filter {
+  font-family: sans-serif,'FontAwesome';
+}
+/* Editor */
+
+#afGuiEditor {
+  gap: var(--crm-r);
+  height: 100% !important /* vs inline fixed height */;
+}
+#afGuiEditor .af-gui-columns {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: var(--crm-r);
+}
+#afGuiEditor fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+#afGuiEditor fieldset legend {
+  padding: var(--crm-s) 0 0 0;
+  border-bottom: var(--crm-c-divider);
+  width: 100%;
+  margin-bottom: var(--crm-m);
+}
+#afGuiEditor hr {
+  margin-block: var(--crm-m);
+}
+
+/* Icon only buttons */
+
+#afGuiEditor .panel-heading .af-gui-canvas-control-buttons button,
+#afGuiEditor .af-gui-remove-entity,
+#bootstrap-theme #afGuiEditor .af-gui-field-select-in-dropdown button /* icon-only buttons */ {
+  padding: 0;
+  margin: 0;
+  max-height: 32px;
+  aspect-ratio: 1 / 1;
+}
+#afGuiEditor .af-gui-field-select-in-dropdown button i.crm-i,
+#afGuiEditor-canvas .af-gui-canvas-control-buttons button.btn-default i.crm-i,
+#afGuiEditor .af-gui-remove-entity i.crm-i {
+  margin: 0;
+  border: 0;
+  padding: var(--crm-s2);
+  height: 100%;
+  aspect-ratio: 1 / 1;
+  min-width: var(--crm-r4);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+/* Panel */
+#afGuiEditor-canvas .panel-heading {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  border-bottom: var(--crm-tabs-border);
+}
+#afGuiEditor-canvas .panel-heading > .nav-tabs {
+  width: auto;
+  border-bottom: 0;
+}
+#afGuiEditor-canvas .panel-heading > .af-gui-canvas-control-buttons,
+#afGuiEditor-canvas .panel-heading > .pull-right,
+#afGuiEditor .af-gui-edit-options-bar .pull-right {
+  order: 2;
+  display: flex;
+  gap: var(--crm-flex-gap);
+  padding: 0;
+  align-items: center;
+}
+#afGuiEditor-canvas .panel-heading > .pull-right {
+  order: 3;
+}
+#afGuiEditor .panel-heading ul.nav-tabs li.fluid-width-tab {
+  white-space: nowrap;
+  overflow: hidden;
+}
+#afGuiEditor .panel-heading .form-inline.pull-right button {
+  max-height: 32px;
+  margin: 0;
+}
+#afGuiEditor .panel-body {
+  padding: var(--crm-padding-reg);
+  position: relative;
+  border-top: none !important;
+  height: 100%;
+  background: var(--crm-tab-bg-active);
+}
+
+/* Edit palette (left side) */
+#afGuiEditor-palette input,
+#afGuiEditor-palette textarea,
+#afGuiEditor-palette select {
+  width: 100%;
+}
+#afGuiEditor-palette input[type="checkbox"],
+#afGuiEditor-palette input[type="radio"] {
+  width: 1rem;
+  height: 1rem;
+}
+#afGuiEditor-palette .form-group label {
+  width: 100%;
+  display: block;
+}
+#afGuiEditor-palette .checkbox label {
+  padding: 0;
+}
+#afGuiEditor-palette .input-group:has(#af_config_redirect) {
+  display: grid;
+  gap: var(--crm-s);
+  grid-template-columns: 1fr 250px;
+}
+#afGuiEditor-palette .input-group:has(#af_config_redirect) .input-group-addon,
+#afGuiEditor-palette input.select2-input {
+  width: 100%;
+  min-width: 100%;
+}
+#afGuiEditor-palette #s2id_autogen3 {
+  width: 100% !important /* vs inline */;
+}
+#afGuiEditor-palette #af_config_form_permission_operator {
+  width: 60px;
+}
+#afGuiEditor-palette #s2id_af_config_form_permission {
+  width: calc(100% - 66px) !important /* vs inline */;
+}
+
+/* Builder settings */
+#afGuiEditor-palette .af-gui-remove-entity {
+  position: absolute;
+  top: var(--crm-padding-reg);
+  right: var(--crm-padding-reg);
+}
+#afGuiEditor-palette .af-gui-entity-values .form-inline {
+  margin-bottom: var(--crm-m);
+  display: flex;
+  align-items: center;
+  gap: var(--crm-flex-gap);
+}
+#afGuiEditor-palette .af-gui-entity-values .select2-container {
+  width: 100% !important /* vs inline */;
+  margin-bottom: var(--crm-s2);
+}
+#afGuiEditor-palette .af-gui-entity-values .input-group {
+  width: 100%;
+  display: flex;
+}
+#afGuiEditor-palette .af-gui-entity-values .input-group > span {
+  width: 100%;
+}
+#bootstrap-theme #afGuiEditor-palette .af-gui-entity-values .input-group .btn {
+  height: calc(var(--crm-btn-height) + 4px);
+}
+#afGuiEditor-palette .af-gui-entity-palette legend {
+  margin-bottom: 0;
+  padding-bottom: 0;
+  border-bottom: 0;
+}
+#afGuiEditor-palette .af-gui-entity-palette .input-group {
+  margin-top: var(--crm-s);
+}
+#afGuiEditor-palette .af-gui-entity-palette [type="search"] {
+  width: 100%;
+  border-radius: var(--crm-roundness) var(--crm-roundness) 0 0;
+  padding: var(--crm-s2);
+  font-weight: normal;
+  position: relative;
+  margin: 0;
+  border-bottom: 0;
+  font-family: sans-serif,'FontAwesome';
+}
+.af-gui-entity-palette-select-list {
+  border: var(--crm-c-divider);
+  border-radius: 0 0 var(--crm-roundness) var(--crm-roundness);
+  padding: 0 var(--crm-s) var(--crm-s);
+  max-height: 400px;
+  overflow-y: auto;
+}
+.af-gui-entity-palette-select-list [ui-sortable] > div {
+  cursor: move;
+  padding: var(--crm-xs) var(--crm-m) var(--crm-xs) var(--crm-r);
+  position: relative;
+}
+.af-gui-entity-palette-select-list [ui-sortable] > div.disabled {
+  cursor: auto;
+}
+.af-gui-entity-palette-select-list [ui-sortable] > div:not(.disabled):hover {
+  background-color: var(--crm-c-background3);
+}
+
+/* Edit canvas (right side) */
+#afGuiEditor-canvas .af-gui-container,
+#afGuiEditor-canvas .af-gui-markup,
+#afGuiEditor-canvas .af-gui-text,
+#afGuiEditor-canvas .af-gui-button,
+#afGuiEditor-canvas .af-gui-element {
+  margin-bottom: var(--crm-padding-small);
+  border: 2px solid transparent;
+  display: block;
+  border-radius: var(--crm-roundness);
+  position: relative;
+  padding: var(--crm-m);
+}
+#afGuiEditor af-gui-field,
+#afGuiEditor .af-gui-block-label,
+#afGuiEditor af-gui-edit-options {
+  display: block;
+}
+#afGuiEditor .af-gui-container-type-fieldset {
+  box-shadow: 0 0 5px var(--crm-c-gray-300);
+}
+
+/* Canvas gui bar */
+#afGuiEditor-canvas .af-gui-bar {
+  height: var(--crm-l);
+  width: 100%;
+  border-radius: 0;
+  transition: opacity .2s;
+  background-color: var(--crm-c-background3);
+  padding-inline: var(--crm-xs);
+  cursor: move;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+#afGuiEditor [ui-sortable] .af-gui-bar:before,
+#afGuiEditor .af-gui-entity-palette-select-list [ui-sortable] > div:not(.disabled):hover:before,
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area [ui-sortable] li:before {
+  background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjODg4Ij48L3JlY3Q+Cjwvc3ZnPg==");
+  width: var(--crm-m);
+  height: calc(100% - var(--crm-m));
+  content: ' ';
+  width: 10px;
+}
+#afGuiEditor-canvas .af-gui-bar .form-inline {
+  padding: 0;
+  display: flex;
+  gap: var(--crm-flex-gap);
+  align-items: center;
+}
+#afGuiEditor-canvas af-gui-container-multi-toggle .btn .ng-binding {
+  display: flex;
+  margin-right: var(--crm-m);
+}
+#afGuiEditor .af-gui-node-title {
+  position: absolute;
+  top: 1px;
+  width: calc(100% - var(--crm-r4));
+}
+#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-bar,
+#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container-title span:empty {
+  opacity: 0;
+}
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-bar,
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-container-title span:empty {
+  opacity: 1;
+  transition: opacity .2s;
+}
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-container:not(.af-gui-container-type-fieldset),
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-element,
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-markup {
+  border: 2px solid var(--crm-c-background2);
+}
+/* Dragging related */
+#afGuiEditor #afGuiEditor-canvas .af-gui-dragtarget > .af-gui-bar,
+#afGuiEditor #afGuiEditor-canvas .af-gui-dragtarget > .af-gui-container-title span:empty {
+  background-color: var(--crm-c-background4);
+  opacity: 1;
+  transition: opacity .1s;
+}
+/* Disable menu while dragging */
+body.af-gui-dragging #civicrm-menu {
+  pointer-events: none;
+}
+/* Disable scrollbars while dragging */
+body.af-gui-dragging {
+  overflow-x: hidden;
+  overflow-y: hidden;
+}
+af-gui-container > .af-gui-bar,
+.af-gui-element > .af-gui-bar,
+.af-gui-container-type-div > .af-gui-bar,
+.af-gui-markup > .af-gui-bar {
+  margin: calc(-1 * var(--crm-m)) calc(-1 * var(--crm-m)) var(--crm-m) calc(-1 * var(--crm-m));
+  width: calc(100% + var(--crm-r)) !important;
+}
+#afGuiEditor-canvas [ui-sortable] .af-gui-bar:has(~ .af-gui-field-input) {
+  border-radius: var(--crm-roundness) var(--crm-roundness) 0 0;
+}
+
+/* Canvas layout */
+#afGuiEditor .af-gui-layout {
+  min-height: 2rem;
+}
+#afGuiEditor .af-gui-layout.af-layout-cols,
+#afGuiEditor .af-gui-layout.af-layout-inline {
+  display: flex;
+  gap: var(--crm-m);
+}
+#afGuiEditor .af-gui-layout.af-layout-inline {
+  flex-flow: wrap;
+}
+#afGuiEditor .af-gui-layout.af-layout-cols > div {
+  flex: 1;
+  min-width: 1%;
+}
+#afGuiEditor .af-gui-layout.af-layout-inline > div {
+  display: inline-block;
+  width: 300px;
+  vertical-align: top;
+}
+
+/* Canvas elements */
+#afGuiEditor.af-gui-editing-content .af-gui-container,
+#afGuiEditor .af-gui-markup-content {
+  border: 2px solid transparent;
+}
+#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container:hover,
+.af-gui-dragging #afGuiEditor .af-gui-container,
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-container:hover,
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-element:hover,
+#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-markup:hover,
+#afGuiEditor .crm-editable-enabled:hover:not(:focus) {
+  border: 2px dashed var(--crm-c-gray-700);
+}
+#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container .af-gui-element:hover,
+#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container .af-gui-markup:hover {
+  border-width: 1px;
+}
+#afGuiEditor-canvas .af-entity-selected {
+  border: 2px dashed var(--crm-c-blue-dark);
+}
+#afGuiEditor-canvas .af-entity-selected > .af-gui-bar {
+  background-color: var(--crm-c-primary);
+  opacity: 1;
+  transition: opacity 0s;
+}
+#afGuiEditor-canvas .af-entity-selected > .af-gui-bar + label,
+#afGuiEditor .af-entity-selected > .af-gui-bar .af-gui-add-element-button span {
+  color: var(--crm-c-primary-text);
+}
+#afGuiEditor .af-gui-container.af-gui-dragtarget {
+  border: 2px solid var(--crm-c-blue-dark);
+  box-shadow: 0 0 5px var(--crm-c-blue-dark);
+}
+
+/* Card style */
+#afGuiEditor .af-gui-search-display {
+  border: 1px dotted var(--crm-c-background5);
+  color: var(--crm-c-text);
+  padding: var(--crm-padding-reg);
+  background-color: var(--crm-c-background2);
+}
+
+/* Markup area */
+#afGuiEditor .af-gui-markup-content-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+#afGuiEditor .af-gui-markup-content:hover .af-gui-markup-content-overlay {
+  background-color: rgba(255, 255, 255, .2);
+}
+#afGuiEditor .af-gui-content-editing-area .af-gui-edit-options-bar {
+  width: 100%;
+  background-color: var(--crm-c-background3);
+  display: flex;
+  align-items: center;
+  padding: var(--crm-m);
+  justify-content: space-between;
+}
+.af-gui-edit-options-bar h4 {
+  font-size: var(--crm-font-size);
+  margin: 0 !important; /* vs bootstrap.css */
+}
+#afGuiEditor .af-gui-content-editing-area {
+  pointer-events: auto;
+  cursor: auto;
+}
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > .btn-group > .btn-group > button:hover > span,
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > .btn-group > .btn-group > button[aria-expanded=true] > span,
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > .btn-group > .btn-group > button:focus > span {
+  color: var(--crm-c-info);
+}
+#afGuiEditor .af-gui-add-element-button span {
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  color: var(--crm-c-info);
+}
+#bootstrap-theme #afGuiEditor .af-gui-button > .btn.disabled .crm-editable-enabled:hover:not(:focus) {
+  border-color: var(--crm-c-background2) !important;
+}
+#bootstrap-theme #afGuiEditor .af-gui-button > .btn-default.disabled {
+  background-color: var(--crm-c-background2) !important;
+}
+#afGuiEditor .af-gui-container-title span:empty {
+  font-weight: lighter;
+}
+#afGuiEditor .af-gui-field-required:after {
+  content: '*';
+  color: var(--crm-c-alert);
+  position: relative;
+  left: -4px;
+}
+/* For editing field placeholder text */
+#afGuiEditor .af-gui-field-input input[type=text].form-control {
+  color: var(--crm-c-background5);
+}
+#afGuiEditor .af-gui-field-input-type-number input[type=text].form-control {
+  background-image: url('../images/number.png');
+  background-repeat: no-repeat;
+  background-position: center right 6px;
+}
+#afGuiEditor .af-gui-field-input input.crm-form-date {
+  width: 140px;
+  margin-right: -2px;
+}
+#afGuiEditor .af-gui-field-input input.crm-form-time {
+  width: 80px;
+}
+#afGuiEditor .af-gui-field-input-type-radio label.radio {
+  font-weight: normal;
+  margin-right: 10px;
+}
+#afGuiEditor .af-gui-field-input-type-radio label.radio input[type=radio] {
+  margin: 0;
+}
+#afGuiEditor .af-gui-field-input-type-select .input-group-btn {
+  position: initial;
+}
+#afGuiEditor .input-group-addon {
+  padding: 0;
+}
+#afGuiEditor .af-gui-text-legend {
+  text-decoration: underline;
+}
+#afGuiEditor .af-gui-text-h1,
+#afGuiEditor .af-gui-text-h2,
+#afGuiEditor .af-gui-text-h3,
+#afGuiEditor .af-gui-text-h4,
+#afGuiEditor .af-gui-text-h5,
+#afGuiEditor .af-gui-text-h6 {
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+}
+#afGuiEditor.af-gui-editing-content .panel-heading,
+#afGuiEditor.af-gui-editing-content .af-gui-element,
+#afGuiEditor.af-gui-editing-content .af-gui-markup-content,
+.af-gui-editing-content #afGuiEditor-palette .panel-body > * {
+  opacity: .5;
+}
+#afGuiEditor.af-gui-editing-content .af-gui-bar {
+  visibility: hidden;
+}
+#afGuiEditor.af-gui-editing-content .af-gui-bar:before {
+  background: none;
+}
+#afGuiEditor .af-gui-dropzone {
+  background-color: var(--crm-c-background2);
+  border: 2px solid var(--crm-c-info);
+  min-height: 30px;
+}
+/* Options editor */
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area {
+  border: 2px solid var(--crm-c-info);
+}
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] {
+  padding-inline: var(--crm-padding-reg);
+}
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li {
+  background-color: var(--crm-c-background2);
+  cursor: move;
+  height: var(--crm-btn-height);
+  display: flex;
+  align-items: center;
+  padding-inline: var(--crm-m);
+}
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li:nth-child(even) {
+  background-color: var(--crm-c-background3);
+}
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li > div {
+  display: inline-block;
+}
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul.af-gui-edit-options-deleted li > div {
+  text-decoration: line-through;
+}
+#bootstrap-theme #afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li .btn-xs {
+  padding: 1px;
+}
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area h5 {
+  margin-left: var(--crm-padding-reg);
+}
+#afGuiEditor af-gui-edit-options.af-gui-content-editing-area button.pull-right {
+  margin-left: auto;
+}
+
+/* Rules for Conditional dialog */
+.af-gui-conditional-dialog fieldset {
+  padding: 6px;
+  border-top: 1px solid var(--crm-c-background2);
+  margin-top: 10px;
+  margin-bottom: 10px;
+  position: relative;
+}
+.af-gui-conditional-dialog fieldset fieldset {
+  padding-top: 0;
+  border: 1px solid var(--crm-c-background2);
+  border-top: 0;
+}
+#bootstrap-theme .af-gui-conditional-dialog af-gui-clause > .btn-group {
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+.af-gui-conditional-dialog legend[ng-click] {
+  cursor: var(--crm-hover-clickable);
+}
+i.crm-i.af-gui-conditional-dialog-move-icon {
+  opacity: .5;
+}
+.crm-draggable:hover > i.crm-i.af-gui-conditional-dialog-move-icon,
+.crm-draggable:hover > * > i.crm-i.af-gui-conditional-dialog-move-icon {
+  opacity: 1;
+}
+.af-gui-conditional-dialog .api4-clause-badge {
+  width: 55px;
+  display: inline-block;
+  cursor: move;
+}
+.af-gui-conditional-dialog .api4-clause-badge .badge {
+  opacity: .5;
+  position: relative;
+}
+.af-gui-conditional-dialog .api4-clause-badge .caret {
+  margin: 0;
+}/* Icon only shown while dragging */
+.af-gui-conditional-dialog .api4-clause-badge .crm-i {
+  display: none;
+  padding: 0 6px;
+}
+.af-gui-conditional-dialog .ui-sortable-helper .api4-clause-badge .badge span {
+  display: none;
+}
+.af-gui-conditional-dialog .ui-sortable-helper .api4-clause-badge .crm-i {
+  display: inline-block;
+}
+
+/* Dropdown buttons */
+#bootstrap-theme #afGuiEditor-canvas .dropdown-toggle,
+#bootstrap-theme #afGuiEditor .af-gui-add-element-button {
+  padding: 0;
+  background-color: transparent;
+  border: 0;
+  box-shadow: none;
+  color: var(--crm-c-text);
+  height: auto;
+}
+#afGuiEditor-canvas .dropdown-toggle i.crm-i {
+  padding: 0 !important;
+  background: transparent;
+  border: 0;
+  min-width: auto;
+  height: auto;
+}
+#afGuiEditor .dropdown-menu {
+  min-width: 220px;
+}
+#afGuiEditor .dropdown-menu li {
+  cursor: default;
+  margin: 0;
+}
+#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown {
+  padding: var(--crm-xs);
+  margin: 0;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown label,
+#afGuiEditor .dropdown-menu li > * > label {
+  font-weight: normal;
+  cursor: var(--crm-hover-clickable);
+  color: var(--crm-dropdown-col);
+}
+#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown > select {
+  padding-inline: var(--crm-m);
+  width: 110px;
+  margin-left: var(--crm-xs2);
+  border: 1px solid var(--crm-input-border-color);
+  border-radius: 2px;
+}
+#afGuiEditor li.disabled a strong {
+  color: var(--crm-dropdown-col); /* resets inaccessible colour for dropdown headings mislabelled disabled */
+}
+#afGuiEditor li .af-gui-field-select-in-dropdown input[type="color"] {
+  width: 32px;
+  padding: 1px;
+  margin-left: var(--crm-xs2);
+}
+#afGuiEditor li .af-gui-field-select-in-dropdown input[type=number] {
+  width: 50px;
+  padding-inline: var(--crm-s) 0;
+  height: auto;
+}
+#afGuiEditor .dropdown-menu li .ng-binding:has(> .fa-square-o,
+> .fa-check-square-o) {
+  display: flex;
+  padding-block: 0;
+  align-items: center;
+  gap: var(--crm-s);
+}
+#afGuiEditor .af-gui-field-input-type-chainselect .input-group .dropdown-toggle,
+#afGuiEditor .af-gui-field-input-type-select .input-group .dropdown-toggle,
+#bootstrap-theme #afGuiEditor-palette-config .af-gui-entity-palette .input-group .btn,
+#bootstrap-theme #afGuiEditor-canvas-body .af-gui-field-input .input-group .btn {
+  padding: var(--crm-s) var(--crm-m1);
+}
+#afGuiEditor .af-gui-field-input-type-select .input-group .dropdown-menu {
+  width: 100%;
+  right: 0;
+}
+#afGuiEditor .af-gui-layout-icon {
+  width: 16px;
+  height: 16px;
+  display: block;
+  background-image: url('data:image/svg+xml,<%3Fxml version="1.0" encoding="UTF-8"%3F><svg fill="none" viewBox="0 0 64 61" xmlns="http://www.w3.org/2000/svg"><mask id="d" fill="white"><rect y="33" width="40" height="28" rx="4"/></mask><rect y="33" width="40" height="28" rx="4" mask="url(%23d)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/><mask id="c" fill="white"><rect x="45" y="33" width="19" height="28" rx="4"/></mask><rect x="45" y="33" width="19" height="28" rx="4" mask="url(%23c)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/><mask id="b" fill="white"><rect width="24" height="28" rx="4"/></mask><rect width="24" height="28" rx="4" mask="url(%23b)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/><mask id="a" fill="white"><rect x="29" width="24" height="28" rx="4"/></mask><rect x="29" width="24" height="28" rx="4" mask="url(%23a)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/></svg>');
+  background-repeat: no-repeat;
+  margin: var(--crm-m);
+  background-size: contain;
+}
+#afGuiEditor .af-gui-layout-icon.af-layout-cols {
+  background-image: url('data:image/svg+xml,<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="3" width="22" height="58" rx="3" stroke="black" stroke-width="6" stroke-linejoin="round"/><rect x="39" y="3" width="22" height="58" rx="3" stroke="black" stroke-width="6" stroke-linejoin="round"/></svg>');
+}
+#afGuiEditor .af-gui-layout-icon.af-layout-rows {
+  background-image: url('data:image/svg+xml,<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="2.5" y="2.5" width="59" height="13" rx="3.5" stroke="black" stroke-width="5" stroke-linejoin="round"/><rect x="2.5" y="25.5" width="59" height="13" rx="3.5" stroke="black" stroke-width="5" stroke-linejoin="round"/><rect x="2.5" y="48.5" width="59" height="13" rx="3.5" stroke="black" stroke-width="5" stroke-linejoin="round"/></svg>');
+}
+
+/* Misc - aka stuff I can't identify but don't want to risk removing*/
+#bootstrap-theme #afGuiEditor .af-gui-bar .btn.active {
+  background-color: var(--crm-c-background5);
+}
+#afGuiEditor .af-gui-bar > .form-inline > span {
+  color: var(--crm-c-background5);
+  font-style: italic;
+}
+#afGuiEditor .ui-sortable-helper .af-gui-palette-item {
+  height: 30px;
+  width: 300px;
+  border: 2px dashed var(--crm-c-blue-dark);
+}
+.af-gui-conditional-dialog .api4-operator {
+  width: 110px;
+}
+.af-gui-conditional-dialog fieldset div.api4-input {
+  margin-bottom: 10px;
+}
+.af-gui-conditional-dialog fieldset div.api4-input.ui-sortable-helper {
+  background-color: rgba(255, 255, 255, .9);
+}
+.af-gui-conditional-dialog .api4-clause-fieldset fieldset {
+  float: right;
+  width: calc(100% - 58px);
+  margin-top: -8px;
+}
+.af-gui-conditional-dialog .api4-clause-fieldset.api4-sorting fieldset .api4-clause-group-sortable {
+  min-height: 3.5em;
+}
+.af-gui-conditional-dialog .api4-input-group {
+  display: inline-block;
+}
+#afGuiEditor .af-gui-container.af-container-style-pane {
+  background: linear-gradient(to bottom, #f2f2f2 0 var(--crm-l), transparent var(--crm-l) 100%) no-repeat;
+  border-radius: var(--crm-roundness);
+}
diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchAdmin.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchAdmin.css
new file mode 100644
index 0000000000000000000000000000000000000000..270b4b1bd638d87d006a2ca8e41be91a6f82438c
--- /dev/null
+++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchAdmin.css
@@ -0,0 +1,421 @@
+/* Style rules for SearchKit Admin
+   Forked on 23 July 24. Called on SearchKit Admin pages
+   Status: merged */
+
+/* Searchkit listing */
+
+.crm-search-nav-tabs {
+  position: relative;
+}
+#bootstrap-theme .crm-search-nav-tabs > div.btn-group {
+  position: absolute;
+  right: var(--crm-s);
+  top: var(--crm-s);
+}
+#bootstrap-theme .crm-search-admin-search-listing-buttons {
+  display: flex;
+}
+
+/* Searchkit admin */
+
+/* Top */
+.crm-search .crm-flex-box.crm-search-admin-outer {
+  display: grid;
+  grid-template-columns: 280px auto;
+  margin-bottom: var(--crm-r2);
+}
+.crm-search .crm-flex-box.crm-search-admin-outer:first-of-type {
+  grid-template-columns: 33% auto;
+  align-items: center;
+  gap: var(--crm-m);
+}
+#crm-saved-search-label {
+  width: 100%;
+  height: var(--crm-btn-height);
+}
+
+/* Tabs */
+.crm-search-admin-main-tabs ul.nav-stacked {
+  display: flex;
+  gap: var(--crm-s);
+  position: relative;
+  margin-top: var(--crm-r);
+}
+.crm-search-admin-main-tabs ul.nav-stacked li {
+  cursor: default;
+  margin: 0;
+  padding: 0;
+}
+.crm-search-admin-main-tabs ul.nav-stacked > li > a {
+  display: inline-block;
+  width: 100%;
+  border: 1px solid transparent;
+  border-radius: var(--crm-roundness) 0 0 var(--crm-roundness);
+  right: -1px;
+}
+.crm-search-admin-main-tabs ul.nav-stacked li.active {
+  width: calc(100% + 1px);
+}
+.crm-search-admin-main-tabs ul.nav-stacked li.active a {
+  background-color: var(--crm-tab-bg-active);
+  color: var(--crm-tab-col);
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+  border: 1px solid var(--crm-c-gray-300);
+  border-right: 0 none;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.crm-search ul.nav-stacked li[role=separator] {
+  height: var(--crm-m2);
+  border-top: 1px solid var(--crm-c-gray-300);
+  margin: var(--crm-m) var(--crm-l) 0 var(--crm-r);
+}
+.crm-search ul.nav-stacked li a[disabled] {
+  text-decoration: line-through !important;
+  color: grey;
+  cursor: default;
+  pointer-events: none;
+}
+#bootstrap-theme.crm-search button.btn-xs:has(i.crm-i) {
+  padding: 0;
+}
+.crm-search ul.nav-stacked li:last-of-type {
+  margin-top: var(--crm-r);
+}
+#bootstrap-theme.crm-search ul.nav-stacked li:has(.btn-xs) a {
+  padding-right: 5ch;
+}
+#bootstrap-theme .crm-search-admin-main-tabs button.btn-xs {
+  background: transparent;
+  color: var(--crm-c-text);
+  font-size: var(--crm-font-size);
+}
+.crm-search-display-control {
+  position: absolute;
+  right: var(--crm-s);
+  top: 25%;
+}
+.crm-search-display-control+.crm-search-display-control {
+  right: 28px;
+}
+.crm-search .crm-search-admin-outer .crm-flex-4.panel {
+  border: 1px solid var(--crm-c-gray-300);
+  margin: 0;
+}
+.crm-search .crm-search-admin-outer .crm-flex-4.panel .panel-body {
+  border-radius: var(--crm-roundness);
+  background: var(--crm-tab-bg-active);
+  height: 100%;
+}
+
+/* Tab: Filter Conditions */
+
+.crm-search fieldset div.api4-input {
+  margin-bottom: var(--crm-m);
+}
+.crm-search .api4-clause-badge {
+  width: 8ch;
+  display: inline-block;
+  cursor: move;
+  font-size: var(--crm-input-font-size);
+}
+.crm-search .api4-clause-badge .badge {
+  opacity: .5;
+  position: relative;
+}
+.crm-search .api4-clause-badge .caret {
+  margin: 0;
+}
+
+/* Fieldsets */
+
+.crm-container .crm-search fieldset {
+  padding: var(--crm-s);
+  border-top: var(--crm-c-divider);
+  margin-block: var(--crm-s);
+  border-radius: var(--crm-roundness);
+}
+.crm-search fieldset fieldset {
+  padding-top: 0;
+  border: var(--crm-c-divider);
+  border-width: 0 1px 1px 1px;
+}
+.crm-search fieldset legend {
+  font-size: inherit;
+  margin: 0;
+  width: auto;
+  border: 0;
+  padding: 0;
+  text-transform: none;
+}
+/* Icon only shown while dragging */
+.crm-search .api4-clause-badge .crm-i {
+  display: none;
+  padding: 0 var(--crm-s2);
+}
+.crm-search .ui-sortable-helper .api4-clause-badge .badge span {
+  display: none;
+}
+.crm-search .ui-sortable-helper .api4-clause-badge .crm-i {
+  display: inline-block;
+}
+.crm-search .api4-operator {
+  width: 235px;
+}
+.crm-search .crm-search-admin-relative .api4-clause-group-sortable {
+  margin: var(--crm-r) 0;
+}
+/* Tab: Select Fields */
+
+.crm-search fieldset.crm-draggable {
+  background-color: var(--crm-c-drag-background);
+  border-radius: var(--crm-roundness);
+  border: 0 solid transparent;
+}
+
+/* Tab: Configure Settings */
+
+.crm-search .crm-search-admin-relative textarea {
+  width: 100%;
+  min-height: 100px;
+}
+.crm-search .input-group-addon:has(.fa-calendar-times-o) {
+  width: auto;
+}
+/* Tab: display */
+
+.crm-search .crm-search-admin-relative details > fieldset {
+  padding: 0;
+  border: 0 solid transparent;
+}
+.crm-search .crm-search-admin-relative details > fieldset .form-inline:not(td) {
+  padding: var(--crm-padding-small) var(--crm-padding-reg);
+}
+.crm-search .crm-search-admin-relative details > fieldset fieldset,
+.crm-search crm-search-admin-display fieldset .form-inline > fieldset {
+  margin: 0;
+  padding: 0;
+  border: 0 solid transparent;
+}
+.crm-search-admin-edit-columns fieldset.crm-draggable {
+  display: grid;
+  grid-template-columns: 2ch auto;
+}
+#bootstrap-theme .crm-search-admin-edit-columns fieldset.crm-draggable .btn.btn-xs.pull-right {
+  line-height: 1.45rem;
+  display: block;
+  z-index: 1;
+  position: absolute;
+  right: 15px;
+}
+i.crm-i.crm-search-move-icon {
+  opacity: .5;
+  margin-top: 0.5rem;
+}
+.crm-draggable details > *,
+.crm-draggable details > .form-inline {
+  padding-inline: var(--crm-expand-body-padding);
+}
+.crm-draggable details > div:first-of-type {
+  padding-top: var(--crm-expand-body-padding);
+}
+.crm-draggable details > div:last-of-type {
+  padding-bottom: var(--crm-expand-body-padding);
+}
+.crm-search-admin-edit-columns .input-group-btn {
+  display: flex;
+  flex-direction: row;
+}
+.crm-search-admin-edit-columns .crm-draggable > td {
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.crm-search-admin-edit-columns .crm-draggable > td input {
+  max-width: 125px;
+}
+.crm-search-admin-edit-columns .crm-draggable > td.form-inline {
+  font-size: 0;
+  padding-right: var(--crm-s);
+}
+.crm-search-admin-edit-columns .crm-draggable tfoot td.form-inline {
+  padding: var(--crm-padding-reg);
+}
+.crm-search-admin-relative {
+  position: relative;
+  display: block;
+}
+.crm-search .crm-search-admin-relative details > summary {
+  background: var(--crm-expand-header2-bg);
+  color: var(--crm-expand-header2-color);
+  padding: var(--crm-padding-small) var(--crm-padding-reg);
+}
+.crm-search crm-search-admin-link-group {
+  background: var(--crm-c-background2);
+}
+.crm-search crm-search-admin-link-group table {
+  margin: var(--crm-padding-reg);
+  max-width: calc(100% - var(--crm-padding-reg) - var(--crm-padding-reg));
+  box-shadow: none;
+}
+.crm-search-admin-edit-columns {
+  padding: 0;
+  border: 0 solid transparent;
+}
+.crm-search-admin-edit-columns details,
+.crm-search .crm-search-admin-relative details {
+  background-color: var(--crm-c-page-background);
+  border-radius: var(--crm-roundness);
+  border: 0;
+}
+.crm-search-admin-edit-columns details > summary {
+  background: var(--crm-expand-header2-bg);
+  color: var(--crm-expand-header2-color);
+  padding: var(--crm-padding-reg);
+  font-size: inherit;
+}
+.crm-search details label {
+  min-width: var(--crm-input-label-width);
+}
+.crm-search details label:has(~ a.helpicon) {
+  min-width: calc(var(--crm-input-label-width) - 19px);
+}
+/* Various */
+
+.crm-search .help-block.bg-warning {
+  padding: var(--crm-padding-reg);
+}
+.crm-search .form-control.huge {
+  width: var(--crm-big-input);
+}
+/* Style expires_date date/time width */
+.crm-search #expires_date + input,
+.crm-search #expires_date + input + input {
+  width: calc(100% - 30px);
+}
+/* Hide time field if date & time are both empty */
+.crm-search #expires_date + input:placeholder-shown + input:placeholder-shown {
+  display: none;
+}
+.crm-search div.form-control.disabled,
+.crm-search div.form-control.disabled * {
+  cursor: not-allowed;
+}
+.crm-search input.ng-invalid::placeholder {
+  color: var(--crm-c-warning);
+}
+#bootstrap-theme.crm-search crm-search-clause > .btn-group {
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+.crm-search fieldset div.api4-input.ui-sortable-helper {
+  background-color: rgba(255, 255, 255, .9);
+}
+.crm-search fieldset div.api4-input.ui-sortable-helper {
+  background-color: rgba(255, 255, 255, .9);
+}
+.crm-search .api4-clause-fieldset fieldset {
+  float: right;
+  width: calc(100% - 58px);
+  margin-top: -8px;
+}
+.crm-search .api4-clause-fieldset.api4-sorting fieldset .api4-clause-group-sortable {
+  min-height: 3.5em;
+}
+.crm-search .form-control label,
+.crm-search legend[ng-click] {
+  cursor: var(--crm-hover-clickable);
+}
+.crm-search .api4-input-group {
+  display: inline-block;
+}
+.crm-draggable:hover > i.crm-i.crm-search-move-icon,
+.crm-draggable:hover > * > i.crm-i.crm-search-move-icon {
+  opacity: 1;
+}
+.crm-search input[type=number] {
+  width: 90px;
+}
+/* For display.settings.limit field */
+.crm-search .checkbox-inline.form-control input[type=number] {
+  position: relative;
+  top: -5px;
+  right: -9px;
+  vertical-align: top;
+}
+.crm-search .api4-add-where-group-menu {
+  min-width: 80px;
+  background-color: rgba(186, 225, 251, 0.94);
+}
+.crm-search .api4-add-where-group-menu a {
+  padding: var(--crm-s) var(--crm-m);
+}
+#bootstrap-theme.crm-search .btn.form-control {
+  height: 36px;
+}
+.crm-search-admin-edit-columns {
+  height: 100%;
+}
+.crm-search-admin-edit-columns > fieldset {
+  background-color: rgba(255, 255, 255, .8);
+}
+.crm-search-admin-flex-row {
+  display: flex;
+  align-items: center;
+  column-gap: var(--crm-s3);
+}
+.crm-search-admin-unused-columns fieldset {
+  min-height: 60px;
+}
+.crm-search .crm-editable-enabled {
+  display: inline-block;
+  padding: 0 4px !important;
+  border: 2px solid transparent !important;
+  min-width: 21px;
+}
+.crm-search .crm-editable-enabled:hover:not(:focus) {
+  border: 2px dashed grey !important;
+}
+.crm-search-admin-icon-col {
+  width: 24px;
+}
+tbody .crm-search-admin-icon-col {
+  text-align: center;
+}
+.crm-search-admin-tag-color {
+  display: inline-block;
+  width: 12px;
+  height: 12px;
+  border: 1px solid lightgrey;
+  border-radius: 5px;
+}
+crm-search-admin-tags.btn-group-xs .crm-search-admin-tags-btn-label {
+  display: none;
+}
+/* .dropdown-menu li > * > label {
+    font-weight: normal;
+    cursor: var(--crm-hover-clickable);
+} */
+.crm-container .crm-container .dropdown-menu li .form-inline > select {
+  max-width: 120px;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+.crm-container li .form-inline input[type=color] {
+  width: 30px;
+  padding: 2px 4px;
+}
+button.crm-search-admin-combo-button {
+  min-width: 200px;
+  text-align: left;
+}
+crm-search-admin-export,
+crm-search-admin-import {
+  display: block;
+}
+.crm-search-admin-right {
+  position: absolute;
+  top: 1px;
+  right: 0;
+  background-color: white;
+}
diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplay.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplay.css
new file mode 100644
index 0000000000000000000000000000000000000000..2ff3a721ca1e54b257b3c10bd4b0e7631bd9abff
--- /dev/null
+++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplay.css
@@ -0,0 +1,77 @@
+/* Style rules for SearchKit Admin
+   Forked on 19 July 24. Called on SearchKit pages
+   Status: merged */
+
+/* Sortable headers */
+.crm-search-display th.crm-sortable-col {
+  cursor: var(--crm-hover-clickable);
+  white-space: nowrap;
+}
+.crm-search-display th.crm-sortable-col span {
+  white-space: break-spaces;
+  word-wrap: initial;
+}
+.crm-search-display th i.fa-sort-desc,
+.crm-search-display th i.fa-sort-asc {
+  color: var(--crm-c-primary);
+}
+.crm-search-display th:not(:hover) i.fa-sort {
+  opacity: .5;
+}
+.crm-search input.ng-invalid,
+.crm-search-display input.ng-invalid,
+.crm-search-task-dialog input.ng-invalid {
+  border-color: var(--crm-c-warning);
+}
+#crm-search-results-page-size {
+  width: 60px;
+}
+.crm-search-display button.dropdown-toggle {
+  white-space: nowrap;
+  font-size: var(--crm-font-size);
+}
+
+/* Loading placeholders */
+.crm-search-loading-placeholder {
+  height: 2em;
+  width: 80%;
+  position: relative;
+  overflow: hidden;
+  background-color: rgba(0,0,0,.03);
+  display: inline-block;
+}
+.crm-search-loading-placeholder::before {
+  content: '';
+  display: block;
+  position: absolute;
+  left: -150px;
+  top: 0;
+  height: 100%;
+  width: 150px;
+  background: linear-gradient(to right, transparent 0%, rgba(0,0,0,.05) 50%, transparent 100%);
+  animation: searchKitLoadingAnimation 1s cubic-bezier(0.4, 0.0, 0.2, 1) infinite;
+}
+@keyframes searchKitLoadingAnimation {
+  from {
+    left: -150px;
+  }
+  to {
+    left: 100%;
+  }
+}
+.crm-search-display ul.pagination > li {
+  margin: 0;
+}
+
+/* Contact page */
+
+#mainTabContainer .crm-search-display .form-group.pull-right,
+#bootstrap-theme .afform-directive .btn-group.pull-right {
+  display: flex;
+  gap: var(--crm-flex-gap);
+  justify-content: end;
+  float: inherit;
+}
+.crm-contact-page .crm-search-display-pager {
+  padding: 0 var(--crm-r) var(--crm-r) var(--crm-r);
+}
diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayGrid.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayGrid.css
new file mode 100644
index 0000000000000000000000000000000000000000..04dc1b15ba92cfa329489ed2c5451bc1a0ee9256
--- /dev/null
+++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayGrid.css
@@ -0,0 +1,23 @@
+/* Style rules for SearchKit Admin
+   Forked on 19 July 24. Called on SearchKit pages
+   Status: merged */
+
+/* SearchKit grid layout styling */
+.crm-search-display-grid-container {
+  display: grid;
+  grid-gap: var(--crm-flex-gap);
+  align-items: center;
+  justify-items: center;
+}
+.crm-search-display-grid-layout-2 {
+  grid-template-columns: repeat(2, 1fr);
+}
+.crm-search-display-grid-layout-3 {
+  grid-template-columns: repeat(3, 1fr);
+}
+.crm-search-display-grid-layout-4 {
+  grid-template-columns: repeat(4, 1fr);
+}
+.crm-search-display-grid-layout-5 {
+  grid-template-columns: repeat(5, 1fr);
+}
diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayTable.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayTable.css
new file mode 100644
index 0000000000000000000000000000000000000000..20240e71d9e09be3ca0787af9a35a7e4c788365a
--- /dev/null
+++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayTable.css
@@ -0,0 +1,54 @@
+/* Style rules for SearchKit Admin
+   Forked on 19 July 24. Called on SearchKit Admin pages
+   Status: merged */
+
+table.crm-sticky-header > thead > tr {
+  position: sticky !important;
+  top: var(--crm-menubar-bottom, 0px);
+  z-index: 2;
+}
+.crm-search-display-table > table.table > thead > tr > th.crm-search-result-select {
+  padding-inline: 0;
+  text-transform: none;
+  color: initial;
+  min-width: 95px; /* Don't allow button to be split on 2 lines */
+}
+.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon + .crm-search-display-table-column-label {
+  margin-left: 0 !important;
+}
+.crm-search-display.crm-search-display-table tfoot > tr > td {
+  font-weight: bold;
+  font-family: var(--crm-font-bold);
+}
+
+/* Afform tables */
+.crm-container td.crm-search-col-type-buttons {
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--crm-s);
+}
+td.crm-search-col-type-buttons.text-right {
+  flex-direction: row-reverse;
+}
+#bootstrap-theme th.crm-search-result-select button.btn {
+  background: transparent;
+  padding: var(--crm-xs1) var(--crm-m1);
+}
+#bootstrap-theme th.crm-search-result-select button.btn:hover,
+#bootstrap-theme th.crm-search-result-select button.btn:focus {
+  background: transparent;
+}
+#bootstrap-theme th.crm-search-result-select button.btn i.crm-i {
+  color: var(--crm-c-text);
+  min-width: fit-content;
+  padding: 0;
+}
+/* #bootstrap-theme th.crm-search-result-select button.btn.dropdown-toggle {
+  border-radius: var(--crm-roundness);
+  background-color: var(--crm-c-background4);
+  padding: var(--crm-xs1) var(--crm-m1);
+} */
+.crm-search-display-table table {
+  border: var(--crm-table-outside-border);
+  box-shadow: var(--crm-block-shadow);
+}
diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchTasks.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchTasks.css
new file mode 100644
index 0000000000000000000000000000000000000000..8d5ce7e5e2101eee57fd8e50ec5c68477bbb30e3
--- /dev/null
+++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchTasks.css
@@ -0,0 +1,21 @@
+/* Style rules for SearchKit Admin
+   Forked on 12 June 24. Called on SearchKit Admin pages
+   Status: not merged (theme edits at foot) */
+
+.crm-search-task-progress {
+  padding: 10px;
+  margin-top: 10px;
+  border: 1px solid lightgrey;
+}
+.crm-search-display.crm-search-display-table td > crm-search-display-editable,
+.crm-search-display.crm-search-display-table td > .crm-editable-disabled,
+.crm-search-display.crm-search-display-table td > .crm-editable-enabled {
+  display: inline-block;
+}
+crm-search-display-editable .form-inline,
+.crm-dashlet .crm-search-display crm-search-display-editable .form-inline {
+  padding: 0;
+}
+.crm-search-display-editable-buttons button {
+  padding: var(--crm-padding-small) !important;
+}
diff --git a/civicrm/ext/riverlea/fonts/inter-v18-latin-600.woff2 b/civicrm/ext/riverlea/fonts/inter-v18-latin-600.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..fb50a02b2af82000d87d8c8b8161aa254b3b1593
Binary files /dev/null and b/civicrm/ext/riverlea/fonts/inter-v18-latin-600.woff2 differ
diff --git a/civicrm/ext/riverlea/fonts/inter-v18-latin-italic.woff2 b/civicrm/ext/riverlea/fonts/inter-v18-latin-italic.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..ec07ef7dd6bb53bcbdeeb5da6a9b468d1bb191c5
Binary files /dev/null and b/civicrm/ext/riverlea/fonts/inter-v18-latin-italic.woff2 differ
diff --git a/civicrm/ext/riverlea/fonts/inter-v18-latin-regular.woff2 b/civicrm/ext/riverlea/fonts/inter-v18-latin-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..33002f12853a3d37d7b7eba39623fae3bca94a3b
Binary files /dev/null and b/civicrm/ext/riverlea/fonts/inter-v18-latin-regular.woff2 differ
diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-700.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-700.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..11de83feaf0fb872c91fce89534fd4e2d8bbda28
Binary files /dev/null and b/civicrm/ext/riverlea/fonts/lato-v24-latin-700.woff2 differ
diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-700italic.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-700italic.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..38df58bff44c1b7ff9ff6a1efda725a10ca4cb93
Binary files /dev/null and b/civicrm/ext/riverlea/fonts/lato-v24-latin-700italic.woff2 differ
diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-italic.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-italic.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..851630ff85699de633f37170f29cbadce3d322ab
Binary files /dev/null and b/civicrm/ext/riverlea/fonts/lato-v24-latin-italic.woff2 differ
diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-regular.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..ff60934dd0ea9cdd93f961d2dfd1e158357f2a77
Binary files /dev/null and b/civicrm/ext/riverlea/fonts/lato-v24-latin-regular.woff2 differ
diff --git a/civicrm/ext/riverlea/info.xml b/civicrm/ext/riverlea/info.xml
new file mode 100755
index 0000000000000000000000000000000000000000..6e225c764777d4dff2283e837c873b96cbd546b0
--- /dev/null
+++ b/civicrm/ext/riverlea/info.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<extension key="riverlea" type="module">
+  <file>riverlea</file>
+  <name>RiverLea CiviCRM Theme Framework</name>
+  <description>CiviCRM Theme package with CSS Variable defined variations ('streams'). Includes Minetta (~Greenwich), Walbrook (~Shoreditch), HackneyBrook (~Finsbury Park), Thames (~Aah).</description>
+  <license>AGPL-3.0</license>
+  <maintainer>
+    <author>Nicol Wistreich</author>
+  </maintainer>
+  <urls>
+    <url desc="Main Extension Page">https://lab.civicrm.org/extensions/riverlea</url>
+    <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
+  </urls>
+  <releaseDate>[civicrm.releaseDate]</releaseDate>
+  <version>[civicrm.version]</version>
+  <develStage>stable</develStage>
+  <compatibility>
+    <ver>[civicrm.majorVersion]</ver>
+  </compatibility>
+  <comments>A cross-CMS CiviCRM theme framework.</comments>
+  <classloader>
+    <psr4 prefix="Civi\" path="Civi"/>
+  </classloader>
+  <civix>
+    <namespace>CRM/riverlea</namespace>
+    <format>23.02.1</format>
+  </civix>
+  <mixins>
+    <mixin>theme-php@1.0.0</mixin>
+    <mixin>setting-php@1.0.0</mixin>
+    <mixin>setting-admin@1.0.1</mixin>
+    <mixin>mgd-php@1.0.0</mixin>
+    <mixin>scan-classes@1.0.0</mixin>
+  </mixins>
+</extension>
diff --git a/civicrm/ext/riverlea/managed/navigationmenu.mgd.php b/civicrm/ext/riverlea/managed/navigationmenu.mgd.php
new file mode 100644
index 0000000000000000000000000000000000000000..edf3e0d1cd542bfd048d6bb6df42599504282095
--- /dev/null
+++ b/civicrm/ext/riverlea/managed/navigationmenu.mgd.php
@@ -0,0 +1,27 @@
+<?php
+
+use CRM_riverlea_ExtensionUtil as E;
+
+return [
+    [
+      'name' => 'riverlea_settings',
+      'entity' => 'Navigation',
+      'cleanup' => 'always',
+      'update' => 'unmodified',
+      'params' => [
+        'version' => 4,
+        'values' => [
+          'label' => E::ts('Riverlea Settings'),
+          'name' => 'riverlea_settings',
+          'url' => 'civicrm/admin/setting/riverlea',
+          'permission' => 'administer Riverlea',
+          'permission_operator' => 'OR',
+          'parent_id.name' => 'Customize Data and Screens',
+          'is_active' => TRUE,
+          'has_separator' => 0,
+          'weight' => 90,
+        ],
+        'match' => ['name'],
+      ],
+    ],
+];
diff --git a/civicrm/ext/riverlea/riverlea.civix.php b/civicrm/ext/riverlea/riverlea.civix.php
new file mode 100755
index 0000000000000000000000000000000000000000..01dd89c91247399cfa4a72670c9f2d35d6a5b1fd
--- /dev/null
+++ b/civicrm/ext/riverlea/riverlea.civix.php
@@ -0,0 +1,200 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+
+/**
+ * The ExtensionUtil class provides small stubs for accessing resources of this
+ * extension.
+ */
+class CRM_riverlea_ExtensionUtil {
+  const SHORT_NAME = 'riverlea';
+  const LONG_NAME = 'riverlea';
+  const CLASS_PREFIX = 'CRM_riverlea';
+
+  /**
+   * Translate a string using the extension's domain.
+   *
+   * If the extension doesn't have a specific translation
+   * for the string, fallback to the default translations.
+   *
+   * @param string $text
+   *   Canonical message text (generally en_US).
+   * @param array $params
+   * @return string
+   *   Translated text.
+   * @see ts
+   */
+  public static function ts($text, $params = []): string {
+    if (!array_key_exists('domain', $params)) {
+      $params['domain'] = [self::LONG_NAME, NULL];
+    }
+    return ts($text, $params);
+  }
+
+  /**
+   * Get the URL of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo'.
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function url($file = NULL): string {
+    if ($file === NULL) {
+      return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
+    }
+    return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
+  }
+
+  /**
+   * Get the path of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function path($file = NULL) {
+    // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
+    return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
+  }
+
+  /**
+   * Get the name of a class within this extension.
+   *
+   * @param string $suffix
+   *   Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
+   * @return string
+   *   Ex: 'CRM_Foo_Page_HelloWorld'.
+   */
+  public static function findClass($suffix) {
+    return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
+  }
+
+}
+
+use CRM_riverlea_ExtensionUtil as E;
+
+/**
+ * (Delegated) Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
+ */
+function _riverlea_civix_civicrm_config($config = NULL) {
+  static $configured = FALSE;
+  if ($configured) {
+    return;
+  }
+  $configured = TRUE;
+
+  $extRoot = __DIR__ . DIRECTORY_SEPARATOR;
+  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+  set_include_path($include_path);
+  // Based on <compatibility>, this does not currently require mixin/polyfill.php.
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function _riverlea_civix_civicrm_install() {
+  _riverlea_civix_civicrm_config();
+  // Based on <compatibility>, this does not currently require mixin/polyfill.php.
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function _riverlea_civix_civicrm_enable(): void {
+  _riverlea_civix_civicrm_config();
+  // Based on <compatibility>, this does not currently require mixin/polyfill.php.
+}
+
+/**
+ * Inserts a navigation menu item at a given place in the hierarchy.
+ *
+ * @param array $menu - menu hierarchy
+ * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
+ *    'Mailing', or 'Administer/System Settings'
+ * @param array $item - the item to insert (parent/child attributes will be
+ *    filled for you)
+ *
+ * @return bool
+ */
+function _riverlea_civix_insert_navigation_menu(&$menu, $path, $item) {
+  // If we are done going down the path, insert menu
+  if (empty($path)) {
+    $menu[] = [
+      'attributes' => array_merge([
+        'label' => $item['name'] ?? NULL,
+        'active' => 1,
+      ], $item),
+    ];
+    return TRUE;
+  }
+  else {
+    // Find an recurse into the next level down
+    $found = FALSE;
+    $path = explode('/', $path);
+    $first = array_shift($path);
+    foreach ($menu as $key => &$entry) {
+      if ($entry['attributes']['name'] == $first) {
+        if (!isset($entry['child'])) {
+          $entry['child'] = [];
+        }
+        $found = _riverlea_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
+      }
+    }
+    return $found;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_navigationMenu().
+ */
+function _riverlea_civix_navigationMenu(&$nodes) {
+  if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
+    _riverlea_civix_fixNavigationMenu($nodes);
+  }
+}
+
+/**
+ * Given a navigation menu, generate navIDs for any items which are
+ * missing them.
+ */
+function _riverlea_civix_fixNavigationMenu(&$nodes) {
+  $maxNavID = 1;
+  array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
+    if ($key === 'navID') {
+      $maxNavID = max($maxNavID, $item);
+    }
+  });
+  _riverlea_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
+}
+
+function _riverlea_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
+  $origKeys = array_keys($nodes);
+  foreach ($origKeys as $origKey) {
+    if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
+      $nodes[$origKey]['attributes']['parentID'] = $parentID;
+    }
+    // If no navID, then assign navID and fix key.
+    if (!isset($nodes[$origKey]['attributes']['navID'])) {
+      $newKey = ++$maxNavID;
+      $nodes[$origKey]['attributes']['navID'] = $newKey;
+      $nodes[$newKey] = $nodes[$origKey];
+      unset($nodes[$origKey]);
+      $origKey = $newKey;
+    }
+    if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
+      _riverlea_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
+    }
+  }
+}
diff --git a/civicrm/ext/riverlea/riverlea.php b/civicrm/ext/riverlea/riverlea.php
new file mode 100755
index 0000000000000000000000000000000000000000..f126e288c6f9628a6b15b2932674c7f0c355d76a
--- /dev/null
+++ b/civicrm/ext/riverlea/riverlea.php
@@ -0,0 +1,101 @@
+<?php
+
+require_once 'riverlea.civix.php';
+use CRM_riverlea_ExtensionUtil as E;
+
+/**
+ * Supports multiple theme variations/streams.
+ */
+function riverlea_civicrm_themes(&$themes) {
+  $themes['minetta'] = array(
+    'ext' => 'riverlea',
+    'title' => 'Minetta (RiverLea ~Greenwich)',
+    'prefix' => 'streams/minetta/',
+    'search_order' => array('minetta', '_riverlea_core_', '_fallback_'),
+  );
+  $themes['walbrook'] = array(
+    'ext' => 'riverlea',
+    'title' => 'Walbrook (RiverLea ~Shoreditch/Island)',
+    'prefix' => 'streams/walbrook/',
+    'search_order' => array('walbrook', '_riverlea_core_', '_fallback_'),
+  );
+  $themes['hackneybrook'] = array(
+    'ext' => 'riverlea',
+    'title' => 'Hackney Brook (RiverLea ~Finsbury Park)',
+    'prefix' => 'streams/hackneybrook/',
+    'search_order' => array('hackneybrook', '_riverlea_core_', '_fallback_'),
+  );
+  $themes['thames'] = array(
+    'ext' => 'riverlea',
+    'title' => 'Thames (RiverLea ~Aah)',
+    'prefix' => 'streams/thames/',
+    'search_order' => array('thames', '_riverlea_core_', '_fallback_'),
+  );
+  $themes['_riverlea_core_'] = array(
+    'ext' => 'riverlea',
+    'title' => 'Riverlea: base theme',
+    'prefix' => 'core/',
+    'search_order' => array('_riverlea_core_', '_fallback_'),
+  );
+}
+
+/**
+ * Check if current active theme is a Riverlea theme
+ * @return bool
+ */
+function _riverlea_is_active() {
+  $themeKey = Civi::service('themes')->getActiveThemeKey();
+  $themeExt = Civi::service('themes')->get($themeKey)['ext'];
+  return ($themeExt === 'riverlea');
+}
+
+function riverlea_civicrm_config(&$config) {
+  _riverlea_civix_civicrm_config($config);
+}
+
+/**
+ * Implements hook_civicrm_alterBundle().
+ *
+ * Add Bootstrap JS.
+ */
+function riverlea_civicrm_alterBundle(CRM_Core_Resources_Bundle $bundle) {
+  if (!_riverlea_is_active()) {
+    return;
+  }
+
+  if ($bundle->name === 'bootstrap3') {
+    $bundle->clear();
+    $bundle->addStyleFile('riverlea', 'core/css/_bootstrap.css');
+    $bundle->addScriptFile('greenwich', 'extern/bootstrap3/assets/javascripts/bootstrap.min.js', [
+      'translate' => FALSE,
+    ]);
+    $bundle->addScriptFile('greenwich', 'js/noConflict.js', [
+      'translate' => FALSE,
+    ]);
+  }
+  if ($bundle->name === 'coreResources') {
+    // get DynamicCss asset
+    $bundle->addStyleUrl(\Civi::service('asset_builder')->getUrl(
+      \Civi\riverlea\DynamicCss::CSS_FILE,
+      \Civi\riverlea\DynamicCss::getCssParams()
+    ));
+  }
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function riverlea_civicrm_install() {
+  _riverlea_civix_civicrm_install();
+}
+
+/**
+ * Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function riverlea_civicrm_enable() {
+  _riverlea_civix_civicrm_enable();
+}
diff --git a/civicrm/ext/riverlea/settings/riverlea.setting.php b/civicrm/ext/riverlea/settings/riverlea.setting.php
new file mode 100644
index 0000000000000000000000000000000000000000..038c3134ad51d770b573b236bf2c13a40db89076
--- /dev/null
+++ b/civicrm/ext/riverlea/settings/riverlea.setting.php
@@ -0,0 +1,50 @@
+<?php
+
+use CRM_riverlea_ExtensionUtil as E;
+
+return [
+  'riverlea_dark_mode_backend' => [
+    'name' => 'riverlea_dark_mode_backend',
+    'group' => 'riverlea',
+    'type' => 'String',
+    'default' => 'inherit',
+    'html_type' => 'select',
+    'add' => 1.0,
+    'title' => E::ts('Backend Dark Mode Control'),
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'description' => E::ts('Control whether and how dark mode can be activated on backend pages (for supported Riverlea themes only)'),
+    'options' => [
+      'inherit' => E::ts('Inherit from browser/OS'),
+      'light' => E::ts('Always use light mode'),
+      'dark' => E::ts('Always use dark mode'),
+    ],
+    'settings_pages' => [
+      'riverlea' => ['weight' => 100],
+      // show alongside backend theme selector on Display settings page
+      'display' => ['weight' => 900],
+    ],
+  ],
+  'riverlea_dark_mode_frontend' => [
+    'name' => 'riverlea_dark_mode_frontend',
+    'group' => 'riverlea',
+    'type' => 'String',
+    'default' => 'inherit',
+    'html_type' => 'select',
+    'add' => 1.0,
+    'title' => E::ts('Frontend Dark Mode Control'),
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'description' => E::ts('Control whether and how dark mode can be activated on frontend pages (for supported Riverlea themes only)'),
+    'options' => [
+      'inherit' => E::ts('Inherit from browser/OS'),
+      'light' => E::ts('Always use light mode'),
+      'dark' => E::ts('Always use dark mode'),
+    ],
+    'settings_pages' => [
+      'riverlea' => ['weight' => 110],
+      // show alongside frontend theme selector on Display settings page
+      'display' => ['weight' => 950],
+    ],
+  ],
+];
diff --git a/civicrm/ext/riverlea/streams/empty/css/_dark.css b/civicrm/ext/riverlea/streams/empty/css/_dark.css
new file mode 100644
index 0000000000000000000000000000000000000000..e1cf0c2bf3b97e959fc5194be5ad6daaf802bc22
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/empty/css/_dark.css
@@ -0,0 +1,63 @@
+/* Empty dark mode settings */
+:root {
+  --crm-c-text: #fff;
+  --crm-c-link: var(--crm-c-teal);
+  --crm-c-link-hover: var(--crm-c-yellow);
+  --crm-c-text-light: var(--crm-c-darkest);
+  --crm-c-background: var(--crm-c-gray-900);
+  --crm-c-page-background: var(--crm-c-gray-900);
+  --crm-c-background2: var(--crm-c-gray-800);
+  --crm-c-background3: var(--crm-c-gray-700);
+  --crm-c-background4: var(--crm-c-gray-600);
+  --crm-c-code-background: var(--crm-c-gray-200);
+  --crm-c-success: #58a458;
+  --crm-red-alert: #b24b4f;
+  --crm-c-alert: #ff899a;
+  --crm-blue-info: #2c99a4;
+  --crm-c-green-light: #468847;
+  --crm-c-green: #55aa57;
+  --crm-c-green-dark: #dff0d8;
+  --crm-c-gray-700: #535252;
+  --crm-c-gray-600: #67676a;
+  --crm-c-gray-500: #6c6c6c;
+  --crm-c-divider: 1px solid var(--crm-c-gray-500);
+  /* And others */
+  --crm-block-shadow: 0;
+  --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0);
+  --crm-heading-bg: var(--crm-c-blue-dark);
+  --crm-dashlet-bg: var(--crm-c-background2);
+  --crm-dashlet-header-bg: var(--crm-c-background3);
+  --crm-expand-header-bg: var(--crm-c-background4);
+  --crm-expand-body-bg: var(--crm-c-background3);
+  --crm-dash-header-bg: transparent;
+  --crm-dash-block-bg: var(--crm-c-background2);
+  --crm-dash-label-bg: transparent;
+  --crm-dash-panel-bg: var(--crm-c-background3);
+  --crm-dropdown-bg: var(--crm-c-background);
+  --crm-dropdown-2-bg: var(--crm-c-background);
+  --crm-tabs-border: 1px solid var(--crm-c-gray-500);
+  --crm-tabs-bg: var(--crm-c-background3);
+  --crm-table-outside-border: 1px solid var(--crm-c-gray-500);
+  --crm-table-row-border: 1px solid var(--crm-c-gray-500);
+  --crm-panel-border-col: var(--crm-c-gray-500);
+  --crm-input-border-color: var(--crm-c-gray-500);
+  --crm-table-odd-row: var(--crm-c-gray-800);
+  --crm-table-odd-hover: var(--crm-c-gray-700);
+  --crm-table-even-row: var(--crm-c-gray-700);
+  --crm-table-even-hover: var(--crm-c-gray-600);
+  --crm-alert-text-help: var(--crm-c-text-light);
+  --crm-alert-text-warning: var(--crm-c-text-light);
+  --crm-alert-background-info: var(--crm-c-blue-dark);
+  --crm-alert-text-info: var(--crm-c-blue-light);
+  --crm-c-inactive: var(--crm-c-gray-400);
+  --crm-input-color: var(--crm-c-text);
+  --crm-input-description: var(--crm-c-gray-300);
+  --crm-checkbox-list-col: var(--crm-c-text-light);
+  --crm-alert-text-help: var(--crm-c-text);
+  --crm-dialog-header-border-col: transparent;
+  --crm-dialog-header-bg: var(--crm-c-background2);
+  --crm-dialog-body-bg: var(--crm-c-background2);
+  --crm-notify-background: var(--crm-c-darkest);
+  --crm-wizard-active-bg: var(--crm-c-dark-teal);
+  --crm-form-block-background: var(--crm-c-background2);
+}
diff --git a/civicrm/ext/riverlea/streams/empty/css/_variables.css b/civicrm/ext/riverlea/streams/empty/css/_variables.css
new file mode 100644
index 0000000000000000000000000000000000000000..7324d49d6fd1ed14a34ed7f25603a645f40f9907
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/empty/css/_variables.css
@@ -0,0 +1,431 @@
+/*
+    Name: Empty stream;
+    Description: duplicate this to create a new stream;
+    Riverlea version: 1.1.0;
+*/
+
+:root {
+  --crm-version: 'Empty, v' var(--crm-release);
+/* Fonts *
+--crm-system-fonts:;
+--crm-font:;
+--crm-font-bold:;
+--crm-font-italic:;
+--crm-font-bold-italic:;
+/* Colour names *
+--crm-c-darkest: #0a0a0a;
+--crm-c-gray-900: #2f2f2e;
+--crm-c-gray-800: #3e3e3e;
+--crm-c-gray-700: #696969;
+--crm-c-gray-600: #828388;
+--crm-c-gray-500: #919297;
+--crm-c-gray-400: #adaeb3;
+--crm-c-gray-300: #c2c0c0;
+--crm-c-gray-200: #d5d5d5;
+--crm-c-gray-100: #e2e1e1;
+--crm-c-gray-050: #eaeaea;
+--crm-c-gray-025: #fbfafa;
+--crm-c-blue: #bce8f1;
+--crm-c-blue-light: #d9edf7;
+--crm-c-blue-dark: #297292;
+--crm-c-blue-darker: #215c76;
+--crm-c-purple: #4d4d69;
+--crm-c-purple-dark: #3e3e54;
+--crm-c-green: #d6e9c6;
+--crm-c-green-light: #dff0d8;
+--crm-c-green-dark: #468847;
+--crm-c-red: #eed3d7;
+--crm-c-red-light: #f2dede;
+--crm-c-red-dark: #b94a48 ;
+--crm-c-amber: #dd5600;
+--crm-c-amber-light: #fbf0e2;
+--crm-c-yellow: #fcfc5a;
+--crm-c-yellow-light: #ffffcc;
+--crm-c-yellow-less-light: #fffdb2;
+--crm-c-teal: #63c4b9;
+--crm-c-dark-teal: #3e8079;
+/* Practical colours *
+--crm-c-text: #464354;
+--crm-c-light-text: #fff;
+--crm-c-dark-text: var(--crm-c-text);
+--crm-c-link: var(--crm-c-blue-dark);
+--crm-c-link-hover: var(--crm-c-blue-darker);
+--crm-c-divider: 1px solid var(--crm-c-gray-300);
+--crm-c-page-background: #fff; /* background to page body *
+--crm-c-background: #f4f4ed; /* background to page header, often form block & dialog bg *
+--crm-c-background2: var(--crm-c-gray-050); /* 2-5 = progressively darker backgrounds *
+--crm-c-background3: var(--crm-c-gray-100);
+--crm-c-background4: var(--crm-c-gray-200);
+--crm-c-background5: var(--crm-c-gray-700);
+--crm-c-drag-background: var(--crm-c-background3); /* background for drag/drop regions, select2 highlight *
+--crm-c-code-background: var(--crm-c-background2); /* background for code regions *
+--crm-c-primary: var(--crm-c-gray-700);
+--crm-c-primary-hover: var(--crm-c-gray-800);
+--crm-c-primary-text: var(--crm-c-light-text);
+--crm-c-primary-hover-text: var(--crm-c-light-text);
+--crm-c-secondary: #5d677b;
+--crm-c-secondary-hover: #3e485b;
+--crm-c-secondary-text: var(--crm-c-light-text);
+--crm-c-secondary-hover-text: var(--crm-c-light-text);
+--crm-c-success: var(--crm-c-green-dark);
+--crm-c-success-text: var(--crm-c-light-text);
+--crm-c-alert: var(--crm-c-red-dark);
+--crm-c-alert-text: var(--crm-c-light-text);
+--crm-c-warning: var(--crm-c-amber);
+--crm-c-warning-text: var(--crm-c-light-text);
+--crm-c-info: var(--crm-c-blue-dark);
+--crm-c-info-text: var(--crm-c-light-text);
+--crm-c-focus: var(--crm-c-blue-dark);
+--crm-c-inactive: #696969;
+/* Shadows *
+--crm-block-shadow:;
+--crm-popup-shadow: 0 3px 18px 0 rgba(48,40,40,.25);
+--crm-bottom-shadow: 0 0 16px 1px rgba(0,0,0,.1);
+--crm-body-inset:;
+/* Sizes *
+--crm-roundness: 0.25rem;
+--crm-xs: 0.1rem;
+--crm-xs1: 0.125rem;
+--crm-xs2: 0.15rem;
+--crm-s: 0.25rem;
+--crm-s1: 0.275rem;
+--crm-s2: 0.325rem;
+--crm-s3: 0.375rem;
+--crm-m: 0.5rem;
+--crm-m1: 0.625rem;
+--crm-m2: 0.75rem;
+--crm-m3: 0.875rem;
+--crm-r: 1rem;
+--crm-r1: 1.125rem;
+--crm-r2: 1.25rem;
+--crm-r3: 1.375rem;
+--crm-r4: 1.5rem;
+--crm-l: 2rem;
+--crm-xl: 3rem;
+--crm-xxl: 4rem;
+--crm-big-input: 15em;
+--crm-huge-input: 25em;
+--crm-padding-reg: var(--crm-r);
+--crm-padding-small: var(--crm-s);
+--crm-padding-inset: var(--crm-m);
+--crm-page-padding: var(--crm-xl); /* Margin left/right *
+--crm-page-width: 100%; /* Default that CMS can overwrite *
+--crm-flex-gap: 0.5rem;
+/* Type *
+--crm-font-size: var(--crm-r);
+--crm-small-font-size: var(--crm-m2);
+--crm-type-line-height: 1.5;
+--crm-link-decoration: none;
+--crm-link-decoration-hover: underline;
+--crm-heading-bg: var(--crm-c-blue-light);
+--crm-heading-col: var(--crm-c-text);
+--crm-heading-padding: var(--crm-s1) var(--crm-m1);
+--crm-heading-margin: var(--crm-m) 0;
+--crm-heading-radius: var(--crm-roundness);
+/* Mouse events *
+--crm-hover-clickable: pointer;
+/* Buttons *
+--crm-btn-box-shadow: none;
+--crm-btn-border: 0 solid transparent;
+--crm-btn-txt-transform: inherit;
+--crm-btn-radius: 3px;
+--crm-btn-padding-block: var(--crm-xs1); /* padding for top and bottom, one value *
+--crm-btn-padding-inline: var(--crm-m1); /* padding for left and right, one value *
+--crm-btn-small-padding: var(--crm-xs) var(--crm-s);
+--crm-btn-large-padding: var(--crm-m) var(--crm-r);
+--crm-btn-align: center;
+--crm-btn-height: 28px;
+--crm-btn-icon-spacing: var(--crm-s);
+--crm-btn-icon-size: auto;
+--crm-btn-cancel-bg: var(--crm-c-alert);
+--crm-btn-cancel-text: var(--crm-c-alert-text);
+--crm-btn-info-bg: var(--crm-c-info);
+--crm-btn-info-text: var(--crm-c-info-text);
+--crm-btn-warning-bg: var(--crm-c-warning);
+--crm-btn-warning-text: var(--crm-c-warning-text);
+--crm-btn-success-bg: var(--crm-c-success);
+--crm-btn-success-text: var(--crm-c-success-text);
+--crm-btn-alert-bg: var(--crm-c-alert);
+--crm-btn-alert-text: var(--crm-c-alert-text);
+--crm-btn-icon-bg: ; /* btn-icon-* supports distinct border/bg for icons. If applied, set btn-icon-padding to 0px to make the icon bg stretch to the button *
+--crm-btn-icon-border: ;
+--crm-btn-icon-padding: var(--crm-btn-padding-block);
+--crm-btn-margin: 0; /* used to add padding block between multiple stacked buttons */
+/* Tables *
+--crm-table-outside-border: 1px solid var(--crm-c-background3);
+--crm-table-background: var(--crm-c-page-background);
+--crm-table-row-border: var(--crm-c-divider);
+--crm-table-column-border: 0 solid transparent;
+--crm-table-font-size: var(--crm-font-size);
+--crm-table-padding: var(--crm-m);
+--crm-table-header-border: 1px solid transparent;
+--crm-table-header-bottom: 2px solid var(--crm-c-gray-300);
+--crm-table-header-bg: var(--crm-c-page-background);
+--crm-table-header-col: var(--crm-c-text);
+--crm-table-header-txt: inherit;
+--crm-table-even-row: var(--crm-c-background2);
+--crm-table-even-hover: var(--crm-c-yellow-less-light);
+--crm-table-odd-row: var(--crm-c-gray-025);
+--crm-table-odd-hover: var(--crm-c-yellow-light);
+--crm-table-sort-col: var(--crm-c-gray-300);
+--crm-table-sort-float: left; /* 'left', 'right' or 'none' *
+--crm-table-sort-active-col: var(--crm-c-link);
+--crm-table-compressed-width: auto;
+--crm-table-nested-padding: var(--crm-r) var(--crm-m);
+--crm-table-nested-head-border: 0 solid transparent;
+--crm-table-nested-border: var(--crm-c-divider);
+--crm-table-inset-bg: var(--crm-c-background3);
+/* Panels *
+--crm-panel-shadow: var(--crm-block-shadow);
+--crm-panel-background: var(--crm-c-page-background);
+--crm-panel-border: var(--crm-c-divider);
+--crm-panel-head-margin: 0px;
+/* Accordions *
+--crm-expand-icon: "\f0da"; /* unicode value for FontAwesome icon *
+--crm-expand-icon-color: var(--text);
+--crm-expand-icon-spacing: var(--crm-m);
+--crm-expand-transform: rotate(90deg);
+--crm-expand-transition: transform .3s;
+--crm-expand-radius: var(--crm-roundness);
+--crm-expand-gap: var(--crm-xs2) 0 0; /* space between multiple accordions */
+/* .crm-accordion-bold *
+--crm-expand-header-bg: var(--crm-c-secondary);
+--crm-expand-header-bg-active: var(--crm-c-gray-900);
+--crm-expand-header-color: var(--crm-c-light-text);
+--crm-expand-header-padding: var(--crm-s) var(--crm-m);
+--crm-expand-header-weight: bold;
+--crm-expand-header-font: var(--crm-font-bold);
+--crm-expand-header-border: var(--crm-c-divider);
+--crm-expand-header-border-width: 0 0 1px 0;
+--crm-expand-border: var(--crm-c-divider);
+--crm-expand-border-width: 0 1px 1px 1px;
+--crm-expand-body-bg:;
+--crm-expand-body-box-shadow:;
+--crm-expand-body-padding: var(--crm-padding-reg);
+/* .crm-accordion-light *
+--crm-expand2-header-bg:;
+--crm-expand2-header-bg-active: var(--crm-c-background-2);
+--crm-expand2-header-weight: normal;
+--crm-expand2-header-font:;
+--crm-expand2-header-color: var(--crm-c-text);
+--crm-expand2-header-border:;
+--crm-expand2-header-border-width: ;
+--crm-expand2-header-padding: var(--crm-s) var(--crm-m);
+--crm-expand2-border:;
+--crm-expand2-border-width:;
+--crm-expand2-body-bg:;
+--crm-expand2-body-padding: var(--crm-s);
+/* Alerts *
+--crm-alert-padding: var(--crm-m) var(--crm-m2);
+--crm-alert-margin: 0 0 var(--crm-m);
+--crm-alert-border-width: 1px;
+--crm-alert-background-help: var(--crm-c-green-light);
+--crm-alert-border-help: var(--crm-c-green);
+--crm-alert-text-help: var(--crm-c-green-dark);
+--crm-alert-background-warning: var(--crm-c-yellow-light);
+--crm-alert-border-warning: var(--crm-c-yellow);
+--crm-alert-text-warning: var(--crm-c-text);
+--crm-alert-background-info: var(--crm-c-blue-light);
+--crm-alert-border-info: var(--crm-c-blue);
+--crm-alert-text-info: var(--crm-c-blue-dark);
+--crm-alert-background-danger: var(--crm-c-red-light);
+--crm-alert-border-danger: var(--crm-c-red);
+--crm-alert-text-danger: var(--crm-c-red-dark);
+/* Form *
+--crm-form-block-box-shadow: var(--crm-block-shadow);
+--crm-form-block-background: var(--crm-c-background);
+--crm-form-block-padding: var(--crm-m);
+--crm-form-block-border-radius: var(--crm-roundness);
+--crm-input-background: var(--crm-c-page-background);
+--crm-input-background-image: linear-gradient(top, #eee 1%, #fff 15%);
+--crm-input-color: var(--crm-c-text);
+--crm-input-border-color: var(--crm-c-gray-400);
+--crm-input-border-radius: 3px;
+--crm-input-active-ani: border-color .15s ease-in-out 0s;
+--crm-input-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,.1);
+--crm-input-padding: var(--crm-xs1) var(--crm-s2);
+--crm-input-padding-large: var(--crm-s) var(--crm-m1);
+--crm-input-height: var(--crm-l);
+--crm-input-font-size: var(--crm-m3);
+--crm-input-label-weight: bold;
+--crm-input-label-font: var(--crm-font);
+--crm-input-label-size: var(--crm-font-size);
+--crm-input-label-width: var(--crm-big-input);
+--crm-input-label-align: right;
+--crm-input-label-color: var(--crm-c-text);
+--crm-input-description: var(--crm-c-gray-700);
+--crm-input-dropdown-icon: "\f107";
+--crm-input-radio-color: var(--crm-c-focus);
+--crm-form-select-bg: var(--crm-c-background2);
+--crm-inline-edit-border: 0 solid transparent;
+--crm-inline-edit-bg: var(--crm-c-background);
+--crm-fieldset-border-color: var(--crm-c-gray-400);
+--crm-fieldset-border: 1px 0 0 0;
+--crm-fieldset-padding: var(--crm-padding-reg) var(--crm-padding-small);
+--crm-checkbox-list-col: var(--crm-c-text);
+/* Tabs *
+--crm-tabs-bg: var(--crm-c-background4);
+--crm-tabs-padding: var(--crm-s);
+--crm-tabs-border: var(--crm-dash-border);
+--crm-tabs-radius: var(--crm-roundness);
+--crm-tabs-gap: var(--crm-s);
+--crm-tab-bg: var(--crm-c-background2);
+--crm-tab-bg-hover: var(--crm-c-background);
+--crm-tab-bg-active: var(--crm-c-background);
+--crm-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip *
+--crm-tab-padding: var(--crm-s3) var(--crm-m) var(--crm-s) var(--crm-m);
+--crm-tab-col: var(--crm-c-text);
+--crm-tab-weight: normal;
+--crm-tab-font:;
+--crm-tab-count-bg: var(--crm-c-info-text);
+--crm-tab-count-col: var(--crm-c-info);
+--crm-tab-roundness: var(--crm-roundness);
+--crm-tab-border: var(--crm-c-divider);
+--crm-tab-border-width: 0;
+--crm-tab-border-active: 0 solid transparent;
+/* Contact dashboard *
+--crm-dash-border: var(--crm-tab-border);
+--crm-dash-roundness: var(--crm-roundness);
+--crm-dash-direction: flex; /* choose 'flex' for tabs at top, or 'grid' for tabs at side *
+--crm-side-tabs-width: ;
+--crm-dash-tabs-flow: row; /* choose 'row' for tabs at top, or 'column' for tabs at side *
+--crm-dash-tabs-gap: var(--crm-tabs-gap);
+--crm-dash-tabs-bg: var(--crm-tabs-bg);
+--crm-dash-tabs-padding: var(--crm-tabs-padding);
+--crm-dash-tabs-roundness: var(--crm-dash-roundness) var(--crm-dash-roundness) 0 0;
+--crm-dash-tab-bg: var(--crm-tab-bg);
+--crm-dash-tab-bg-hover: var(--crm-tab-bg-hover);
+--crm-dash-tab-padding: var(--crm-s3) var(--crm-m2);
+--crm-dash-tab-border: 0 solid transparent;
+--crm-dash-tab-border-hover: 0 solid transparent;
+--crm-dash-tab-border-width: 0; /* to remove border on one side for hanging tabs *
+--crm-dash-tab-col: var(--crm-tab-col);
+--crm-dash-tab-count-bg: rgba(0,0,0,0.1);
+--crm-dash-tab-count-col: var(--crm-c-text);
+--crm-dash-tab-width: 100%;
+--crm-dash-tab-align: none;
+--crm-dash-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip *
+--crm-dash-tab-radius: var(--crm-dash-roundness);
+--crm-dash-icon-size: var(--crm-r);
+--crm-dash-summary-row-bg: var(--crm-c-background);
+--crm-dash-box-shadow: 0;
+--crm-dash-heading-inset: ;
+--crm-dash-panel-padding: var(--crm-m);
+--crm-dash-panel-bg: #fff;
+--crm-dash-panel-border: 0;
+--crm-dash-panel-radius: 0 0 var(--crm-dash-roundness) var(--crm-dash-roundness);
+--crm-dash-edit-border: 2px dashed var(--crm-c-gray-300);
+--crm-dash-block-padding: 0;
+--crm-dash-block-bg: ;
+--crm-dash-block-radius: var(--crm-roundness);
+--crm-dash-label-bg: var(--crm-c-background2);
+--crm-dash-header-bg: var(--crm-c-page-background);
+--crm-dash-header-bg2: transparent;
+--crm-dash-header-col: var(--crm-c-text);
+--crm-dash-header-size: var(--crm-r3);
+--crm-dash-header-padding: 0 0 var(--crm-r) 0;
+--crm-dash-image-size: 100px;
+--crm-dash-image-radius: 0;
+--crm-dash-image-right: 10px; /* distance from right of dashboard *
+--crm-dash-image-top: unset; /* distance from top of dashboard *
+--crm-dash-image-border: 0;
+/* Dialog *
+--crm-dialog-bg: var(--crm-c-page-background);
+--crm-dialog-padding: var(--crm-s);
+--crm-dialog-radius: var(--crm-roundness);
+--crm-dialog-line:;
+--crm-dialog-inner-shadow: var(--crm-bottom-shadow);
+--crm-dialog-header-bg: var(--crm-c-secondary);
+--crm-dialog-header-col: var(--crm-c-light-text);
+--crm-dialog-header-size: var(--crm-r1);
+--crm-dialog-header-padding: var(--crm-m1) var(--crm-r);
+--crm-dialog-header-radius: var(--crm-dialog-radius);
+--crm-dialog-header-border-col: transparent transparent var(--crm-c-gray-300) transparent; /* set a border color for each side of the header *
+--crm-dialog-body-bg: var(--crm-c-background);
+--crm-dialog-body-padding: var(--crm-m);
+/* Dashlet *
+--crm-dashlet-border:;
+--crm-dashlet-bg: var(--crm-c-page-background);
+--crm-dashlet-padding: var(--crm-s2);
+--crm-dashlet-box-shadow: var(--crm-popup-shadow);
+--crm-dashlet-dashlets-bg: var(--crm-c-background);
+--crm-dashlet-header-bg: var(--crm-expand-header-bg);
+--crm-dashlet-header-col: var(--crm-expand-header-color);
+--crm-dashlet-header-border:;
+--crm-dashlet-header-border-width:;
+--crm-dashlet-header-font-size: var(--crm-font-size);
+--crm-dashlet-header-padding: var(--crm-s);
+--crm-dashlet-content-padding: var(--crm-dashlet-padding) 0;
+--crm-dashlet-tabs-border:0;
+--crm-dashlet-radius: var(--crm-roundness);
+/* Button dropdowns *
+--crm-dropdown-padding: var(--crm-s);
+--crm-dropdown-radius: var(--crm-roundness);
+--crm-dropdown-bg: var(--crm-c-secondary-hover);
+--crm-dropdown-col: var(--crm-c-light-text);
+--crm-dropdown-hover: var(--crm-c-text);
+--crm-dropdown-hover-bg: var(--crm-c-page-background);
+--crm-dropdown-border: 0;
+--crm-dropdown-width: 180px;
+--crm-dropdown-alert-bg: var(--crm-c-alert); /* for delete links in dropdowns *
+--crm-dropdown-2-bg: var(--crm-c-secondary);
+--crm-dropdown-2-col: var(--crm-c-text);
+--crm-dropdown-2-padding: var(--crm-padding-small);
+/* Notifications *
+--crm-notify-background: rgba(0,0,0,0.85);
+--crm-notify-padding: var(--crm-m2);
+--crm-notify-col: var(--crm-c-light-text);
+--crm-notify-accent-border: 2px 0 0 0; /* adds a border to one/several sides of the notification - set to 0 for none *
+--crm-notify-radius: var(--crm-roundness);
+/* Icons *
+--crm-icon-alert: "\f06a";
+--crm-icon-success: "\f058";
+--crm-icon-info: "\f05a";
+--crm-icon-close: "\f00d";
+--crm-icon-sort: "\f0dc";
+--crm-icon-sort-desc: "\f0dd";
+--crm-icon-sort-asc: "\f0de";
+--crm-icon-alert-color: inherit;
+--crm-icon-success-color: inherit;
+--crm-icon-warning-color: inherit;
+--crm-icon-info-color: inherit;
+/* Wizard *
+--crm-wizard-width: fit-content;
+--crm-wizard-margin: 0.5rem auto;
+--crm-wizard-height: 30px;
+--crm-wizard-radius: var(--crm-l);
+--crm-wizard-angle: 0px;
+--crm-wizard-active-col: var(--crm-c-light-text);
+--crm-wizard-active-bg: var(--crm-c-link);
+--crm-wizard-border: var(--crm-c-divider);
+--crm-wizard-bg: var(--crm-c-page-background);
+/* Alpha filter *
+--crm-filter-bg: var(--crm-c-blue-light);
+--crm-filter-padding: var(--crm-m);
+--crm-filter-item-bg:  #fafafa;
+--crm-filter-item-shadow: 0px 0px 3px rgba(0,0,0,0.1);
+--crm-filter-spacing: start; /* choose 'space-between' to spread out evenly, or 'end' to right align. */
+/* Frontend *
+--crm-f-form-width:;
+--crm-f-box-shadow: var(--crm-block-shadow);
+--crm-f-fieldset-bg: var(--crm-c-background);
+--crm-f-fieldset-padding: var(--crm-r);
+--crm-f-fieldset-margin: 0 0 var(--crm-padding-reg) 0;
+--crm-f-fieldset-border: 0;
+--crm-f-legend-align: center;
+--crm-f-legend-size: var(--crm-r3);
+--crm-f-form-padding: var(--crm-padding-reg);
+--crm-f-form-layout: block; /* 'grid' = inline, 'block' = stacked *
+--crm-f-label-position: ;
+--crm-f-label-align: left;
+--crm-f-label-width: 200px;
+--crm-f-label-weight: bold;
+--crm-f-input-radius: var(--crm-roundness);
+--crm-f-input-padding: var(--crm-r2) var(--crm-m2);
+--crm-f-input-font-size: var(--crm-r1);
+--crm-f-input-width: 300px;
+--crm-f-form-focus-bg: var(--crm-c-green);
+--crm-f-form-error-bg: var(--crm-c-red);
+--crm-f-logo-height: 40px;
+--crm-f-logo-align: center; /* left, right or center */
+}
diff --git a/civicrm/ext/riverlea/streams/hackneybrook/css/_dark.css b/civicrm/ext/riverlea/streams/hackneybrook/css/_dark.css
new file mode 100644
index 0000000000000000000000000000000000000000..e7af4b10a41f5e46c59e8a462a7019467585be56
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/hackneybrook/css/_dark.css
@@ -0,0 +1,70 @@
+/* HackneyBrook dark mode settings */
+:root {
+  --crm-c-text: #fff;
+  --crm-c-link: var(--crm-c-teal);
+  --crm-c-link-hover: var(--crm-c-yellow);
+  --crm-c-text-light: var(--crm-c-darkest);
+  --crm-c-background: var(--crm-c-darkest);
+  --crm-c-page-background: var(--crm-c-gray-900);
+  --crm-c-background2: var(--crm-c-gray-800);
+  --crm-c-background3: var(--crm-c-gray-700);
+  --crm-c-background4: var(--crm-c-gray-600);
+  --crm-c-code-background: var(--crm-c-gray-200);
+  --crm-c-primary: var(--crm-c-gray-800);
+  --crm-c-secondary: var(--crm-c-gray-800);
+  --crm-c-primary-hover: var(--crm-c-gray-900);
+  --crm-c-secondary-hover: var(--crm-c-gray-900);
+  --crm-c-success: #58a458;
+  --crm-c-alert: #ff899a;
+  --crm-c-info: #2c99a4;
+  --crm-c-teal: #28ae9f;
+  --crm-c-green-light: #468847;
+  --crm-c-green: #55aa57;
+  --crm-c-green-dark: #dff0d8;
+  --crm-c-gray-700: #535252;
+  --crm-c-gray-600: #67676a;
+  --crm-c-gray-500: #6c6c6c;
+  --crm-c-divider: 1px solid var(--crm-c-gray-500);
+  /* And others */
+  --crm-c-focus: var(--crm-c-amber);
+  --crm-btn-icon-bg: var(--crm-c-gray-700);
+  --crm-block-shadow: 0;
+  --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0);
+  --crm-heading-bg: var(--crm-c-blue-dark);
+  --crm-dashlet-bg: var(--crm-c-background2);
+  --crm-dashlet-header-bg: var(--crm-c-background3);
+  --crm-expand-header-bg: var(--crm-c-background4);
+  --crm-expand-header-bg-active: var(--crm-c-background5);
+  --crm-expand-body-bg: var(--crm-c-background3);
+  --crm-expand-body-border: 0;
+  --crm-dash-header-bg: transparent;
+  --crm-dash-block-bg: var(--crm-c-background2);
+  --crm-dash-label-bg: transparent;
+  --crm-dash-tabs-bg: transparent;
+  --crm-dash-panel-bg: var(--crm-c-background2);
+  --crm-dash-tab-bg-hover: var(--crm-c-background2);
+  --crm-dropdown-bg: var(--crm-c-background);
+  --crm-dropdown-2-bg: var(--crm-c-background);
+  --crm-tabs-bg: var(--crm-c-background3);
+  --crm-panel-border-col: var(--crm-c-gray-500);
+  --crm-input-border-color: var(--crm-c-gray-500);
+  --crm-table-odd-row: var(--crm-c-gray-800);
+  --crm-table-odd-hover: var(--crm-c-gray-700);
+  --crm-table-even-row: var(--crm-c-gray-700);
+  --crm-table-even-hover: var(--crm-c-gray-600);
+  --crm-alert-text-help: var(--crm-c-text-light);
+  --crm-alert-text-warning: var(--crm-c-text-light);
+  --crm-alert-background-info: var(--crm-c-blue-dark);
+  --crm-alert-text-info: var(--crm-c-blue-light);
+  --crm-c-inactive: var(--crm-c-gray-400);
+  --crm-input-color: var(--crm-c-text);
+  --crm-input-description: var(--crm-c-gray-300);
+  --crm-checkbox-list-col: var(--crm-c-text-light);
+  --crm-alert-text-help: var(--crm-c-text);
+  --crm-dialog-header-border-col: transparent;
+  --crm-dialog-header-bg: var(--crm-c-background2);
+  --crm-dialog-body-bg: var(--crm-c-background2);
+  --crm-notify-background: var(--crm-c-darkest);
+  --crm-wizard-active-bg: var(--crm-c-dark-teal);
+  --crm-form-block-background: var(--crm-c-background2);
+}
diff --git a/civicrm/ext/riverlea/streams/hackneybrook/css/_variables.css b/civicrm/ext/riverlea/streams/hackneybrook/css/_variables.css
new file mode 100644
index 0000000000000000000000000000000000000000..b2229598c290d9368bf12cacf2f9780005845edb
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/hackneybrook/css/_variables.css
@@ -0,0 +1,140 @@
+/*
+    Name: HackneyBrook;
+    Description: named after the Hackney Brook, a tributary of the River Lea that ran through Finsbury Park;
+    Riverlea version: 1.1.0;
+*/
+
+:root {
+  --crm-version: 'Hackney, v' var(--crm-release);
+  /* Fonts */
+  --crm-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",sans-serif;
+  /* Colour names */
+  --crm-c-gray-025: #f9f9f9;
+  --crm-c-green-light: #cff0be;
+  --crm-c-green-dark: #46b450;
+  --crm-c-red-dark: #dc3232;
+  --crm-c-amber: #ffb900;
+  --crm-c-teal: #399389;
+  /* Practical colours */
+  --crm-c-divider: 1px solid var(--crm-c-gray-200);
+  --crm-c-background: var(--crm-c-gray-025); /* background to page header, often form block & dialog bg */
+  --crm-c-drag-background: var(--crm-c-background3); /* background for drag/drop regions, select2 highlight */
+  --crm-c-primary: var(--crm-c-gray-025);
+  --crm-c-primary-hover: var(--crm-c-gray-050);
+  --crm-c-primary-text: var(--crm-c-text);
+  --crm-c-primary-hover-text: var(--crm-c-text);
+  --crm-c-secondary: var(--crm-c-gray-025);
+  --crm-c-secondary-hover: var(--crm-c-gray-050);
+  --crm-c-secondary-text: var(--crm-c-text);
+  --crm-c-secondary-hover-text: var(--crm-c-text);
+  --crm-c-info: var(--crm-c-blue-darker);
+  /* Type */
+  --crm-heading-padding: var(--crm-s2) var(--crm-m2);
+  /* Buttons */
+  --crm-btn-border: 1px solid var(--crm-c-gray-300);
+  --crm-btn-padding-block: 2px; /* padding for top and bottom, one value */
+  --crm-btn-height: 31px;
+  --crm-btn-icon-spacing: var(--crm-m1);
+  --crm-btn-icon-size: var(--crm-btn-height);
+  --crm-btn-cancel-bg: var(--crm-c-primary);
+  --crm-btn-cancel-text: var(--crm-c-text);
+  --crm-btn-info-bg: var(--crm-c-primary);
+  --crm-btn-info-text: var(--crm-c-text);
+  --crm-btn-warning-bg: var(--crm-c-primary);
+  --crm-btn-warning-text: var(--crm-c-text);
+  --crm-btn-success-bg: var(--crm-c-primary);
+  --crm-btn-success-text: var(--crm-c-text);
+  --crm-btn-alert-bg: var(--crm-c-primary);
+  --crm-btn-alert-text: var(--crm-c-text);
+  --crm-btn-icon-bg: rgba(256,256,256,0.25);
+  --crm-btn-icon-border: var(--crm-btn-border);
+  --crm-btn-icon-padding: 0px;
+  /* Tables */
+  --crm-table-outside-border: var(--crm-c-divider);
+  /* Accordions */
+  /* .crm-accordion-bold */
+  --crm-expand-header-bg: var(--crm-c-gray-200);
+  --crm-expand-header-bg-active: var(--crm-c-gray-300);
+  --crm-expand-header-color: var(--crm-c-text);
+  --crm-expand-header-border: 0 solid transparent;
+  /* Alerts */
+  --crm-alert-padding: var(--crm-r);
+  --crm-alert-text-help: var(--crm-c-text);
+  --crm-alert-text-info: var(--crm-c-blue-darker);
+  /* Form */
+  --crm-input-color: var(--crm-c-text);
+  --crm-input-border-color: var(--crm-c-gray-300);
+  --crm-input-box-shadow: 0;
+  --crm-input-label-weight: normal;
+  --crm-fieldset-border: 1px;
+  --crm-checkbox-list-col: var(--crm-c-text);
+  /* Tabs */
+  --crm-tabs-border: var(--crm-c-divider);
+  --crm-tab-count-bg: var(--crm-c-blue-dark);
+  --crm-tab-count-col: var(--crm-c-light-text);
+  --crm-tab-border: 1px solid var(--crm-c-gray-400);
+  /* Contact dashboard */
+  --crm-dash-border: 0;
+  --crm-dash-direction: grid; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */
+  --crm-side-tabs-width: 200px;
+  --crm-dash-tabs-flow: column; /* choose 'row' for tabs at top, or 'column' for tabs at side */
+  --crm-dash-tabs-gap: var(--crm-m);
+  --crm-dash-tabs-bg: transparent;
+  --crm-dash-tabs-padding: var(--crm-r) 0;
+  --crm-dash-tab-bg: transparent;
+  --crm-dash-tab-bg-hover: var(--crm-c-background);
+  --crm-dash-tab-padding: var(--crm-m2) var(--crm-m1) var(--crm-m2) var(--crm-r);
+  --crm-dash-tab-border: 1px solid transparent;
+  --crm-dash-tab-border-hover: var(--crm-c-divider);
+  --crm-dash-tab-border-width: 1px 0 1px 1px; /* to remove border on one side for hanging tabs */
+  --crm-dash-tab-width: auto; /* 100% to fill column width, auto to only cover contents */
+  --crm-dash-tab-align: right;
+  --crm-dash-tab-hang: 0 -1px 0 0; /* lip to extend tab flush with active region - set to 0 for no lip */
+  --crm-dash-tab-radius: var(--crm-dash-roundness) 0 0 var(--crm-dash-roundness);
+  --crm-dash-summary-row-bg: var(--crm-c-background3);
+  --crm-dash-heading-inset: var(--crm-side-tabs-width);
+  --crm-dash-panel-padding: var(--crm-r);
+  --crm-dash-panel-bg: var(--crm-c-background);
+  --crm-dash-panel-border: var(--crm-c-divider);
+  --crn-dash-panel-radius: var(--crm-dash-roundness);
+  --crm-dash-image-size: 100px;
+  --crm-dash-image-radius: 200px;
+  --crm-dash-image-right: 0; /* distance from right of dashboard */
+  --crm-dash-image-top: -10px; /* distance from top of dashboard */
+  --crm-dash-image-border: 0;
+  /* Dialog */
+  --crm-dialog-header-bg: var(--crm-c-background4);
+  --crm-dialog-header-col: var(--crm-c-text);
+  --crm-dialog-header-size: var(--crm-r);
+  --crm-dialog-header-padding: var(--crm-s) var(--crm-m1) var(--crm-s) var(--crm-m2);
+  --crm-dialog-header-radius: var(--crm-dialog-radius) var(--crm-dialog-radius) 0 0;
+  --crm-dialog-body-bg: var(--crm-c-page-background);
+  --crm-dialog-body-padding: var(--crm-r);
+  /* Dashlet */
+  --crm-dashlet-border: var(--crm-c-divider);
+  --crm-dashlet-padding: 0;
+  --crm-dashlet-content-padding: var(--crm-m);
+  --crm-dashlet-tabs-border: 3px solid #fff;
+  --crm-dashlet-radius: var(--crm-roundness) var(--crm-roundness) 0 0;
+  /* Button dropdowns */
+  --crm-dropdown-bg: var(--crm-c-page-background);
+  --crm-dropdown-col: var(--crm-c-text);
+  --crm-dropdown-hover-bg: var(--crm-c-secondary-hover);
+  --crm-dropdown-border: var(--crm-btn-border);
+  --crm-dropdown-width: 180px;
+  --crm-dropdown-2-bg: var(--crm-c-background3);
+  /* Notifications */
+  --crm-notify-background: rgb(0,0,0);
+  --crm-notify-padding: 10px 10px 15px 15px;
+  --crm-notify-accent-border: 0 0 0 4px; /* adds a border to one/several sides of the notification - set to 0 for none */
+  --crm-notify-radius: 0;
+  /* Icons */
+  --crm-icon-alert-color: var(--crm-c-alert);
+  --crm-icon-success-color: var(--crm-c-success);
+  --crm-icon-warning-color: var(--crm-c-warning);
+  --crm-icon-info-color: var(--crm-c-info);
+  /* Frontend */
+  --crm-f-legend-align: unset;
+  --crm-f-legend-size: var(--crm-r2);
+  --crm-f-form-width: 50vw;
+}
diff --git a/civicrm/ext/riverlea/streams/minetta/css/_dark.css b/civicrm/ext/riverlea/streams/minetta/css/_dark.css
new file mode 100644
index 0000000000000000000000000000000000000000..e19620ef233a266bc5f14f694c6ab7ee133cc10c
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/minetta/css/_dark.css
@@ -0,0 +1,63 @@
+/* Minetta dark mode settings */
+:root {
+  --crm-c-text: #fff;
+  --crm-c-link: var(--crm-c-teal);
+  --crm-c-link-hover: var(--crm-c-yellow);
+  --crm-c-text-light: var(--crm-c-darkest);
+  --crm-c-background: var(--crm-c-gray-900);
+  --crm-c-page-background: var(--crm-c-gray-900);
+  --crm-c-background2: var(--crm-c-gray-800);
+  --crm-c-background3: var(--crm-c-gray-700);
+  --crm-c-background4: var(--crm-c-gray-600);
+  --crm-c-code-background: var(--crm-c-gray-200);
+  --crm-c-success: #58a458;
+  --crm-red-alert: #b24b4f;
+  --crm-c-alert: #ff899a;
+  --crm-blue-info: #2c99a4;
+  --crm-c-green-light: #468847;
+  --crm-c-green: #55aa57;
+  --crm-c-green-dark: #dff0d8;
+  --crm-c-gray-700: #535252;
+  --crm-c-gray-600: #67676a;
+  --crm-c-gray-500: #6c6c6c;
+  --crm-c-divider: 1px solid var(--crm-c-gray-500);
+  /* And others */
+  --crm-block-shadow: 0;
+  --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0);
+  --crm-heading-bg: var(--crm-c-blue-dark);
+  --crm-dashlet-bg: var(--crm-c-background2);
+  --crm-dashlet-header-bg: var(--crm-c-background3);
+  --crm-expand-header-bg: var(--crm-c-background4);
+  --crm-expand-body-bg: var(--crm-c-background3);
+  --crm-dash-header-bg: transparent;
+  --crm-dash-block-bg: var(--crm-c-background2);
+  --crm-dash-label-bg: transparent;
+  --crm-dash-panel-bg: var(--crm-c-background3);
+  --crm-dropdown-bg: var(--crm-c-background);
+  --crm-dropdown-2-bg: var(--crm-c-background);
+  --crm-tabs-border: 1px solid var(--crm-c-gray-500);
+  --crm-tabs-bg: var(--crm-c-background3);
+  --crm-table-outside-border: 1px solid var(--crm-c-gray-500);
+  --crm-table-row-border: 1px solid var(--crm-c-gray-500);
+  --crm-panel-border-col: var(--crm-c-gray-500);
+  --crm-input-border-color: var(--crm-c-gray-500);
+  --crm-table-odd-row: var(--crm-c-gray-800);
+  --crm-table-odd-hover: var(--crm-c-gray-700);
+  --crm-table-even-row: var(--crm-c-gray-700);
+  --crm-table-even-hover: var(--crm-c-gray-600);
+  --crm-alert-text-help: var(--crm-c-text-light);
+  --crm-alert-text-warning: var(--crm-c-text-light);
+  --crm-alert-background-info: var(--crm-c-blue-dark);
+  --crm-alert-text-info: var(--crm-c-blue-light);
+  --crm-c-inactive: var(--crm-c-gray-400);
+  --crm-input-color: var(--crm-c-text);
+  --crm-input-description: var(--crm-c-gray-300);
+  --crm-checkbox-list-col: var(--crm-c-text-light);
+  --crm-alert-text-help: var(--crm-c-text);
+  --crm-dialog-header-border-col: transparent;
+  --crm-dialog-header-bg: var(--crm-c-background2);
+  --crm-dialog-body-bg: var(--crm-c-background2);
+  --crm-notify-background: var(--crm-c-darkest);
+  --crm-wizard-active-bg: var(--crm-c-dark-teal);
+  --crm-form-block-background: var(--crm-c-background2);
+}
diff --git a/civicrm/ext/riverlea/streams/minetta/css/_variables.css b/civicrm/ext/riverlea/streams/minetta/css/_variables.css
new file mode 100644
index 0000000000000000000000000000000000000000..527054df5ef0fcd6b259637e1b87adf1fa0b2d38
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/minetta/css/_variables.css
@@ -0,0 +1,9 @@
+/*
+    Name: Minetta;
+    Description: Generic CiviCRM UI, somewhat familiar to users of CiviCRM since 2014. Named after Minetta Creek, which runs under Greenwich, New York;
+    Riverlea version: 1.1.0;
+*/
+
+:root {
+  --crm-version: 'Minetta, v' var(--crm-release);
+}
diff --git a/civicrm/ext/riverlea/streams/thames/css/_dark.css b/civicrm/ext/riverlea/streams/thames/css/_dark.css
new file mode 100644
index 0000000000000000000000000000000000000000..c30024ce654eeeeeb6b48b23656713337ef544a4
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/thames/css/_dark.css
@@ -0,0 +1,123 @@
+:root {
+  --crm-c-dkblue-01: #050b0d;
+  --crm-c-dkblue-02: #0c191e;
+  --crm-c-dkblue-03: #1a292f;
+  --crm-c-dkblue-04: #1e323b;
+  --crm-c-background: var(--crm-c-dkblue-02);
+  --crm-dash-tabs-bg: var(--crm-c-dkblue-03);
+  --crm-dash-tab-count-bg: var(--crm-c-blue-darker);
+  --crm-c-page-background: var(--crm-c-dkblue-01);
+  --crm-c-code-background: var(--crm-c-dkblue-04);
+  --crm-dashlet-bg: var(--crm-c-dkblue-02);
+  --crm-c-green: #335417;
+  --crm-c-link: #2c98ed;
+  --crm-c-link-hover: color-mix(in srgb, white, var(--crm-c-blue-dark) 70%);
+  --crm-dash-header-col: var(--crm-c-blue-light);
+  --crm-dash-tab-bg-hover: var(--crm-c-dkblue-02);
+  --crm-dash-panel-bg: var(--crm-c-dkblue-02);
+  --crm-dash-block-bg: var(--crm-c-dkblue-03);
+  --crm-dash-summary-row-bg: transparent;
+  --crm-dash-label-bg: transparent;
+  --crm-c-text: var(--crm-c-blue-overlay2);
+  --crm-tabs-bg: var(--crm-dkblue-01);
+  --crm-tabs-border: var(--crm-dkblue-01);
+  --crm-c-drag-background: var(--crm-c-dkblue-04);
+  --crm-tab-bg-active: var(--crm-c-dkblue-02);
+  --crm-tab-bg-hover: var(--crm-c-dkblue-02);
+  --crm-tab-bg: transparent;
+  --crm-alert-background-help: var(--crm-c-dkblue-03);
+  --crm-alert-background-warning: #383124;
+  --crm-input-background: var(--crm-c-blue-darker);
+  --crm-inline-edit-bg: var(--crm-c-dkblue-01);
+  --crm-input-color: var(--crm-c-blue); /* text */
+  --crm-alert-background-info: var(--crm-c-blue-darker);
+  --crm-alert-text-info: var(--crm-c-blue-light);
+  --crm-expand-body-bg: var(--crm-c-dkblue-03);
+  --crm-expand-header-color: var(--crm-c-blue-light);
+  --crm-expand-header-bg: var(--crm-c-dkblue-03);
+  --crm-c-divider: var(--crm-c-dkblue-03);
+  --crm-table-odd-row: var(--crm-c-dkblue-02);
+  --crm-table-even-row: var(--crm-c-dkblue-01);
+  --crm-table-odd-hover: var(--crm-c-dkblue-03);
+  --crm-table-even-hover: var(--crm-c-dkblue-02);
+  --crm-c-background2: var(--crm-c-dkblue-02);
+  --crm-c-background3: var(--crm-c-dkblue-02);
+  --crm-c-background4: var(--crm-c-dkblue-01);
+  --crm-panel-background: var(--crm-c-dkblue-02);
+  --crm-form-block-background: var(--crm-c-dkblue-02);
+  --crm-notify-background: var(--crm-c-dkblue-02);
+  --crm-expand-header-bg-active: var(--crm-c-dkblue-04);
+}
+
+.crm-container div.crm-summary-row div.crm-label {
+  --crm-c-blue-darker: var(--crm-c-blue);
+}
+
+/* todo variablize this */
+.crm-container .ui-tabs:not(#mainTabContainer) {
+  background: var(--crm-c-dkblue-01);
+  --crm-tabs-border: solid 4px var(--crm-c-dkblue-01);
+}
+
+.crm-container .crm-accordion-bold>summary:is(:hover,
+:focus) {
+  background-color: var(--crm-c-dkblue-01);
+}
+
+/* Get rid of the ugly black overlay during loading */
+@keyframes aahblockoverlay-dark {
+  0% {
+    background-color: var(--crm-c-dkblue-01);
+  }
+
+  50% {
+    background-color: var(--crm-c-dkblue-03);
+  }
+
+  100% {
+    background-color: var(--crm-c-dkblue-01);
+  }
+}
+
+.crm-container .blockUI.blockOverlay {
+  animation: aahblockoverlay-dark 10s infinite;
+}
+
+.crm-container .crm-dashlet-content {
+  background: var(--crm-c-dkblue-00) !important;
+}
+.crm-container .crm-dashlet-header {
+  background: var(--crm-c-dkblue-01) !important;
+}
+.crm-container summary {
+  background: var(--crm-c-dkblue-03);
+}
+.crm-container details {
+  background-color: var(--crm-c-dkblue-02);
+}
+.standalone-errors {
+  background: #3e0a01;
+}
+/* .crm-container .crm-search-nav-tabs { border-color: var(--crm-c-dkblue-01); } */
+
+/* Override standalone.css */
+.standalone-auth-box {
+  background: var(--crm-c-dkblue-01) !important;
+}
+#login-form {
+  --crm-big-input: 100%;
+}
+/* Override _fixes.scss */
+.crm-container del,
+.crm-container .ui-icons_deleted,
+.crm-container table.caseSelector td.status-urgent,
+.crm-container .font-red,
+.crm-container .status-removed,
+.crm-container .status-overdue,
+.crm-container .status-fatal,
+.crm-container .status-hold,
+.crm-container .status-past,
+.crm-contact-deceased,
+.crm-container .status-warning {
+  --crm-c-alert: var(--crm-c-red);
+}
diff --git a/civicrm/ext/riverlea/streams/thames/css/_variables.css b/civicrm/ext/riverlea/streams/thames/css/_variables.css
new file mode 100644
index 0000000000000000000000000000000000000000..45e829b5fcc24faadffecf2087cd2c5fa046e016
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/thames/css/_variables.css
@@ -0,0 +1,492 @@
+/*
+    Name: Thames;
+    Description: Aaaaah;
+    Riverlea version: 1.1.0;
+
+    I have added 'thames' to lines I changed.
+    This means I can track changes to the core variables with diff.
+    (One day all this css could be nicely optimised but for now
+    during heavy development it's more helpful to track changes than
+    worry about duplicate definitions etc.)
+
+*/
+
+
+:root {
+  --crm-version: 'Thames, v' var(--crm-release);
+/* FONTS */
+/* --crm-system-fonts:; */
+  --crm-font: Lato, sans-serif;
+/* --crm-font-bold:Lato; */
+  --crm-bold-weight: bold;
+/* --crm-font-italic:; */
+  --crm-italic-style: italic;
+/* --crm-font-bold-italic:; */
+}
+:root {
+/* COLOUR */
+  color-scheme: light dark; /* check to use simpler syntax late-2024 (Edge+iOS Safari)
+
+/* COLOUR NAMES */
+  --crm-c-darkest: #0a0a0a;
+  --crm-c-gray-900: #2f2f2e;
+  --crm-c-gray-800: #3e3e3e;
+  --crm-c-gray-700: #696969;
+  --crm-c-gray-600: #828388;
+  --crm-c-gray-500: #919297;
+  --crm-c-gray-400: #adaeb3;
+  --crm-c-gray-300: #c2c0c0;
+  --crm-c-gray-200: #d5d5d5;
+  --crm-c-gray-100: #e2e1e1;
+  --crm-c-gray-050: #f8f8f8;
+  --crm-c-gray-025: #fcfbfb;
+  --crm-c-blue-overlay2: #edf4f7; /* thames only */
+  --crm-c-blue-overlay: #dce9ef; /* thames only */
+  --crm-c-blue-light: #d8edfe; /* thames */
+  --crm-c-blue: #c5e4fc; /* thames */
+/* non-WCAG-AA --crm-c-blue-dark:     #2c98ed ; /* thames */
+  --crm-c-blue-dark: #127aca; /* thames */
+  --crm-c-blue-darker: #02477d; /* thames */
+  --crm-c-purple: #4d4d69;
+  --crm-c-purple-dark: #3e3e54;
+  --crm-c-green: #d6e9c6;
+  --crm-c-green-light: #dff0d8;
+  --crm-c-green-dark: #468847;
+  --crm-c-red: #eed3d7;
+  --crm-c-red-light: #f2dede;
+  --crm-c-red-dark: #740f0f; /* thames */
+  --crm-c-red-bright: #bd0404; /* thames only */
+  --crm-c-amber: #eeb153;
+  --crm-c-amber-light: #ffebc5;
+  --crm-c-yellow: #fcfc5a; /* thames todo change this horrible yellow! */
+  --crm-c-yellow-light: #f2deb9;
+  --crm-c-yellow-less-light: #fffdb2;
+  --crm-c-teal: #63c4b9;
+  --crm-c-dark-teal: #3e8079;
+/* PRACTICAL COLOURS */
+  --crm-c-text: #000000dd; /* thames */
+  --crm-c-light-text: #fff;
+  --crm-c-dark-text: var(--crm-c-text);
+  --crm-c-link: var(--crm-c-blue-dark);
+  --crm-c-link-hover: var(--crm-c-blue-darker);
+  --crm-c-divider: 1px solid var(--crm-c-blue-overlay); /* thames */
+  --crm-c-page-background: #f3f2ed; /* background to page body */ /* thames */
+  --crm-c-background: #f8f8f8; /* background to page header, often form block & dialog bg */ /* thames */
+  --crm-c-background2: var(--crm-c-gray-050); /* 2-5 = progressively darker backgrounds*/
+  --crm-c-background3: var(--crm-c-gray-100);
+  --crm-c-background4: var(--crm-c-gray-200);
+  --crm-c-background5: var(--crm-c-gray-700);
+  --crm-c-drag-background: var(--crm-c-blue-overlay2); /* background for drag/drop regions, select2 highlight */
+  --crm-c-code-background: var(--crm-c-blue-overlay2); /* background for code regions */
+  --crm-c-primary: var(--crm-c-blue-dark); /* primary button bgs */ /* thames */
+  --crm-c-primary-hover: var(--crm-c-blue-darker); /* thames */
+  --crm-c-primary-text: var(--crm-c-light-text);
+  --crm-c-primary-hover-text: white; /* thames */
+  --crm-c-secondary: #c9e1f1; /* buttons */ /* thames */
+  --crm-c-secondary-hover: #a1cef3; /* thames */
+  --crm-c-secondary-text: var(--crm-c-blue-darker); /* thames */
+  --crm-c-secondary-hover-text: var(--crm-c-light-text); /* thames todo */
+  --crm-c-success: var(--crm-c-green-dark);
+  --crm-c-success-text: var(--crm-c-light-text);
+  --crm-c-alert: var(--crm-c-red-dark); /* thames */
+  --crm-c-alert-text: var(--crm-c-light-text);
+  --crm-c-warning: var(--crm-c-amber); /* bg on .btn-warning, .label-warming but border on notification .alert */
+  --crm-c-warning-text: var(--crm-c-text);
+  --crm-c-info: var(--crm-c-blue-dark);
+  --crm-c-info-text: var(--crm-c-light-text);
+  --crm-c-focus: var(--crm-c-blue-dark);
+  --crm-c-inactive: #696969;
+}
+:root {
+/* thames only radii */
+  --crm-r-5: 0.8rem;
+  --crm-r-3: 0.4rem;
+  --crm-r-2: 0.25em;
+  --crm-r-1: 3px;
+/* SHADOWS */
+  --crm-block-shadow: unset;
+  --crm-popup-shadow: 3px 3px 18px 0 rgba(0, 0, 0,.25); /* thames */
+  --crm-bottom-shadow: unset;  /* thames */
+  --crm-body-inset: unset;
+/* SIZES - temporary */
+  --crm-roundness: 0; /* thames - this gets applied in too many places; so setting to 0 and positively re-applying, rather than using this and negatively unapplying. */
+  --crm-xs: 0.1rem;
+  --crm-xs1: 0.125rem;
+  --crm-xs2: 0.15rem;
+  --crm-s: 0.25rem;
+  --crm-s1: 0.275rem;
+  --crm-s2: 0.325rem;
+  --crm-s3: 0.375rem;
+  --crm-m: 0.5rem;
+  --crm-m1: 0.625rem;
+  --crm-m2: 0.75rem;
+  --crm-m3: 0.875rem;
+  --crm-r: 1rem;
+  --crm-r1: 1.125rem;
+  --crm-r2: 1.25rem;
+  --crm-r3: 1.375rem;
+  --crm-r4: 1.5rem;
+  --crm-l: 2rem;
+  --crm-xl: 3rem;
+  --crm-xxl: 4rem;
+  --crm-big-input: 15em;
+  --crm-huge-input: 100%; /* thames */
+  --crm-padding-reg: var(--crm-r);
+  --crm-padding-small: var(--crm-s);
+  --crm-padding-inset: var(--crm-m);
+/* thames: on standalone the following is overridden in cms.css */
+  --crm-page-padding: clamp(0.5rem 2vw 4rem); /* Margin left/right */ /* thames */
+  --crm-page-width: 100%; /* Default that CMS can overwrite */
+/* Type */
+  --crm-font-size: var(--crm-r);
+  --crm-small-font-size: var(--crm-m2);
+  --crm-type-line-height: 1.5;
+  --crm-link-decoration: none;
+  --crm-link-decoration-hover: underline;
+  --crm-heading-bg: unset; /*var(--crm-c-blue-light);*/ /* thames */
+  --crm-heading-col: var(--crm-c-text);
+  --crm-heading-padding: var(--crm-s1) var(--crm-m1); /* thames unset this? todo */
+  --crm-heading-margin: var(--crm-m) 0;
+  --crm-heading-radius: var(--crm-roundness);
+/* Mouse events */
+  --crm-hover-clickable: pointer;
+}
+:root {
+/* Buttons */
+  --crm-btn-box-shadow: none;
+  --crm-btn-border: 0 solid transparent;
+  --crm-btn-txt-transform: inherit;
+  --crm-btn-radius: 3px;
+  --crm-btn-padding-block: var(--crm-s); /* padding for top and bottom, one value */ /* thames */
+  --crm-btn-padding-inline: var(--crm-m2); /* padding for left and right, one value */ /* thames */
+  --crm-btn-small-padding: var(--crm-xs) var(--crm-s);
+  --crm-btn-large-padding: var(--crm-m) var(--crm-r);
+  --crm-btn-align: center;
+  --crm-btn-height: 1.825rem; /* thames */
+  --crm-btn-icon-spacing: var(--crm-xs2); /* thames */
+  --crm-btn-icon-size: auto;
+  --crm-btn-cancel-bg: var(--crm-c-red-light);
+  --crm-btn-cancel-text: var(--crm-c-red-dark);
+  --crm-btn-info-bg: var(--crm-c-secondary); /* thames */
+  --crm-btn-info-text: var(--crm-c-secondary-text); /* thames */
+  --crm-btn-warning-bg: var(--crm-c-warning);
+  --crm-btn-warning-text: var(--crm-c-warning-text);
+  --crm-btn-success-bg: var(--crm-c-info); /* thames */
+  --crm-btn-success-text: #fff; /* thames */
+  --crm-btn-alert-bg: var(--crm-c-red);
+  --crm-btn-alert-text: var(--crm-c-red-dark);
+  --crm-btn-icon-bg: unset;
+  --crm-btn-icon-border: unset;
+  --crm-btn-margin: var(--crm-m) 0;
+}
+:root {
+/* Tables */
+  --crm-table-outside-border: 1px solid var(--crm-c-background3);
+  --crm-table-background: var(--crm-c-page-background);
+  --crm-table-row-border: var(--crm-c-divider);
+  --crm-table-column-border: 0 solid transparent;
+  --crm-table-font-size: var(--crm-font-size);
+  --crm-table-padding: var(--crm-m);
+  --crm-table-header-border: 1px solid transparent;
+  --crm-table-header-bottom: 2px solid var(--crm-c-gray-300);
+  --crm-table-header-bg: var(--crm-c-page-background);
+  --crm-table-header-txt: inherit;
+  --crm-table-even-row: var(--crm-c-background2);
+  --crm-table-even-hover: var(--crm-c-blue-overlay);
+  --crm-table-odd-row: var(--crm-c-gray-025);
+  --crm-table-odd-hover: var(--crm-c-blue-overlay);
+  --crm-table-sort-col: var(--crm-c-gray-300);
+  --crm-table-sort-float: left; /* 'left', 'right' or 'none' */
+  --crm-table-sort-active-col: var(--crm-c-link);
+  --crm-table-compressed-width: auto;
+  --crm-table-nested-padding: var(--crm-r) var(--crm-m);
+  --crm-table-nested-head-border: 0 solid transparent;
+  --crm-table-nested-border: var(--crm-c-divider);
+  --crm-table-inset-bg: var(--crm-c-background3);
+}
+:root {
+/* Panels */
+  --crm-panel-shadow: var(--crm-block-shadow);
+  --crm-panel-background: white;
+  --crm-panel-border: var(--crm-c-divider);
+  --crm-panel-head-margin: 0px;
+}
+:root {
+/* Accordions */
+  --crm-expand-icon: "\f0da"; /* unicode value for FontAwesome icon */
+  --crm-expand-icon-color: var(--text);
+  --crm-expand-icon-spacing: var(--crm-m);
+  --crm-expand-transform: rotate(90deg);
+  --crm-expand-transition: transform .3s;
+  --crm-expand-radius: 4px; /* thames */
+  --crm-expand-gap: var(--crm-xs2) 0 0; /* space between multiple accordions */
+/* .crm-accordion-bold */
+  --crm-expand-header-bg: var(--crm-c-blue-overlay); /* thames */
+  --crm-expand-header-bg-active: var(--crm-c-blue-overlay); /* thames */
+  --crm-expand-header-color: var(--crm-c-blue-darker); /* thames */
+  --crm-expand-header-padding: 0.6rem 1.6rem 0.6rem 2.8rem; /* thames */
+  --crm-expand-header-weight: var(--crm-bold-weight);
+  --crm-expand-header-font: var(--crm-font-bold);
+  --crm-expand-header-border: unset;/*var(--crm-c-divider);*/ /* thames */
+  --crm-expand-header-border-width: unset; /*0 0 1px 0*/; /* thames */
+  --crm-expand-border: unset; /* thames */
+  --crm-expand-border-width: unset; /* thames */
+  --crm-expand-body-bg: var(--crm-c-blue-overlay); /* thames  todo check*/
+  --crm-expand-body-box-shadow: unset;
+  --crm-expand-body-padding: 0.25rem 2.8rem; /* thames */
+/* .crm-accordion-light */
+  --crm-expand2-header-bg: transparent;
+  --crm-expand2-header-bg-active: var(--crm-c-background-2);
+  --crm-expand2-header-weight: normal;
+  --crm-expand2-header-font: unset;
+  --crm-expand2-header-color: var(--crm-c-text);
+  --crm-expand2-header-border: unset;
+  --crm-expand2-header-border-width: unset;
+  --crm-expand2-header-padding: .6rem 1.6rem 0.6rem 2.8rem; /*var(--crm-s) var(--crm-m); */ /* thames */
+  --crm-expand2-border: unset;
+  --crm-expand2-border-width: unset;
+  --crm-expand2-body-bg: transparent;
+  --crm-expand2-body-padding: 0.25rem 2.8rem; /* thames */
+}
+:root {
+/* Alerts */
+  --crm-alert-padding: var(--crm-r); /* thames */
+  --crm-alert-margin: 0 0 var(--crm-m);
+  --crm-alert-border-width: 0; /* thames */
+/* Note 'help' suffix here is for the 'success' boxes. */
+  --crm-alert-background-help: var(--crm-c-blue-light); /* thames */
+  --crm-alert-border-help: unset; /* thames */
+  --crm-alert-text-help: unset; /* thames */
+  --crm-alert-background-warning: var(--crm-c-yellow-light);
+  --crm-alert-border-warning: var(--crm-c-yellow);
+  --crm-alert-text-warning: var(--crm-c-text);
+  --crm-alert-background-info: var(--crm-c-blue-light);
+  --crm-alert-border-info: var(--crm-c-blue);
+  --crm-alert-text-info: var(--crm-c-blue-darker);
+  --crm-alert-background-danger: var(--crm-c-red-light);
+  --crm-alert-border-danger: var(--crm-c-red);
+  --crm-alert-text-danger: var(--crm-c-red-dark);
+}
+:root {
+/* Form */
+  --crm-form-block-box-shadow: var(--crm-block-shadow);
+  --crm-form-block-background: var(--crm-c-background);
+  --crm-form-block-padding: var(--crm-m);
+  --crm-form-block-border-radius: var(--crm-roundness);
+  --crm-input-background: white; /* thames */
+  --crm-input-background-image: linear-gradient(top, #eee 1%, #fff 15%);
+  --crm-input-color: var(--crm-c-text);
+  --crm-input-border-color: #0000001a; /* thames */
+  --crm-input-border-radius: 3px;
+  --crm-input-active-ani: border-color .15s ease-in-out 0s;
+  --crm-input-box-shadow: none; /* thames */
+  --crm-input-padding: var(--crm-xs1) var(--crm-s2);
+  --crm-input-padding-large: var(--crm-s) var(--crm-m1);
+  --crm-input-height: var(--crm-l);
+  --crm-input-font-size: var(--crm-m3);
+  --crm-input-label-weight: bold;
+  --crm-input-label-font: var(--crm-font);
+  --crm-input-label-size: var(--crm-font-size);
+  --crm-input-label-width: 16ch; /* thames todo - where is this used? */
+  --crm-input-label-align: right;
+  --crm-input-description: #000000e8; /* darker for legibility */ /* thames */
+  --crm-input-dropdown-icon: "\f107";
+  --crm-input-radio-color: var(--crm-c-focus);
+  --crm-form-select-bg: var(--crm-c-background2);
+  --crm-inline-edit-border: 0 solid transparent;
+  --crm-inline-edit-bg: var(--crm-c-background);
+  --crm-fieldset-border-color: var(--crm-c-gray-400);
+  --crm-fieldset-border: 1px 0 0 0;
+  --crm-fieldset-padding: var(--crm-padding-reg) var(--crm-padding-small);
+  --crm-checkbox-list-col: var(--crm-c-text);
+}
+:root {
+/* Tabs */
+  --crm-tabs-bg: var(--crm-c-blue-overlay2);
+  --crm-tabs-padding: 0;
+  --crm-tabs-border: 4px solid var(--crm-c-blue-overlay2);
+  --crm-tabs-gap: var(--crm-s);
+  --crm-tab-bg: var(--crm-c-background2);
+  --crm-tab-bg-hover: var(--crm-c-blue-overlay);
+  --crm-tab-bg-active: white;
+  --crm-tab-hang: 0 0 calc(-1 * var(--crm-s)) 0; /* lip to extend tab flush with active region - set to 0 for no lip */ /* thames todo check */
+  --crm-tab-padding: var(--crm-s3) var(--crm-m) var(--crm-s) var(--crm-m);
+  --crm-tab-padding: var(--crm-m2) var(--crm-r1) var(--crm-m); /* thames todo check */
+  --crm-tab-col: var(--crm-c-text);
+  --crm-tab-weight: normal;
+  --crm-tab-font: unset;
+  --crm-tab-count-bg: var(--crm-c-info-text);
+  --crm-tab-count-col: var(--crm-c-info);
+  --crm-tab-roundness: var(--crm-r-3) var(--crm-r-3) 0 0;
+  --crm-tab-border: none;
+  --crm-tab-border-width: 0;
+  --crm-tab-border-active: 0 solid transparent;
+  --crm-tabs-2-border: var(--crm-tabs-border);
+}
+:root {
+/* Contact dashboard/summary */
+  --crm-dash-border: 0 solid transparent; /* thames */
+  --crm-dash-roundness: var(--crm-r-5); /* thames */
+  --crm-dash-direction: grid; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */ /* thames */
+  --crm-side-tabs-width: 220px; /* thames */
+  --crm-dash-tabs-flow: column; /* choose 'row' for tabs at top, or 'column' for tabs at side */ /* thames */
+  --crm-dash-tabs-gap: 0; /* thames */
+  --crm-dash-tabs-bg: var(--crm-c-blue-overlay); /* thames */
+  --crm-dash-tabs-padding: unset; /* thames */
+  --crm-dash-tab-bg: transparent;
+  --crm-dash-tabs-roundness: var(--crm-dash-roundness) 0 0 var(--crm-dash-roundness);
+  --crm-dash-tab-bg-hover: white; /* thames */
+  --crm-dash-tab-padding: var(--crm-m2) var(--crm-r1); /* thames */
+  --crm-dash-tab-border: var(--crm-dash-border); /* thames */
+  --crm-dash-tab-border-hover: 0 solid transparent;
+  --crm-dash-tab-border-width: 0; /* to remove border on one side for hanging tabs */
+  --crm-dash-tab-col: unset; /* thames */
+  --crm-dash-tab-count-bg: var(--crm-c-primary); /* thames */
+  --crm-dash-tab-count-col: var(--crm-c-light-text); /* thames */
+  --crm-dash-tab-width: 100%;
+  --crm-dash-tab-align: none;
+  --crm-dash-tab-hang: 0 0 -1px 0; /* lip to extend tab flush with active region - set to 0 for no lip */ /* thames */
+  --crm-dash-tab-radius: 0; /* thames */
+  --crm-dash-icon-size: var(--crm-r); /* thames */
+  --crm-dash-summary-row-bg: var(--crm-c-background);
+  --crm-dash-box-shadow: 0; /* thames */
+  --crm-dash-heading-inset: unset;
+  --crm-dash-panel-padding: var(--crm-r2); /* thames */
+  --crm-dash-panel-bg: white; /* thames */
+  --crm-dash-panel-border: 0;
+  --crm-dash-panel-radius: 0 var(--crm-dash-roundness) var(--crm-dash-roundness) 0;
+  --crm-dash-edit-border: 1px solid var(--crm-c-blue-dark); /* thames */
+  --crm-dash-block-padding: var(--crm-m2); /* thames */
+  --crm-dash-block-bg: var(--crm-c-background); /* thames */
+  --crm-dash-block-radius: var(--crm-roundness);
+  --crm-dash-label-bg: var(--crm-c-background); /* thames */
+  --crm-dash-header-bg: unset; /* thames */
+  --crm-dash-header-bg2: unset; /* thames */
+  --crm-dash-header-col: var(--crm-c-blue-darker); /* thames */
+  --crm-dash-header-size: var(--crm-r3);
+  --crm-dash-header-padding: unset; /* thames */
+  --crm-dash-image-right: 20px; /* distance from right of dashboard */
+}
+:root {
+/* Dialog */
+  --crm-dialog-bg: var(--crm-c-page-background);
+  --crm-dialog-padding: 0; /* thames */
+  --crm-dialog-radius: var(--crm-roundness);
+  --crm-dialog-line: unset;
+  --crm-dialog-inner-shadow: var(--crm-bottom-shadow);
+  --crm-dialog-header-bg: var(--crm-c-blue-overlay); /* thames */
+  --crm-dialog-header-col: var(--crm-c-blue-darker); /* thames */
+  --crm-dialog-header-size: var(--crm-r1);
+  --crm-dialog-header-padding: var(--crm-m1) var(--crm-r);
+  --crm-dialog-header-radius: var(--crm-dialog-radius);
+  --crm-dialog-header-border-col: transparent; /* thames */
+  --crm-dialog-body-bg: var(--crm-c-background);
+  --crm-dialog-body-padding: var(--crm-m);
+}
+:root {
+/* Dashlet */
+  --crm-dashlet-border: unset;
+  --crm-dashlet-bg: white;
+  --crm-dashlet-padding: var(--crm-s2);
+  --crm-dashlet-box-shadow: none;
+  --crm-dashlet-dashlets-bg: var(--crm-c-background);
+  --crm-dashlet-header-bg: white;
+  --crm-dashlet-header-col: var(--crm-expand-header-color);
+  --crm-dashlet-header-border: unset;
+  --crm-dashlet-header-border-width: unset;
+  --crm-dashlet-header-font-size: var(--crm-font-size);
+  --crm-dashlet-header-padding: var(--crm-s);
+  --crm-dashlet-content-padding: var(--crm-dashlet-padding) 0;
+  --crm-dashlet-tabs-bg: var(--crm-tabs-bg);
+  --crm-dashlet-tabs-border: 0;
+  --crm-dashlet-tab-bg: transparent;
+  --crm-dashlet-tab-border: unset;
+  --crm-dashlet-tab-color: unset;
+  --crm-dashlet-tab-active: var(--crm-tab-bg-active);
+  --crm-dashlet-tab-border-active: var(--crm-tab-border-active);
+  --crm-dashlet-tab-body-border: 0;
+  --crm-dashlet-tab-body-padding: var(--crm-m);
+  --crm-dashlet-radius: var(--crm-r-3);
+}
+:root {
+/* Button dropdowns */
+  --crm-dropdown-padding: var(--crm-s);
+  --crm-dropdown-radius: var(--crm-roundness);
+  --crm-dropdown-bg: white; /* thames */
+  --crm-dropdown-col: var(--crm-c-blue-darker); /* thames */
+  --crm-dropdown-hover: var(--crm-c-blue-dark); /* thames */
+  --crm-dropdown-hover-bg: var(--crm-c-blue-light); /* thames */
+  --crm-dropdown-border: 0;
+  --crm-dropdown-width: 23ch; /* thames */
+  --crm-dropdown-alert-bg: transparent; /* thames */
+  --crm-dropdown-2-bg: var(--crm-c-secondary);
+  --crm-dropdown-2-col: var(--crm-c-text);
+  --crm-dropdown-2-padding: var(--crm-padding-small);
+}
+:root {
+/* Notifications */
+  --crm-notify-background: white; /* thames */
+  --crm-notify-padding: var(--crm-m2);
+  --crm-notify-col: var(--crm-c-text); /* thames */
+  --crm-notify-accent-border: 0.875rem 0 0 0; /* adds a border to one/several sides of the notification - set to 0 for none */ /* thames */
+  --crm-notify-radius: 4px; /* thames */
+}
+:root {
+/* Icons */
+  --crm-icon-alert: "\f06a";
+  --crm-icon-success: "\f058";
+  --crm-icon-info: "\f05a";
+  --crm-icon-close: "\f00d";
+  --crm-icon-sort: "\f0dc";
+  --crm-icon-sort-desc: "\f0dd";
+  --crm-icon-sort-asc: "\f0de";
+  --crm-icon-alert-color: inherit;
+  --crm-icon-success-color: inherit;
+  --crm-icon-warning-color: inherit;
+  --crm-icon-info-color: inherit;
+}
+:root {
+/* Wizard */
+  --crm-wizard-width: fit-content;
+  --crm-wizard-margin: 0.5rem auto;
+  --crm-wizard-height: 30px;
+  --crm-wizard-radius: var(--crm-l);
+  --crm-wizard-angle: 0px;
+  --crm-wizard-active-col: var(--crm-c-light-text);
+  --crm-wizard-active-bg: var(--crm-c-link);
+  --crm-wizard-border: var(--crm-c-divider);
+  --crm-wizard-bg: var(--crm-c-page-background);
+}
+:root {
+/* Alpha filter */
+  --crm-filter-bg: var(--crm-c-blue-overlay);
+  --crm-filter-padding: var(--crm-m);
+  --crm-filter-item-bg: transparent;
+  --crm-filter-item-shadow: none;
+  --crm-filter-spacing: space-between;
+}
+:root {
+/* Frontend */
+  --crm-f-form-width: 700px;
+  --crm-f-box-shadow: var(--crm-block-shadow);
+  --crm-f-fieldset-bg: var(--crm-c-background);
+  --crm-f-fieldset-padding: var(--crm-r);
+  --crm-f-fieldset-margin: 0 0 var(--crm-padding-reg) 0;
+  --crm-f-fieldset-border: 0;
+  --crm-f-legend-align: center;
+  --crm-f-legend-size: var(--crm-r3);
+  --crm-f-form-padding: var(--crm-padding-reg);
+  --crm-f-form-layout: block; /* 'grid' = inline, 'block' = stacked */
+  --crm-f-label-position: unset;
+  --crm-f-label-align: left;
+  --crm-f-label-width: 200px;
+  --crm-f-label-weight: bold;
+  --crm-f-input-radius: var(--crm-roundness);
+  --crm-f-input-padding: var(--crm-r2) var(--crm-m2);
+  --crm-f-input-font-size: var(--crm-r1);
+  --crm-f-input-width: 100%; /* thames */
+  --crm-f-form-focus-bg: var(--crm-c-green);
+  --crm-f-form-error-bg: var(--crm-c-red);
+  --crm-f-logo-height: 40px;
+  --crm-f-logo-align: center; /* left, right or center */
+}
diff --git a/civicrm/ext/riverlea/streams/thames/css/civicrm.css b/civicrm/ext/riverlea/streams/thames/css/civicrm.css
new file mode 100755
index 0000000000000000000000000000000000000000..0fa0b2e54a48631e17615de114eb5c85aea50ed4
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/thames/css/civicrm.css
@@ -0,0 +1,609 @@
+@import url(../../../core/css/_base.css); /* resets and civi wide styles */
+@import url(../../../core/css/_cms.css); /* CMS-specific hacks/workarounds */
+@import url(../../../core/css/_core.css); /* components and utility classes */
+@import url(../../../core/css/_fixes.css); /* deprecated-Civi handling, hacks/workarounds. one day this will go. */
+
+/* Only affect body colour in standalone */
+html.cms-standalone body {
+  background-color: var(--crm-c-page-background);
+}
+
+#crm-container {
+  min-height: 100vh;
+  background-color: var(--crm-c-page-background);
+}
+
+.crm-container details {
+  background-color: #bad0df45; /* @todo fix this to a var. */
+  border: var(--crm-c-divider);
+}
+
+.crm-container summary {
+  background-color: var(--crm-c-green-dark); /* novar */
+  color: var(--crm-c-blue-darker); /* novar */
+  cursor: pointer; /* show it's clickable */
+  position: relative; /* so our animated triangle doesn't go walkies */
+}
+.crm-container :where(summary:hover,
+summary:focus) {
+  background-color: #b8daf4; /* novar */
+}
+
+/* RL introduces a border on focus which causes layout shift
+ * https://lab.civicrm.org/extensions/riverlea/-/issues/49
+ */
+.crm-container :focus,
+.crm-container .ui-dialog :focus {
+  border: none;
+}
+
+/* Replace Riverlea's FontAwesome icon with our own shape. */
+/* This rule is really sensitive to specificity. */
+/* .crm-container :where(details, .crm-accordion-wrapper)>:is(summary,.crm-accordion-header)::before {  */
+
+.crm-container details>summary::before /* accordion8 (recommended) */,
+.crm-container .crm-accordion-header::before, /* accordion1, accordion2, accordion6 */
+.crm-container .crm-collapsible .collapsible-title::before /* accordion3 */ {
+  content: "";
+  border: .4rem solid transparent;
+  border-left-color: var(--crm-expand-icon-color);
+  position: absolute;
+  margin-left: -1.5rem;
+  margin-top: 0.2rem;
+  transform: rotate(0);
+  transform-origin: .2rem 50%;
+  transition: transform .25s ease;
+}
+/* we have to sort of re-state these rules because the specificity of the above overrules the 'open' state
+ * note that a lot of non-recommended patterns use .collapsed, whereas details uses [open] - reverse logic.
+ * This covers accordion1, accordion2, accordion6.
+ */
+.crm-container .crm-accordion-wrapper.collapsed>.crm-accordion-header::before {
+  transform: none;
+  transform-origin: .2rem 50%;
+}
+.crm-container .crm-accordion-wrapper:not(.collapsed)>.crm-accordion-header::before {
+  transform: rotate(90deg);
+}
+/* the following 2 rules are for accordion3 and accordion4(still bit weird) */
+.crm-container .crm-collapsible.collapsed>.collapsible-title::before {
+  transform: none;
+  transform-origin: .2rem 50%;
+}
+.crm-container .crm-collapsible:not(.collapsed)>.collapsible-title::before {
+  transform: rotate(90deg);
+}
+
+/* Apply subtle animation */
+@keyframes crm-details-show {
+  from {
+    opacity: 0;
+    transform: translateY(-0.5rem);
+}
+  50% {
+    transform: translateY(-0.1rem);
+}
+}
+.crm-container :is(details,
+.crm-accordion-wrapper)>.crm-accordion-body {
+  padding: var(--crm-expand-body-padding);
+  animation: crm-details-show 240ms ease-in-out;
+}
+/* We don't want a different colour header bg on 'active' (open) but we do on hover
+ * This does't work yet.*/
+.crm-container .crm-accordion-bold>summary:is(:hover,
+:focus) {
+  background-color: var(--crm-c-blue-overlay2);
+}
+
+
+/* Alternate backgrounds */
+/* .crm-container details:not(.crm-accordion-light) details:not(.crm-accordion-light) { */
+/*   --crm-expand-header-bg: var(--crm-c-blue-overlay2); */
+/* } */
+
+
+/* ALERTS (these are in-page-flow boxes with info, not the (normally) popup notifications) */
+
+/* help boxes: put stripe down left with icon in it. */
+.crm-container #help,
+.crm-container .help {
+  border: none;
+  border-left: 2rem solid #7cb5e1;
+  border-radius: 0;
+}
+.crm-container #help::before,
+.crm-container .help::before {
+  color: #fff;
+  content: "\f0eb";
+  display: inline-block;
+  font-size: 2rem;
+  font: normal normal normal 14px/1 FontAwesome;
+  font-size: inherit;
+  margin-left: -2.3rem;
+  position: absolute;
+  text-rendering: auto;
+}
+
+.crm-container .alert-success {
+  background-color: var(--crm-c-green);
+}
+.crm-container :is(.status,
+.alert-warning,
+.messages.warning) {
+  --crm-roundness: 0.25rem;
+}
+
+/* BUTTONS */
+
+/*.crm-container .btn,
+.crm-container button,
+.crm-container .crm-button,
+.crm-container [type="button"],
+.crm-container [type="reset"],
+.crm-container [type="submit"] {
+  Sometimes we have lots of buttons and they wrap to a 2nd line. This puts some vertical space betwixt.
+  margin: var(--crm-m) 0;
+}
+
+/* Make it clear when you're hovering delete. */
+.crm-container .btn.btn-danger:hover,
+.crm-container .btn.btn-danger:focus,
+.crm-container a.button.delete-button:hover,
+.crm-container a.button.delete-button:focus,
+.crm-container a.button.delete:hover {
+  color: var(--crm-c-red-bright);
+}
+
+/* DIALOGS */
+
+/* I feel title, resize, close is a better order for buttons bs modal dialogs */
+/* .ui-dialog-title { flex: 1 1 auto; order: 1; } */
+/* .crm-dialog-titlebar-resize { order: 2; } */
+.crm-container.ui-dialog .ui-dialog-titlebar .ui-button.crm-dialog-titlebar-print {
+  display: none;
+}
+
+/* .modal-header .close { order: 3; } */
+/* .crm-container  .modal-header .ui-icon[class*=" fa-"] { font-size: 1rem; } */
+/* I don't know what problem this solved, but it creates an undesired left padding */
+/* #bootstrap-theme .modal-header::before, #bootstrap-theme .modal-header::after { */
+/*   display: none !important; */
+/* } */
+/**/
+/* #bootstrap-theme .modal-header { */
+/*   border:none; */
+/* } */
+/**/
+/* .crm-container button.close { */
+/*   color: var(--crm-c-blue-darker) !important; */
+/* } */
+
+/* DROPDOWNS */
+.crm-container .btn-group .dropdown-menu,
+.crm-container .btn.dropdown-toggle+.dropdown-menu {
+  border-radius: 4px;
+}
+
+/* FORMS */
+
+.crm-container .replace-plain {
+  background: #fff;
+}
+
+
+/* NOTIFICATIONS (the popup ones) */
+/* This produces a nicer hanging-indent type thing aligning the title and message to the left. */
+.crm-container .notify-content {
+  padding-left: 1.6rem;
+}
+
+/* Thames theme does hanging indent for the little <i>con, but happy for the list bullets to be outside of main text block as is narrow column. */
+#crm-notification-container div.ui-notify-message .notify-content ul,
+#crm-notification-container div.ui-notify-message .alert.notify-content ul {
+  margin: 1rem 0 0;
+  padding: 0;
+}
+
+/* Only include the margin under the h1 (h1!) when it's not empty. When it's empty the h1 only contains the <i>con and adding a margin messes up vertical alignment of the message. */
+#crm-notification-container div.ui-notify-message h1:not(:empty) {
+  margin-bottom: 1rem;
+}
+
+/* OTHER */
+/* 'alpha-filter' is the alphabetical pager you see, for example, on adv search results */
+.crm-container #alpha-filter li {
+  --crm-c-text: #0002; /* referenced in searchForm.css */
+}
+
+.crm-container .description:not(#help),
+.crm-container td.description {
+  font-size: 0.875rem;
+}
+
+
+/* Get rid of the ugly black overlay during loading */
+@keyframes aahblockoverlay {
+  0% {
+    background-color: var(--crm-c-blue-overlay);
+}
+  50% {
+    background-color: var(--crm-c-page-background);
+}
+  100% {
+    background-color: var(--crm-c-blue-overlay);
+}
+}
+.crm-container .blockUI.blockOverlay {
+  animation: aahblockoverlay 10s infinite;
+}
+
+/* CONTACT SUMMARY */
+/* Ensure the Summary tab's top left corner matches the radius of the container */
+.crm-contact-page #mainTabContainer .crm-contact-tabs-list>li:first-child a {
+  border-radius: var(--crm-dash-roundness) 0 0 0;
+}
+
+.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor:has(.crm-i) {
+  grid-template-columns: var(--crm-dash-icon-size) 1fr auto;
+  gap: 1ch;
+}
+
+.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor .crm-i:first-child {
+  justify-self: center;
+}
+
+/* make count badges more readable */
+.crm-container .ui-tabs ul.ui-tabs-nav a em,
+.crm-container .nav-tabs a .badge {
+  padding: 0 0.2rem;
+}
+
+/* RL has no margin-bottom so the actions ribbon touches the main contact block */
+div.crm-summary-contactname-block+.crm-actions-ribbon {
+  margin-bottom: var(--crm-r1) !important;
+}
+
+/* Use subgrid? No. Not responsive enough. */
+/* #contact-summary { grid-template-columns: 1fr 1fr; display: grid; } */
+/* .crm-container div.contact_panel { display: grid; grid-template-columns: subgrid; grid-column: 1 / 3; } */
+/* .contact_details { grid-template-columns: subgrid; grid-column: 1/ 3; } */
+
+/* Decorations to indicate an editable chunk. */
+#contact-summary .crm-edit-help {
+  color: transparent;
+  transition: 0.3s color;
+  opacity: 1;
+  font-size: 0.875rem;
+}
+
+#contact-summary .crm-edit-help .crm-i.fa-pencil {
+  color: var(--crm-c-blue-dark) !important; /* important overrides contactSummary.css */
+}
+
+#contact-summary .crm-inline-edit:hover .crm-edit-help {
+  color: var(--crm-c-blue-dark);
+}
+
+#contact-summary .crm-inline-edit:hover .crm-edit-help .crm-i.fa-pencil {
+  color: var(--crm-c-blue-dark) !important;
+}
+
+.crm-container div.crm-summary-row {
+  display: grid;
+  grid-template-columns: var(--crm-input-label-width) 1fr;
+}
+
+/* unbold the labels */
+.crm-container div.crm-summary-row div.crm-label {
+  font-weight: normal !important; /* important overrides contactSummary.css that comes after this stylesheet */
+}
+
+/* instead bold the values */
+.crm-container div.crm-summary-row div.crm-label+div {
+  font-weight: bold;
+}
+
+/* drop the ugly mahusive roadsign-atop unreadable icon for things like do not email */
+.fa-stack .crm-i.fa-stack-2x {
+  font-size: 1rem;
+}
+
+.fa-stack .crm-i.fa-stack-1x:first-child {
+  display: none;
+}
+
+#contact-summary div.crm-summary-row div.crm-label .fa-stack {
+  height: auto;
+  line-height: inherit;
+  vertical-align: baseline;
+  width: auto;
+}
+
+#contact-summary div.crm-summary-row div.crm-label :where(.fa-stack-1x,
+.fa-stack-2x) {
+  position: static;
+  width: auto;
+}
+
+/* when space is tight, wrap labels onto next row */
+.crm-container div.crm-summary-row {
+  flex-wrap: wrap;
+}
+
+/* */
+#contact-summary .crm-tag-item {
+  border-radius: var(--crm-r-1);
+}
+
+.crm-container div.crm-summary-row div.crm-label {
+  color: var(--crm-c-blue-darker);
+}
+
+/* INLINE EDIT */
+.crm-editable.crm-editable-editing {
+  background: white;
+  padding: 0.5em;
+  border-radius: 0.25em;
+  border: solid 1px var(--crm-c-blue);
+}
+
+.crm-container .crm-editable-form [type="submit"] {
+  color: var(--crm-c-green-dark) !important;
+}
+
+/* nice rounded tables. Pretty niche. */
+.crm-container table:not(.crm-inline-edit-form) {
+  border-radius: 0.4rem;
+  /* Fails when pop-up menus inside table need to extend beyond the table */
+  /* clip-path: inset(0 0 0 0 round 0.4rem); */
+  border-collapse: separate;
+  border-spacing: 0;
+}
+
+.crm-container table tr:first-child th:first-child {
+  border-radius: 0.4rem 0 0 0;
+}
+
+.crm-container table tr:first-child th:last-child {
+  border-radius: 0 0.4rem 0 0;
+}
+
+.crm-container table tr:last-child td:first-child {
+  border-radius: 0 0 0 0.4rem;
+}
+
+.crm-container table tr:last-child td:last-child {
+  border-radius: 0 0 0.4rem 0;
+}
+
+/* ensure thing that wrap tables allow scrolling in case the table overflows. */
+div:has(> table) {
+  overflow-x: auto;
+  max-width: 100%;
+}
+
+/* ...and adjust the individual row checkboxes to be in line
+ * Ah, no we have no way to target these.
+ * Would be nice if core markup identified this type of <td>
+ */
+
+/* apply hanging indent to sorting buttons */
+.crm-container tr a.sorting,
+.crm-container tr a.sorting_asc,
+.crm-container tr a.sorting_desc,
+.crm-container table.dataTable thead th.sorting,
+.crm-container table.dataTable thead th.sorting_asc,
+.crm-container table.dataTable thead th.sorting_desc,
+.crm-search-display th.crm-sortable-col {
+  padding-left: calc(var(--crm-table-padding, 0) + 1ch);
+}
+.crm-container tr a.sorting::after,
+.crm-container tr a.sorting_asc::after,
+.crm-container tr a.sorting_desc::after,
+.crm-container table.dataTable thead th.sorting::after,
+.crm-container table.dataTable thead th.sorting_asc::after,
+.crm-container table.dataTable thead th.sorting_desc::after,
+.crm-search-display th.crm-sortable-col::after,
+.crm-container tr a.sorting::before,
+.crm-container tr a.sorting_asc::before,
+.crm-container tr a.sorting_desc::before,
+.crm-container table.dataTable thead th.sorting::before,
+.crm-container table.dataTable thead th.sorting_asc::before,
+.crm-container table.dataTable thead th.sorting_desc::before,
+.crm-search-display th.crm-sortable-col::before {
+  position: absolute;
+  margin-left: -1em;
+}
+
+/* ...and in searchkit, this is terribly awkward and could be fixed with a core PR to provide more classes */
+.crm-container .table > thead > tr > th:has(.crm-search-table-column-sort-icon) {
+  padding-left: 1.5ch;
+}
+.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon {
+  position: absolute;
+  margin-left: -1.5ch;
+}
+
+/* Advanced search: override searchForm.css for slightly better aligned fields */
+.advanced-search-fields {
+  align-items: end;
+}
+
+/* tabs */
+.crm-container .ui-tabs:not(#mainTabContainer) {
+  background: white;
+  border: var(--crm-tabs-border) !important;
+  border-radius: var(--crm-r-3);
+  /* overrides #civicrm-news-feed.ui-tabs and .crm-contact-page #secondaryTabContainer */
+}
+/* breadcrumbs - links not accessibile using the nromal blue. */
+#civicrm-footer a,
+nav.breadcrumb a {
+  --crm-c-link: var(--crm-c-blue-darker);
+  --crm-c-link-hover: var(--crm-c-blue-dark);
+}
+#crm-contactname-content .crm-edit-help {
+  color: var(--crm-c-blue-dark) !important; /* override */
+  padding: 0.25rem !important;
+  opacity: 1 !important;
+}
+#crm-contactname-content > .crm-inline-block-content {
+  border: solid 1px transparent !important;
+}
+#crm-contactname-content:hover > .crm-inline-block-content {
+  border-color: var(--crm-c-blue-dark) !important;
+}
+
+/* Overrides for crmSearchAdmin.css */
+.crm-search-nav-tabs > div.btn-group {
+  top: 0 !important; /* the buttons already have padding, we don't need this. (crmSearchAdmin.css, L10 at time of writing) */
+}
+
+
+/* Make the tags list nicer. */
+.crm-tag-item {
+  padding: 0 1ch;
+  border-radius: 1rem;
+}
+
+/* clickable items in select2 drop downs should be blue like links. */
+.select2-drop.select2-drop-active.crm-container .select2-results > li {
+  color: var(--crm-c-blue-dark);
+}
+
+/* Breadcrumbs */
+html.crm-standalone  nav.breadcrumb>ol {
+  display: flex;
+  gap: var(--crm-m);
+}
+.breadcrumb ol li:not(:first-child)::before {
+  content: " \BB ";
+  margin-inline-end: var(--crm-m);
+  color: var(--crm-c-blue-dark);
+}
+
+/* override _fixes.css */
+.crm-container .font-red {
+  color: var(--crm-c-red-bright) !important;
+}
+/* override _icons.css */
+.crm-i.fa-ban.fa-stack-2x {
+  opacity: 1;
+}
+
+/* PHP errors, warnings */
+.standalone-errors {
+  background: #ead2ce;
+}
+
+/* e.g. search buttons followed by count of matches on SK screen */
+.crm-search-display .form-inline {
+  padding: var(--crm-padding-reg) 0;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: var(--crm-m);
+}
+
+/* Spinner. Replace the fa icon with something nicer. */
+.fa-spinner::before {
+  content: "";
+  width: 1rem;
+  height: 1rem;
+  min-width: 1rem;
+  min-height: 1rem;
+  border: dashed 1px white;
+  border-radius: 1rem;
+  animation: thames-spinner 1s infinite;
+}
+.fa-spin {
+  animation: none; /* placing animation on an odd-shaped item is a PITA for getting it 100% centred. */
+}
+/* Spinner for notifications .status-start notifications e.g. loading/saving. */
+.crm-status-box-outer.status-start .crm-status-box-inner {
+  /* Allow space for spinner.*/
+  padding-left: 2.5ch;
+}
+
+/* The spinner. */
+.crm-status-box-outer.status-start .crm-status-box-inner::before {
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  margin-left: -2.5ch;
+  display: block;
+  content: '';
+  line-height: 1;
+  animation: thames-spinner 1s infinite;
+  transform-origin: center;
+  width: 1.5ch;
+  height: 1.5ch;
+  border: dashed 1px white;
+  border-radius: 2ch;
+}
+
+@keyframes thames-spinner {
+  0% {
+    transform: none;
+}
+  100% {
+    transform: rotateZ(360deg);
+}
+}
+
+/* Font */
+@font-face {
+  font-display: swap;
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 400;
+  src: url('../../../fonts/lato-v24-latin-regular.woff2') format('woff2');
+}
+
+/* lato-italic - latin */
+@font-face {
+  font-display: swap;
+  font-family: 'Lato';
+  font-style: italic;
+  font-weight: 400;
+  src: url('../../../fonts/lato-v24-latin-italic.woff2') format('woff2');
+}
+
+/* lato-700 - latin */
+@font-face {
+  font-display: swap;
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 700;
+  src: url('../../../fonts/lato-v24-latin-700.woff2') format('woff2');
+}
+
+/* lato-700italic - latin */
+@font-face {
+  font-display: swap;
+  font-family: 'Lato';
+  font-style: italic;
+  font-weight: 700;
+  src: url('../../../fonts/lato-v24-latin-700italic.woff2') format('woff2');
+}
+
+/* Searchkit preview table headers go weird because of the button margin for the select-all button. */
+/* .crm-container .btn, .crm-container button, .crm-container .crm-button, .crm-container [type="button"], .crm-container [type="reset"], .crm-container [type="submit"]*/
+.crm-container th.crm-search-result-select {
+  --crm-btn-margin: 0;
+}
+
+/* Override _dropdowns.css */
+#afGuiEditor .af-gui-bar .dropdown-menu {
+  --crm-c-alert-text: var(--crm-c-red-dark);
+}
+/* Override contactSummary.css */
+#crm-contact-actions-list a.delete {
+  --crm-c-alert-text: var(--crm-c-red-dark);
+}
+#crm-contact-actions-list a.delete:hover,
+#crm-contact-actions-list a.delete:focus {
+  /* the hover state gives crm-c-red-dark to the background */
+  --crm-c-alert-text: var(--crm-c-red-light);
+}
diff --git a/civicrm/ext/riverlea/streams/walbrook/css/_dark.css b/civicrm/ext/riverlea/streams/walbrook/css/_dark.css
new file mode 100755
index 0000000000000000000000000000000000000000..3131b10d32fd0c59c611894b60fe02ebcacbc7fa
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/walbrook/css/_dark.css
@@ -0,0 +1,68 @@
+/* Walbrook dark mode settings */
+
+:root {
+  --crm-c-text: #fff;
+  --crm-c-link: var(--crm-c-amber);
+  --crm-c-link-hover: var(--crm-c-amber-light);
+  --crm-c-text-light: var(--crm-c-darkest);
+  --crm-c-background: var(--crm-c-gray-900);
+  --crm-c-page-background: var(--crm-c-darkest);
+  --crm-c-code-background: var(--crm-c-background2);
+  --crm-c-background2: var(--crm-c-gray-900);
+  --crm-c-background3: var(--crm-c-gray-800);
+  --crm-c-background4: var(--crm-c-gray-700);
+  --crm-c-success: #58a458;
+  --crm-red-alert: #b24b4f;
+  --crm-c-alert: #ff899a;
+  --crm-alert-background-danger: var(--crm-c-red);
+  --crm-blue-info: #2c99a4;
+  --crm-c-blue-dark: #043353;
+  --crm-c-green-light: #468847;
+  --crm-c-green: #55aa57;
+  --crm-c-green-dark: #dff0d8;
+  --crm-c-gray-700: #535252;
+  --crm-c-gray-600: #67676a;
+  --crm-c-gray-500: #6c6c6c;
+  --crm-c-divider: 1px solid var(--crm-c-gray-500);
+  /* And others */
+  --crm-block-shadow: 0 3px 18px 0 rgb(0,0,0);
+  --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0);
+  --crm-heading-bg: var(--crm-c-blue-dark);
+  --crm-dashlet-bg: var(--crm-c-background2);
+  --crm-dashlet-header-bg: var(--crm-c-background3);
+  --crm-expand-header-bg: var(--crm-c-blue-dark);
+  --crm-expand-body-bg: var(--crm-c-background3);
+  --crm-expand-body-border: 0;
+  --crm-dash-header-bg: var(--crm-c-background4);
+  --crm-dash-block-bg: var(--crm-c-background2);
+  --crm-dash-label-bg: transparent;
+  --crm-dash-tabs-bg: var(--crm-c-background3);
+  --crm-dash-panel-bg: var(--crm-c-background2);
+  --crm-dash-tab-bg-hover: var(--crm-c-background2);
+  --crm-dropdown-bg: var(--crm-c-background);
+  --crm-dropdown-2-bg: var(--crm-c-background);
+  --crm-tabs-bg: var(--crm-c-background3);
+  --crm-panel-border-col: var(--crm-c-gray-500);
+  --crm-input-border-color: var(--crm-c-gray-500);
+  --crm-table-odd-row: var(--crm-c-gray-800);
+  --crm-table-odd-hover: var(--crm-c-gray-700);
+  --crm-table-even-row: var(--crm-c-gray-700);
+  --crm-table-even-hover: var(--crm-c-gray-600);
+  --crm-alert-text-help: var(--crm-c-text-light);
+  --crm-alert-text-warning: var(--crm-c-text-light);
+  --crm-alert-background-info: var(--crm-c-blue-dark);
+  --crm-alert-text-info: var(--crm-c-blue-light);
+  --crm-c-inactive: var(--crm-c-gray-400);
+  --crm-input-color: var(--crm-c-text);
+  --crm-input-description: var(--crm-c-gray-300);
+  --crm-checkbox-list-col: var(--crm-c-text-light);
+  --crm-alert-text-help: var(--crm-c-text);
+  --crm-dialog-header-border-col: transparent;
+  --crm-dialog-header-bg: var(--crm-c-background2);
+  --crm-dialog-body-bg: var(--crm-c-background2);
+  --crm-notify-background: var(--crm-c-darkest);
+  --crm-wizard-active-bg: var(--crm-c-dark-teal);
+  --crm-form-block-background: var(--crm-c-background2);
+  --crm-btn-cancel-bg: #9b3d4b;
+  --crm-panel-border: 1px;
+}
diff --git a/civicrm/ext/riverlea/streams/walbrook/css/_variables.css b/civicrm/ext/riverlea/streams/walbrook/css/_variables.css
new file mode 100755
index 0000000000000000000000000000000000000000..51475e99ef3742a99e78fa3fb6ef6d3a217de317
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/walbrook/css/_variables.css
@@ -0,0 +1,218 @@
+/*
+    Name: Walbrook;
+    Description: Based on Shoreditch theme. Named after after River Walbrook, which runs under Shoreditch, London;
+    Riverlea version: 1.1.0;
+*/
+
+:root {
+  --crm-version: 'Walbrook, v' var(--crm-release);
+/* Fonts */
+  --crm-system-fonts: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",sans-serif;
+  --crm-font: "Civitype", "Open Sans", var(--crm-system-fonts);
+  --crm-font-bold: "Civitype-bold", var(--crm-system-fonts);
+  --crm-font-italic: "Civitype-italic", var(--crm-system-fonts);
+  --crm-font-bold-italic: "Civitype", var(--crm-system-fonts);
+/* Colour names */
+  --crm-c-gray-900: #222831;
+  --crm-c-gray-800: #393a3f;
+  --crm-c-gray-700: #75767b;
+  --crm-c-gray-300: #cad5d7;
+  --crm-c-gray-200: #d3dee2;
+  --crm-c-gray-100: #ebeff0;
+  --crm-c-gray-050: #f3f6f7;
+  --crm-c-gray-025: #fcfcfc;
+  --crm-c-blue: #0071bd;
+  --crm-c-blue-light: #dff0f4;
+  --crm-c-blue-dark: #66afe9;
+  --crm-c-blue-darker: #005c99;
+  --crm-c-green: #44cb7e;
+  --crm-c-green-light: #bcecd1;
+  --crm-c-green-dark: var(--crm-c-text);
+  --crm-c-red: #cf3458;
+  --crm-c-red-light: #ecb0be;
+  --crm-c-red-dark: var(--crm-c-text);
+  --crm-c-amber: #e6ab5e;
+  --crm-c-yellow: #f8e80b;
+  --crm-c-teal: #399389;
+/* Practical colours */
+  --crm-c-link: var(--crm-c-blue);
+  --crm-c-link-hover: var(--crm-c-blue-dark);
+  --crm-c-page-background: #e8eef0; /* background to page body */
+  --crm-c-background: #fff; /* background to page header, often form block & dialog bg */
+  --crm-c-drag-background: var(--crm-c-background4); /* background for drag/drop regions, select2 highlight */
+  --crm-c-code-background: var(--crm-c-background3); /* background for code regions */
+  --crm-c-primary: var(--crm-c-blue);
+  --crm-c-primary-hover: var(--crm-c-blue-darker);
+  --crm-c-primary-text: var(--crm-c-light-text); /* text colour when on top of primary */
+  --crm-c-secondary: var(--crm-c-purple);
+  --crm-c-secondary-hover: var(--crm-c-purple-dark);
+  --crm-c-success: var(--crm-c-green);
+  --crm-c-success-text: var(--crm-c-dark-text);
+  --crm-c-alert: var(--crm-c-red);
+  --crm-c-warning-text: var(--crm-c-dark-text);
+  --crm-c-info-text: var(--crm-c-light-text);
+/* Shadows */
+  --crm-block-shadow: 0 3px 18px 0 rgba(48,40,40,.25);
+  --crm-popup-shadow: var(--crm-block-shadow);
+  --crm-body-inset: inset 0 10px 8px -10px rgba(0,0,0,.15),inset 0 -11px 8px -9px rgba(0,0,0,.15);
+/* Sizes */
+  --crm-roundness: 2px;
+  --crm-padding-inset: 0; /* to support flush theme variations */
+  --crm-page-padding: 0; /* Margin left/right */
+/* Type */
+  --crm-link-decoration-hover: none;
+  --crm-heading-bg: var(--crm-c-background3);
+  --crm-heading-padding: var(--crm-m2) var(--crm-m);
+  --crm-heading-margin: 0;
+  --crm-heading-radius: 0;
+/* Buttons */
+  --crm-btn-radius: 2px;
+  --crm-btn-padding-block: var(--crm-m); /* padding for top and bottom, one value */
+  --crm-btn-padding-inline: var(--crm-r2); /* padding for left and right, one value */
+  --crm-btn-small-padding: var(--crm-s1) var(--crm-m1);
+  --crm-btn-height: 40px;
+/* Tables */
+  --crm-table-outside-border: var(--crm-c-divider);
+  --crm-table-background: var(--crm-c-background);
+  --crm-table-header-bottom: var(--crm-c-divider);
+  --crm-table-header-bg: var(--crm-c-background);
+  --crm-table-even-row: #fff;
+  --crm-table-odd-row: var(--crm-c-gray-050);
+  --crm-table-even-hover: var(--crm-c-gray-025);
+  --crm-table-odd-hover: var(--crm-c-gray-100);
+  --crm-table-sort-col: var(--crm-c-gray-500);
+  --crm-table-nested-padding: 0 0 var(--crm-r) 0;
+  --crm-table-nested-head-border: 2px solid var(--crm-c-gray-300);
+  --crm-table-nested-border: 0 solid transparent;
+/* Panels */
+  --crm-panel-head-margin: var(--crm-m2);
+/* Accordions */
+  --crm-expand-icon: "\f105"; /* unicode value for FontAwesome icon */
+  --crm-expand-icon-color: unset;
+  --crm-expand-icon-spacing: var(--crm-m3);
+  --crm-expand-gap: 0;
+/* .crm-accordion-bold */
+  --crm-expand-header-bg: var(--crm-c-background2);
+  --crm-expand-header-bg-active: var(--crm-c-background3);
+  --crm-expand-header-color: var(--crm-c-text);
+  --crm-expand-header-padding: var(--crm-m2) var(--crm-m3);
+  --crm-expand-border: unset;
+  --crm-expand-border-width: unset;
+  --crm-expand-body-bg: transparent;
+  --crm-expand-body-box-shadow: var(--crm-body-inset);
+/* .crm-accordion-light */
+  --crm-expand2-header-bg: var(--crm-c-primary);
+  --crm-expand2-header-bg-active: var(--crm-c-primary-hover);
+  --crm-expand2-header-weight: bold;
+  --crm-expand2-header-font: var(--crm-font-bold);
+  --crm-expand2-header-color: var(--crm-c-primary-text);
+  --crm-expand2-header-padding: var(--crm-expand-header-padding);
+  --crm-expand2-border: 0;
+  --crm-expand2-body-bg: transparent;
+  --crm-expand2-body-padding: 0;
+/* Alerts */
+  --crm-alert-padding: var(--crm-r) var(--crm-r2);
+  --crm-alert-text-help: var(--crm-c-text);
+  --crm-alert-background-warning: var(--crm-c-amber-light);
+  --crm-alert-border-warning: var(--crm-c-amber);
+  --crm-alert-background-info: var(--crm-c-primary);
+  --crm-alert-border-info: var(--crm-c-primary);
+  --crm-alert-text-info: var(--crm-c-primary-text);
+  --crm-alert-text-danger: var(--crm-c-text);
+/* Form */
+  --crm-form-block-padding: var(--crm-r);
+  --crm-form-block-border-radius: 0;
+  --crm-input-background: var(--crm-c-background);
+  --crm-input-background-image: none;
+  --crm-input-color: #464354;
+  --crm-input-border-color: #c2cfd8;
+  --crm-input-border-radius: var(--crm-roundness);
+  --crm-input-box-shadow: inset 0 0 3px 0 rgba(0,0,0,.2);
+  --crm-input-padding: var(--crm-xs1) var(--crm-m1);
+  --crm-input-label-weight: bold;
+  --crm-input-label-font: var(--crm-font-bold);
+  --crm-input-radio-color: var(--crm-c-primary);
+  --crm-inline-edit-border: 1px solid var(--crm-c-gray-900);
+  --crm-fieldset-border-color: unset;
+  --crm-fieldset-border: 0;
+  --crm-fieldset-padding: 0;
+/* Tabs */
+  --crm-tabs-bg: var(--crm-c-background2);
+  --crm-tabs-padding: var(--crm-m) var(--crm-m) 0 var(--crm-m);
+  --crm-tabs-border: var(--crm-c-divider);
+  --crm-tab-roundness: 2px 2px 0 0;
+  --crm-tab-bg-hover: var(--crm-c-background);
+  --crm-tab-bg-active: var(--crm-c-background);
+  --crm-tab-hang: 0 0 -1px 0; /* lip to extend tab flush with active region - set to 0 for no lip */
+  --crm-tab-padding: var(--crm-m2) var(--crm-r1) var(--crm-m);
+  --crm-tab-font: var(--crm-font-bold);
+  --crm-tab-count-bg: transparent;
+  --crm-tab-count-col: var(--crm-c-text);
+  --crm-tab-border-active: var(--crm-c-divider);
+/* Contact dashboard */
+  --crm-dash-border: 0 solid transparent;
+  --crm-dash-roundness: 0;
+  --crm-dash-direction: grid; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */
+  --crm-side-tabs-width: 220px;
+  --crm-dash-tabs-flow: column; /* choose 'row' for tabs at top, or 'column' for tabs at side */
+  --crm-dash-tabs-gap: 0;
+  --crm-dash-tabs-bg: var(--crm-c-background);
+  --crm-dash-tabs-padding: unset;
+  --crm-dash-tab-bg: transparent;
+  --crm-dash-tab-bg-hover: var(--crm-c-background3);
+  --crm-dash-tab-padding: var(--crm-r) var(--crm-r1);
+  --crm-dash-tab-border: var(--crm-dash-border);
+  --crm-dash-tab-border-hover: unset;
+  --crm-dash-tab-col: unset;
+  --crm-dash-tab-count-bg: var(--crm-c-primary);
+  --crm-dash-tab-count-col: var(--crm-c-light-text);
+  --crm-dash-tab-hang: 0 0 -1px 0; /* lip to extend tab flush with active region - set to 0 for no lip */
+  --crm-dash-icon-size: var(--crm-m2);
+  --crm-dash-box-shadow: inset 0 3px 18px -5px rgba(0, 0, 0, 0.25);
+  --crm-dash-panel-padding: var(--crm-r2);
+  --crm-dash-edit-border: 1px dashed var(--crm-c-gray-900);
+  --crm-dash-block-padding: var(--crm-m2);
+  --crm-dash-block-bg: var(--crm-c-background);
+  --crm-dash-label-bg: var(--crm-c-background);
+  --crm-dash-header-bg: var(--crm-c-gray-900);
+  --crm-dash-header-bg2: var(--crm-c-gray-800);
+  --crm-dash-header-col: var(--crm-c-light-text);
+  --crm-dash-header-size: var(--crm-l);
+  --crm-dash-header-padding: var(--crm-r) var(--crm-r1);
+  --crm-dash-image-size: 100px;
+  --crm-dash-image-radius: 200px;
+  --crm-dash-image-right: 30px; /* distance from right of dashboard */
+  --crm-dash-image-top: 30px; /* distance from top of dashboard */
+  --crm-dash-image-border: 2px solid #fff;
+/* Dialog */
+  --crm-dialog-bg: var(--crm-c-background);
+  --crm-dialog-padding: 0;
+  --crm-dialog-line: var(--crm-c-divider);
+  --crm-dialog-header-bg: var(--crm-c-background2);
+  --crm-dialog-header-col: var(--crm-c-text);
+/* Dashlet */
+  --crm-dashlet-border: var(--crm-tab-border);
+  --crm-dashlet-bg: var(--crm-c-background);
+  --crm-dashlet-padding: 0;
+  --crm-dashlet-header-bg: var(--crm-c-secondary);
+  --crm-dashlet-header-col: var(--crm-c-light-text);
+  --crm-dashlet-header-padding: var(--crm-padding-reg);
+  --crm-dashlet-tabs-border: var(--crm-tabs-border);
+/* Notifications */
+  --crm-notify-background: var(--crm-c-background);
+  --crm-notify-col: var(--crm-c-text);
+  --crm-notify-accent-border: 0 0 0 3px; /* adds a border to one/several sides of the notification - set to 0 for none */
+/* Wizard */
+  --crm-wizard-width: auto;
+  --crm-wizard-margin: calc(-1 * var(--crm-form-block-padding)) calc(-1 * var(--crm-form-block-padding)) 0;
+  --crm-wizard-height: 62px;
+  --crm-wizard-radius: 0;
+  --crm-wizard-angle: 20px;
+  --crm-wizard-active-col: var(--crm-c-link);
+  --crm-wizard-active-bg: var(--crm-c-page-background);
+  --crm-wizard-border: 1px solid var(--crm-c-page-background);
+  --crm-wizard-bg: var(--crm-c-background);
+/* Frontend */
+  --crm-f-legend-align: unset;
+  --crm-f-legend-size: var(--crm-r2);
+}
diff --git a/civicrm/ext/riverlea/streams/walbrook/css/civicrm.css b/civicrm/ext/riverlea/streams/walbrook/css/civicrm.css
new file mode 100644
index 0000000000000000000000000000000000000000..a08341162f72ad7f372f0863ed004e3694d9434e
--- /dev/null
+++ b/civicrm/ext/riverlea/streams/walbrook/css/civicrm.css
@@ -0,0 +1,28 @@
+@import url(../../../core/css/_base.css); /* resets and civi wide styles */
+@import url(../../../core/css/_cms.css); /* CMS-specific hacks/workarounds */
+@import url(../../../core/css/_core.css); /* components and utility classes */
+@import url(../../../core/css/_fixes.css); /* deprecated-Civi handling, hacks/workarounds. one day this will go. */
+
+/* Font */
+
+@font-face {
+  font-family: Civitype;
+  font-style: normal;
+  font-weight: 400;
+  font-display: swap;
+  src: url("../../../fonts/inter-v18-latin-regular.woff2") format("woff2");
+}
+@font-face {
+  font-family: Civitype-italic;
+  font-style: italic;
+  font-weight: 400;
+  font-display: swap;
+  src: url("../../../fonts/inter-v18-latin-italic.woff2") format("woff2");
+}
+@font-face {
+  font-family: Civitype-bold;
+  font-style: normal;
+  font-weight: 600;
+  font-display: swap;
+  src: url("../../../fonts/inter-v18-latin-600.woff2") format("woff2");
+}
diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php b/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php
index 1e5a732e285cfb69a5a56517fb1ae0d68fc1128f..6e8d4852f6d34733553266b4ac3509902e1e2383 100644
--- a/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php
+++ b/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php
@@ -30,18 +30,30 @@ class Refresh extends AbstractAction {
       ->execute()->single();
 
     $apiParams = $display['saved_search_id.api_params'];
+    // Add orderBy to api params
     foreach ($display['settings']['sort'] ?? [] as $item) {
       $apiParams['orderBy'][$item[0]] = $item[1];
     }
+    // Set select clause to match display columns
+    $select = [];
+    foreach ($display['settings']['columns'] as $column) {
+      foreach ($apiParams['select'] as $selectExpr) {
+        if ($selectExpr === $column['key'] || str_ends_with($selectExpr, " AS {$column['key']}")) {
+          $select[] = $selectExpr;
+          continue 2;
+        }
+      }
+    }
+    $apiParams['select'] = $select;
     $api = Request::create($display['saved_search_id.api_entity'], 'get', $apiParams);
     $query = new Api4SelectQuery($api);
     $query->forceSelectId = FALSE;
-    $select = $query->getSql();
+    $sql = $query->getSql();
     $tableName = _getSearchKitDisplayTableName($displayName);
     $columnSpecs = array_column($display['settings']['columns'], 'spec');
     $columns = implode(', ', array_column($columnSpecs, 'name'));
     \CRM_Core_DAO::executeQuery("TRUNCATE TABLE `$tableName`");
-    \CRM_Core_DAO::executeQuery("INSERT INTO `$tableName` ($columns) $select");
+    \CRM_Core_DAO::executeQuery("INSERT INTO `$tableName` ($columns) $sql");
     $result[] = [
       'refresh_date' => \CRM_Core_DAO::singleValueQuery("SELECT NOW()"),
     ];
diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php
index 121ef5a38858f7ead00647c43bc9010d910f1038..007d308923c7bbb008e1dbd266b97236d4c57178 100644
--- a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php
+++ b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php
@@ -151,17 +151,28 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
       foreach ($this->display['settings']['columns'] as $column) {
         $columns[] = $this->formatColumn($column, $data);
       }
-      $style = $this->getCssStyles($this->display['settings']['cssRules'] ?? [], $data);
-      // Add hierarchical styles
-      if (!empty($this->display['settings']['hierarchical'])) {
-        $style[] = 'crm-hierarchical-row crm-hierarchical-depth-' . ($data['_depth'] ?? '0');
-        $style[] = empty($data['_depth']) ? 'crm-hierarchical-parent' : 'crm-hierarchical-child';
-      }
       $row = [
         'data' => $data,
         'columns' => $columns,
-        'cssClass' => implode(' ', $style),
       ];
+      $style = $this->getCssStyles($this->display['settings']['cssRules'] ?? [], $data);
+      // Add hierarchical styles
+      if (!empty($this->display['settings']['hierarchical'])) {
+        $depth = $data['_depth'] ?? 0;
+        $style[] = 'crm-hierarchical-row crm-hierarchical-depth-' . $depth;
+        if ($depth) {
+          $style[] = 'crm-hierarchical-child';
+        }
+        if (!empty($data['_descendents'])) {
+          $style[] = 'crm-hierarchical-parent';
+          if (($this->display['settings']['collapsible'] ?? FALSE) === 'closed') {
+            $row['collapsed'] = TRUE;
+          }
+        }
+      }
+      if ($style) {
+        $row['cssClass'] = implode(' ', $style);
+      }
       if (isset($record[$keyName])) {
         $row['key'] = $record[$keyName];
       }
@@ -325,7 +336,7 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
       // Convert dots to nested arrays which are more Smarty-friendly
       foreach ($data as $key => $value) {
         $parent = &$vars;
-        $allKeys = $keys = array_map('CRM_Utils_String::munge', explode('.', $key));
+        $allKeys = $keys = array_map(fn($s) => \CRM_Utils_String::munge($s, '_', 0), explode('.', $key));
         while (count($keys) > 1) {
           $level = array_shift($keys);
           $parent[$level] = $parent[$level] ?? [];
@@ -1352,6 +1363,7 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
     // Add `depth_` column for hierarchical entity displays
     if (!empty($this->display['settings']['hierarchical'])) {
       $this->addSelectExpression('_depth');
+      $this->addSelectExpression('_descendents');
     }
     // Add draggable column (typically "weight")
     if (!empty($this->display['settings']['draggable'])) {
diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php
index 3874293604b519335de4c0d6913b2a6286f551aa..2722f290a39a8429bd574eaa7e50564d1393aa7b 100644
--- a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php
+++ b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php
@@ -179,14 +179,14 @@ class Download extends AbstractRunAction {
 
     // Header row
     foreach (array_values($columns) as $index => $col) {
-      $sheet->setCellValueByColumnAndRow($index + 1, 1, $col['label']);
+      $sheet->setCellValue([$index + 1, 1], $col['label']);
       $sheet->getColumnDimensionByColumn($index)->setAutoSize(TRUE);
     }
 
     foreach ($rows as $rowNum => $data) {
       $colNum = 1;
       foreach ($columns as $index => $col) {
-        $sheet->setCellValueByColumnAndRow($colNum++, $rowNum + 2, $this->formatColumnValue($col, $data['columns'][$index]));
+        $sheet->setCellValue([$colNum++, $rowNum + 2], $this->formatColumnValue($col, $data['columns'][$index]));
       }
     }
 
diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php
index 8b1b6377bf41c8a2736779b2ae1f5b8226a21c14..1453e1f31794c60fd702dfa45958f6686b86c4cb 100644
--- a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php
+++ b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php
@@ -219,6 +219,9 @@ class GetSearchTasks extends \Civi\Api4\Generic\AbstractAction {
       $task['entity'] = $entity['name'];
       // Add default for number of rows action requires
       $task += ['number' => '> 0'];
+      if (!empty($task['apiBatch']['fields'])) {
+        $this->getApiBatchFields($task);
+      }
     }
 
     usort($tasks[$entity['name']], function($a, $b) {
@@ -228,6 +231,19 @@ class GetSearchTasks extends \Civi\Api4\Generic\AbstractAction {
     $result->exchangeArray($tasks[$entity['name']]);
   }
 
+  private function getApiBatchFields(array &$task) {
+    $fieldInfo = civicrm_api4($task['entity'], 'getFields', [
+      'checkPermissions' => $this->getCheckPermissions(),
+      'action' => $task['apiBatch']['action'] ?? 'update',
+      'select' => ['name', 'label', 'description', 'input_type', 'data_type', 'serialize', 'options', 'fk_entity', 'required', 'nullable'],
+      'loadOptions' => ['id', 'name', 'label', 'description', 'color', 'icon'],
+      'where' => [['name', 'IN', array_column($task['apiBatch']['fields'], 'name')]],
+    ])->indexBy('name');
+    foreach ($task['apiBatch']['fields'] as &$field) {
+      $field += $fieldInfo[$field['name']] ?? [];
+    }
+  }
+
   public static function fields(): array {
     return [
       [
diff --git a/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php b/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php
index 70c6f3abd990242563082c01d16e922b2caa02d5..50fc3543f2f377300fb9d547df8a8a538f11aa4e 100644
--- a/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php
+++ b/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php
@@ -132,8 +132,15 @@ class SKEntitySubscriber extends AutoService implements EventSubscriberInterface
   private function formatFieldSpec(array $column, array $expr): array {
     // Strip the pseuoconstant suffix
     [$name, $suffix] = array_pad(explode(':', $column['key']), 2, NULL);
-    // Sanitize the name
-    $name = \CRM_Utils_String::munge($name, '_', 255);
+    // Sanitize the name and limit to 58 characters.
+    // 64 characters is the max for some versions of SQL, minus the length of "index_" = 58.
+    if (strlen($name) <= 58) {
+      $name = \CRM_Utils_String::munge($name, '_', NULL);
+    }
+    // Append a hash of the full name to trimmed names to keep them unique but predictable
+    else {
+      $name = \CRM_Utils_String::munge($name, '_', 42) . substr(md5($name), 0, 16);
+    }
     $spec = [
       'name' => $name,
       'data_type' => $expr['dataType'],
diff --git a/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php b/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php
index 97f3f2c470aa599f8fbfb484abab4bf7ad75ad57..2f02f9d86bacd3795692217ea0555a8a23b3d101 100644
--- a/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php
+++ b/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php
@@ -15,8 +15,13 @@ namespace Civi\Api4\Service\Spec\Provider;
 use Civi\Api4\Query\Api4SelectQuery;
 use Civi\Api4\Service\Spec\FieldSpec;
 use Civi\Api4\Service\Spec\RequestSpec;
+use Civi\Core\Service\AutoService;
 
-class SearchSegmentExtraFieldProvider implements Generic\SpecProviderInterface {
+/**
+ * @service
+ * @internal
+ */
+class SearchSegmentExtraFieldProvider extends AutoService implements Generic\SpecProviderInterface {
 
   /**
    * @inheritDoc
diff --git a/civicrm/ext/search_kit/Civi/Search/Admin.php b/civicrm/ext/search_kit/Civi/Search/Admin.php
index 81a1b5e9b435ae5c3af666d662a9dee81f8394bb..00d230bdf68ba21679296b7c2b34906beda7739e 100644
--- a/civicrm/ext/search_kit/Civi/Search/Admin.php
+++ b/civicrm/ext/search_kit/Civi/Search/Admin.php
@@ -327,7 +327,8 @@ class Admin {
                   'description' => '',
                   'entity' => $targetEntityName,
                   'conditions' => self::getJoinConditions($keyField['name'], $alias . '.' . $reference->getTargetKey(), $dynamicValue, $dynamicCol),
-                  'defaults' => self::getJoinDefaults($alias, $targetEntity),
+                  // No default conditions for straight joins as they ought to be direct 1-1
+                  'defaults' => [],
                   'alias' => $alias,
                   'multi' => FALSE,
                 ];
@@ -506,28 +507,30 @@ class Admin {
    * @throws \CRM_Core_Exception
    * @throws \Civi\API\Exception\NotImplementedException
    */
-  private static function getJoinDefaults(string $alias, ...$entities):array {
+  private static function getJoinDefaults(string $alias, ...$entities): array {
     $conditions = [];
     foreach ($entities as $entity) {
-      foreach ($entity['ui_join_filters'] ?? [] as $fieldName) {
-        $field = civicrm_api4($entity['name'], 'getFields', [
-          'select' => ['options', 'data_type'],
-          'where' => [['name', '=', $fieldName]],
+      if (!empty($entity['ui_join_filters'])) {
+        $filterFields = civicrm_api4($entity['name'], 'getFields', [
+          'select' => ['name', 'options', 'data_type'],
+          'where' => [['name', 'IN', $entity['ui_join_filters']]],
           'loadOptions' => ['name'],
-        ])->first();
-        $value = '';
-        if ($field['data_type'] === 'Boolean') {
-          $value = TRUE;
-        }
-        elseif (isset($field['options'][0])) {
-          $fieldName .= ':name';
-          $value = json_encode($field['options'][0]['name']);
+        ])->indexBy('name');
+        foreach ($filterFields as $fieldName => $field) {
+          $value = '';
+          if ($field['data_type'] === 'Boolean') {
+            $value = TRUE;
+          }
+          elseif (isset($field['options'][0])) {
+            $fieldName .= ':name';
+            $value = json_encode($field['options'][0]['name']);
+          }
+          $conditions[] = [
+            $alias . '.' . $fieldName,
+            '=',
+            $value,
+          ];
         }
-        $conditions[] = [
-          $alias . '.' . $fieldName,
-          '=',
-          $value,
-        ];
       }
     }
     return $conditions;
diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js
index a7d79f9360f83657ef69ac57038a027b5ac27281..31d84bba5de48741288e5436a0df0079be742406 100644
--- a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js
+++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js
@@ -16,10 +16,19 @@
         searchMeta.getSearchTasks(ctrl.apiEntity).then(function(tasks) {
           ctrl.allTasks = tasks;
         });
+        // Set default mode for editing old searches that were created before this setting was added
+        if (this.display.settings.actions) {
+          this.display.settings.actions_display_mode = this.display.settings.actions_display_mode || 'menu';
+        }
       };
 
       this.toggleActions = function() {
         this.display.settings.actions = !this.display.settings.actions;
+        if (!this.display.settings.actions) {
+          delete this.display.settings.actions_display_mode;
+        } else {
+          this.display.settings.actions_display_mode = 'menu';
+        }
         ctrl.menuOpen = false;
       };
 
diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html
index b6ae4adc2c6694b2e4166867c5573476535fb669..5c9c6c5209d3309acfdcb97f4a4958e16b857b96 100644
--- a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html
+++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html
@@ -24,3 +24,7 @@
     </ul>
   </div>
 </div>
+<select ng-if="$ctrl.display.settings.actions" class="form-control" ng-model="$ctrl.display.settings.actions_display_mode">
+  <option value="menu">{{:: ts('Dropdown') }}</option>
+  <option value="buttons">{{:: ts('Buttons') }}</option>
+</select>
diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html
index 9047870ccd8e81e9ba7f8f3d65f5dc6486eb07e4..94ff75c591b4413edd51ad9c5ba5c48731ffff8c 100644
--- a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html
+++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html
@@ -18,6 +18,11 @@
           <span>{{:: ts('Show nested hierarchy') }}</span>
         </label>
       </div>
+      <select class="form-control" ng-if="$ctrl.display.settings.hierarchical" ng-model="$ctrl.display.settings.collapsible" title="{{:: ts('Should hierarchical tree be collapsible') }}">
+        <option value="">{{:: ts('Not collapsible') }}</option>
+        <option value="open">{{:: ts('Collapsible - Open') }}</option>
+        <option value="closed">{{:: ts('Collapsible - Closed') }}</option>
+      </select>
     </div>
     <div class="form-inline">
       <search-admin-tasks-config display="$ctrl.display" api-entity="$ctrl.apiEntity" api-params="$ctrl.apiParams"></search-admin-tasks-config>
diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html b/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html
index b6b0e653cbfb4d88ee319dadc13f778739f033d8..0a78256345ae1ebe7c422650e2d398ea7a2f3212 100644
--- a/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html
+++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html
@@ -1,7 +1,7 @@
 <div class="crm-search-display crm-search-display-table">
   <div class="form-inline">
     <div class="btn-group" ng-include="'~/crmSearchDisplay/SearchButton.html'"></div>
-    <crm-search-tasks-menu ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager"></crm-search-tasks-menu>
+    <crm-search-tasks-menu ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager" display-mode="'menu'"></crm-search-tasks-menu>
     <span ng-include="'~/crmSearchDisplay/ResultCount.html'"></span>
   </div>
   <table class="{{:: $ctrl.settings.classes.join(' ') }}">
diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js b/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js
index 2ed8d61528b6e147b79f75753cc21c831a897c5b..4f568d5d535e45781f70f7b3eae1a2e8c5227f01 100644
--- a/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js
+++ b/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js
@@ -2,7 +2,7 @@
   "use strict";
 
   // Trait provides base methods and properties common to all search display types
-  angular.module('crmSearchDisplay').factory('searchDisplayBaseTrait', function(crmApi4, crmStatus) {
+  angular.module('crmSearchDisplay').factory('searchDisplayBaseTrait', function($timeout, $interval, crmApi4, crmStatus) {
 
     // Return a base trait shared by all search display controllers
     // Gets mixed in using angular.extend()
@@ -45,26 +45,37 @@
         // Integrations can pass in `total-count="somevar" to keep track of the number of results returned
         // FIXME: Additional hack to directly update tabHeader for contact summary tab. It would be better to
         // decouple the contactTab code into a separate directive that checks totalCount.
-        var contactTab = $element.closest('.crm-contact-page .ui-tabs-panel').attr('id');
-        if (contactTab || ctrl.hasOwnProperty('totalCount')) {
+        let contactTab = $element.closest('.crm-contact-page .ui-tabs-panel').attr('id');
+        // Only the first display in a tab gets to control the count
+        if (contactTab && !$element.is($('#' + contactTab + ' [search][display]').first())) {
+          contactTab = null;
+        }
+        let hasCounter = contactTab || ctrl.hasOwnProperty('totalCount');
+        if (hasCounter) {
           $scope.$watch('$ctrl.rowCount', function(rowCount) {
             // Update totalCount only if no user filters are set
             if (typeof rowCount === 'number' && angular.equals({}, ctrl.getAfformFilters())) {
-              ctrl.totalCount = rowCount;
-              // The first display in a tab gets to control the count
-              if (contactTab && $element.is($('#' + contactTab + ' [search][display]').first())) {
-                CRM.tabHeader.updateCount(contactTab.replace('contact-', '#tab_'), rowCount);
-              }
+              setTotalCount(rowCount);
             }
           });
         }
 
+        function setTotalCount(rowCount) {
+          if (ctrl.hasOwnProperty('totalCount')) {
+            ctrl.totalCount = rowCount;
+          }
+          if (contactTab) {
+            CRM.tabHeader.updateCount(contactTab.replace('contact-', '#tab_'), rowCount);
+          }
+        }
+
         // Popup forms in this display or surrounding Afform trigger a refresh
         $element.closest('form').on('crmPopupFormSuccess crmFormSuccess', function() {
           ctrl.rowCount = null;
           ctrl.getResultsPronto();
         });
 
+        // When filters are changed, trigger callbacks and refresh search (if there's no search button)
         function onChangeFilters() {
           ctrl.page = 1;
           ctrl.rowCount = null;
@@ -85,22 +96,60 @@
         }
 
         if (this.afFieldset) {
-          $scope.$watch(this.afFieldset.getFieldData, onChangeFilters, true);
           // Add filter title to Afform
-          this.onPostRun.push(function(apiResults) {
+          this.onPostRun.push(function (apiResults) {
             if (apiResults.run.labels && apiResults.run.labels.length && $scope.$parent.addTitle) {
               $scope.$parent.addTitle(apiResults.run.labels.join(' '));
             }
           });
         }
-        if (this.settings.pager && this.settings.pager.expose_limit) {
-          $scope.$watch('$ctrl.limit', onChangePageSize);
+
+        // Set up watches to refresh search results when needed.
+        // Because `angular.$watch` runs immediately as well as on subsequent changes,
+        // this also kicks off the first run of the search (if there's no search button).
+        function setUpWatches() {
+          if (ctrl.afFieldset) {
+            $scope.$watch(ctrl.afFieldset.getFieldData, onChangeFilters, true);
+          }
+          if (ctrl.settings.pager && ctrl.settings.pager.expose_limit) {
+            $scope.$watch('$ctrl.limit', onChangePageSize);
+          }
+          $scope.$watch('$ctrl.filters', onChangeFilters, true);
+        }
+
+        // If the search display is visible, go ahead & run it
+        if ($element.is(':visible')) {
+          setUpWatches();
+        }
+        // Wait until display is visible
+        else {
+          let checkVisibility = $interval(() => {
+            if ($element.is(':visible')) {
+              $interval.cancel(checkVisibility);
+              setUpWatches();
+            }
+          }, 250);
         }
-        $scope.$watch('$ctrl.filters', onChangeFilters, true);
+
+        // Manually fetch total count if:
+        // - there is a counter (e.g. a contact summary tab)
+        // - and the search is hidden or not set to auto-run
+        // - or afform filters are present which would interfere with an accurate total
+        // (wait a brief timeout to allow more important things to happen first)
+        $timeout(function() {
+          if (hasCounter && (!(ctrl.loading || ctrl.results) || !angular.equals({}, ctrl.getAfformFilters()))) {
+            var params = ctrl.getApiParams('row_count');
+            // Exclude afform filters
+            params.filters = ctrl.filters;
+            crmApi4('SearchDisplay', 'run', params).then(function(result) {
+              setTotalCount(result.count);
+            });
+          }
+        }, 900);
       },
 
       hasExtraFirstColumn: function() {
-        return this.settings.actions || this.settings.draggable || (this.settings.tally && this.settings.tally.label);
+        return this.settings.actions || this.settings.draggable || this.settings.collapsible || (this.settings.tally && this.settings.tally.label);
       },
 
       getFilters: function() {
diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html
index 733524da68bbf79ea50f711c84625c1231f48337..f932165bac53f46f75d700d320b5fce4789fb98f 100644
--- a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html
+++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html
@@ -2,7 +2,7 @@
   <div class="alert alert-info crm-search-display-description" ng-if="$ctrl.settings.description">{{:: $ctrl.settings.description }}</div>
   <div class="form-inline">
     <div class="btn-group" ng-include="'~/crmSearchDisplay/SearchButton.html'" ng-if="$ctrl.settings.button"></div>
-    <crm-search-tasks-menu ng-if="$ctrl.settings.actions && $ctrl.taskManager" ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager"></crm-search-tasks-menu>
+    <crm-search-tasks-menu ng-if="$ctrl.settings.actions && $ctrl.taskManager" ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager" display-mode="$ctrl.settings.actions_display_mode || 'menu'"></crm-search-tasks-menu>
     <span ng-if="$ctrl.settings.headerCount" ng-include="'~/crmSearchDisplay/ResultCount.html'"></span>
     <div class="form-group pull-right" ng-include="'~/crmSearchDisplay/toolbar.html'" ng-if="$ctrl.toolbar"></div>
   </div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html
index 481d222c3bd450df88d919260edde3abae076cf6..c2d0ba981fadaea61e21edc56f561a498ba33115 100644
--- a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html
+++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html
@@ -1,9 +1,10 @@
-<tr ng-repeat="(rowIndex, row) in $ctrl.results" data-entity-id="{{:: row.key }}">
+<tr ng-repeat="(rowIndex, row) in $ctrl.results" data-entity-id="{{:: row.key }}" ng-if="!row.hidden">
   <td ng-if=":: $ctrl.hasExtraFirstColumn()" class="crm-search-ctrl-column {{:: row.cssClass }}">
     <span ng-if=":: $ctrl.settings.draggable" class="crm-draggable" title="{{:: ts('Drag to reposition') }}">
       <i class="crm-i fa-arrows-v"></i>
     </span>
     <input ng-if=":: $ctrl.settings.actions" type="checkbox" ng-checked="$ctrl.isRowSelected(row)" ng-click="$ctrl.toggleRow(row, $event)" ng-disabled="!!$ctrl.loadingAllRows">
+    <crm-search-display-toggle-collapse ng-if=":: $ctrl.settings.collapsible" rows="$ctrl.results" row-index="rowIndex"></crm-search-display-toggle-collapse>
   </td>
   <td ng-repeat="(colIndex, colData) in row.columns" ng-include="'~/crmSearchDisplay/colType/' + $ctrl.settings.columns[colIndex].type + '.html'" title="{{:: colData.title }}" class="crm-search-col-type-{{:: $ctrl.settings.columns[colIndex].type }} {{:: row.cssClass }} {{:: colData.cssClass }}" data-field-name="{{:: colData.edit.value_key }}">
   </td>
diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.component.js b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.component.js
new file mode 100644
index 0000000000000000000000000000000000000000..369b8e1857ac80189775552afeb5e46d9b479414
--- /dev/null
+++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.component.js
@@ -0,0 +1,63 @@
+(function(angular, $, _) {
+  "use strict";
+
+  angular.module('crmSearchDisplayTable').component('crmSearchDisplayToggleCollapse', {
+    bindings: {
+      rows: '<',
+      rowIndex: '<',
+    },
+    templateUrl: '~/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html',
+    controller: function($scope, $element) {
+      const ts = $scope.ts = CRM.ts('org.civicrm.search_kit'),
+        ctrl = this;
+
+      this.$onInit = function() {
+        const row = this.getRow();
+        if (row.collapsed && row.data._descendents) {
+          row.collapsed = false;
+          this.toggleCollapsed();
+        } else {
+          row.collapsed = false;
+        }
+        // Button is irrelevant without any descendents; hide it without breaking the layout.
+        if (!row.data._descendents) {
+          $element.css('visibility', 'hidden');
+        }
+      };
+
+      this.getRow = function () {
+        return this.rows[this.rowIndex];
+      };
+
+      this.isCollapsed = function() {
+        return this.getRow().collapsed && this.getRow().data._descendents;
+      };
+
+      this.countDescendents = function () {
+        return this.getRow().data._descendents;
+      };
+
+      this.toggleCollapsed = function() {
+        const row = this.getRow();
+        row.collapsed = !row.collapsed;
+
+        let descendentsEnd = this.rowIndex + row.data._descendents;
+        for (let i = this.rowIndex + 1; i <= descendentsEnd; i++) {
+          let hide = row.collapsed;
+          // We're past the end of the page
+          if (!ctrl.rows[i]) {
+            return;
+          }
+          ctrl.rows[i].hidden = hide;
+          // Hiding rows is simple, just hide all of them, but when un-hiding we need to skip over
+          // the children of collapsed elements.
+          if (!hide && ctrl.rows[i].collapsed) {
+            i += ctrl.rows[i].data._descendents;
+          }
+        }
+      };
+
+    }
+  });
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html
new file mode 100644
index 0000000000000000000000000000000000000000..2aaafc82776258c5bf24826549b4fd4780eea988
--- /dev/null
+++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html
@@ -0,0 +1,4 @@
+<button class="btn" type="button" title="{{:: ts('Show sub-rows') }}" ng-click="$ctrl.toggleCollapsed()">
+  <i class="crm-i" ng-class="{'fa-caret-right': $ctrl.isCollapsed(), 'fa-caret-down': !$ctrl.isCollapsed()}"></i>
+  <span ng-show="$ctrl.isCollapsed()">{{:: $ctrl.countDescendents() }}</span>
+</button>
diff --git a/civicrm/ext/search_kit/ang/crmSearchPage.module.js b/civicrm/ext/search_kit/ang/crmSearchPage.module.js
index a11836662e7a7731183037da7aed44dde89fb810..e0885584216b6ed0e04dedfad7eed84a33b6e234 100644
--- a/civicrm/ext/search_kit/ang/crmSearchPage.module.js
+++ b/civicrm/ext/search_kit/ang/crmSearchPage.module.js
@@ -8,18 +8,28 @@
       // Load & render a SearchDisplay
       $routeProvider.when('/display/:savedSearchName/:displayName?', {
         controller: 'crmSearchPageDisplay',
-        // Dynamic template generates the directive for each display type
         template: '<h1 crm-page-title>{{:: $ctrl.display.label }}</h1>\n' +
-          '<form ng-include="\'~/crmSearchPage/displayType/\' + $ctrl.display.type + \'.html\'" id="bootstrap-theme"></form>',
+          '<form id="bootstrap-theme">' +
+          // Edit link for authorized users
+          '  <div class="pull-right btn-group" ng-if="$ctrl.editLink">' +
+          '    <a class="btn btn-sm" ng-href="{{:: $ctrl.editLink }}"><i class="crm-i fa-pencil"></i> {{:: ts("Edit Search") }}</a>' +
+          '  </div>' +
+          // Dynamic template generates the directive for each display type
+          // @see \Civi\Search\Display::getPartials()
+          '  <div ng-include="\'~/crmSearchPage/displayType/\' + $ctrl.display.type + \'.html\'"></div>' +
+          '</form>',
         resolve: {
           // Load saved search display
           info: function($route, crmApi4) {
             var params = $route.current.params;
             var apiCalls = {
               search: ['SavedSearch', 'get', {
-                select: ['name', 'api_entity'],
-                where: [['name', '=', params.savedSearchName]]
-              }, 0]
+                select: ['id', 'name', 'api_entity'],
+                where: [['name', '=', params.savedSearchName]],
+                chain: {
+                  checkAccess: ['SavedSearch', 'checkAccess', {action: 'update', values: {id: '$id'}}, 0],
+                },
+              }, 0],
             };
             if (params.displayName) {
               apiCalls.display = ['SearchDisplay', 'get', {
@@ -38,10 +48,13 @@
 
     // Controller for displaying a search
     .controller('crmSearchPageDisplay', function($scope, $location, info) {
-      var ctrl = $scope.$ctrl = this;
+      const ctrl = $scope.$ctrl = this;
+      const ts = $scope.ts = CRM.ts('org.civicrm.search_kit');
       this.display = info.display;
       this.searchName = info.search.name;
       this.apiEntity = info.search.api_entity;
+      // Format edit link if user has access
+      this.editLink = info.search.checkAccess.access ? CRM.url('civicrm/admin/search#/edit/' + info.search.id) : false;
 
       $scope.$watch(function() {return $location.search();}, function(params) {
         ctrl.filters = params;
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js
index 9267fc09ddc85ef648095f4364c6529680dc9dc8..1da0fd0aa65b43a3f5ec0a033b788a0652c8a98f 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js
@@ -4,16 +4,19 @@
   angular.module('crmSearchTasks').component('crmSearchInput', {
     bindings: {
       field: '<',
-      'op': '<',
-      'format': '<',
-      'optionKey': '<'
+      op: '<',
+      format: '<',
+      optionKey: '<',
+      showLabel: '<',
     },
     require: {ngModel: 'ngModel'},
     templateUrl: '~/crmSearchTasks/crmSearchInput/crmSearchInput.html',
     controller: function($scope) {
-      var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'),
+      const ts = $scope.ts = CRM.ts('org.civicrm.search_kit'),
         ctrl = this;
 
+      this.domId = 'search-input-' + Math.random().toString(36).substr(2, 9);
+
       this.$onInit = function() {
 
         $scope.$watch('$ctrl.value', function() {
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html
index 3f3a110dfb717445dfcf009251604a9aa814ebd8..98b88a757911d9496b5264cbce23a2c0575cac48 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html
@@ -1,13 +1,16 @@
+<label ng-if="$ctrl.showLabel && $ctrl.field.label" for="{{:: $ctrl.domId }}">
+  {{ $ctrl.field.label }}
+</label>
 <div ng-switch="$ctrl.op || ''" class="form-group">
 
   <div ng-switch-when="BETWEEN|NOT BETWEEN" ng-switch-when-separator="|" class="form-group">
-    <crm-search-input-val field="$ctrl.field" op="'&gt;'" option-key="$ctrl.optionKey" ng-model="$ctrl.value[0]" class="form-group"></crm-search-input-val>
+    <crm-search-input-val field="$ctrl.field" op="'&gt;'" option-key="$ctrl.optionKey" ng-model="$ctrl.value[0]" class="form-group" label-id="{{:: $ctrl.domId }}"></crm-search-input-val>
     -
     <crm-search-input-val field="$ctrl.field" op="'&lt;'" option-key="$ctrl.optionKey" ng-model="$ctrl.value[1]" class="form-group"></crm-search-input-val>
   </div>
 
   <div ng-switch-default class="form-group">
-    <crm-search-input-val field="$ctrl.field" op="$ctrl.op" option-key="$ctrl.optionKey" ng-model="$ctrl.value" class="form-group"></crm-search-input-val>
+    <crm-search-input-val field="$ctrl.field" op="$ctrl.op" option-key="$ctrl.optionKey" ng-model="$ctrl.value" class="form-group" label-id="{{:: $ctrl.domId }}"></crm-search-input-val>
   </div>
 
 </div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js
index 8225a2f7e8ba8002a170424cdc7e19ff1e4e752f..692edd958b69fcbc232576ce8d8d11bfa08bf06d 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js
@@ -5,7 +5,8 @@
     bindings: {
       field: '<',
       'op': '<',
-      'optionKey': '<'
+      'optionKey': '<',
+      labelId: '@',
     },
     require: {ngModel: 'ngModel'},
     template: '<div class="form-group" ng-include="$ctrl.getTemplate()"></div>',
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html
index f5c7508be3e60f83e8176ea8763a6dbdb6015e7f..00e632119ed3ac6ebafb5c6eb26f0d4ecab7a99d 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html
@@ -1,5 +1,5 @@
 <div class="form-group">
-  <select class="form-control" ng-if="$ctrl.isMulti() === false" ng-model="$ctrl.dateType" ng-change="$ctrl.changeDateType()">
+  <select id="{{:: $ctrl.labelId }}" class="form-control" ng-if="$ctrl.isMulti() === false" ng-model="$ctrl.dateType" ng-change="$ctrl.changeDateType()">
     <option value="fixed">{{:: ts('Pick Date') }}</option>
     <option value="range">{{:: ts('Date Range') }}</option>
     <option value="now">{{:: ts('Now') }}</option>
@@ -10,8 +10,8 @@
   <div class="form-group" ng-switch="$ctrl.dateType">
 
     <div class="form-group" ng-switch-when="fixed">
-      <input class="form-control" crm-ui-datepicker="{time: $ctrl.field.data_type === 'Timestamp'}" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="!$ctrl.isMulti()">
-      <input class="form-control" crm-multi-select-date ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="$ctrl.isMulti()">
+      <input class="form-control" crm-ui-datepicker="{time: $ctrl.field.data_type === 'Timestamp'}" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" ng-if="!$ctrl.isMulti()">
+      <input class="form-control" crm-multi-select-date ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" ng-if="$ctrl.isMulti()">
     </div>
 
     <div class="form-group" ng-switch-when="range">
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html
index 26e2bf84a520438da763b98e7483ed65fa0e8409..7103359bd60f00191c681e9c8b43c02a7b32670a 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html
@@ -1,6 +1,6 @@
 <div class="form-group" ng-if="!$ctrl.isMulti()" >
-  <input type="email" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
+  <input type="email" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required">
 </div>
 <div class="form-group" ng-if="$ctrl.isMulti()" >
-  <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
+  <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
 </div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html
index e6da4f7c9f32f86e5688155cda367f24e37f16f5..f9c9202dd264e3fdbe41edf1a61ea1ae096baaa9 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html
@@ -1,6 +1,6 @@
 <div class="form-group" ng-if="!$ctrl.isMulti()" >
-  <input type="number" step="any" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
+  <input type="number" step="any" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required">
 </div>
 <div class="form-group" ng-if="$ctrl.isMulti()" >
-  <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
+  <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
 </div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html
index d578956db527ac93a407ac91005f4d20abc9abaa..d91b385db24675f3873b98aff11b979edcc7fc0c 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html
@@ -1,6 +1,6 @@
 <div class="form-group" ng-if="!$ctrl.isMulti()" >
-  <input type="number" step="1" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
+  <input type="number" step="1" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required">
 </div>
 <div class="form-group" ng-if="$ctrl.isMulti()" >
-  <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
+  <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
 </div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html
index 71a043d276078475b4bb7b28758b73e018eb2cfd..65068cdfc65d29a8847eeb526f682d720a9b6d16 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html
@@ -1,6 +1,6 @@
 <div class="form-group" ng-if="!$ctrl.isMulti()" >
-  <input type="text" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
+  <input type="text" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required">
 </div>
 <div class="form-group" ng-if="$ctrl.isMulti()" >
-  <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
+  <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
 </div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js
index b2fc5953742c4347007a49de5585f11b710f744f..fed074981f691095ede16aeaad7e7a8b7fa1f37d 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js
@@ -9,11 +9,30 @@
 
     this.entityTitle = this.getEntityTitle();
 
-    // If no confirmation message, skip straight to processing
-    if (!ctrl.apiBatch.confirmMsg) {
+    // If no selectable fields or confirmation message, skip straight to processing
+    if (!ctrl.apiBatch.confirmMsg && !ctrl.apiBatch.fields) {
       ctrl.start(ctrl.apiBatch.params);
     }
 
+    if (ctrl.apiBatch.fields) {
+      ctrl.apiBatch.params = ctrl.apiBatch.params || {};
+      ctrl.apiBatch.params.values = ctrl.apiBatch.params.values || {};
+      // Set values from field defaults
+      ctrl.apiBatch.fields.forEach((field) => {
+        let value = '';
+        if ('default_value' in field) {
+          value = field.default_value;
+        } else if (field.serialize || field.data_type === 'Array') {
+          value = [];
+        } else if (field.data_type === 'Boolean') {
+          value = true;
+        } else if (field.options && field.options.length) {
+          value = field.options[0].id;
+        }
+        ctrl.apiBatch.params.values[field.name] = value;
+      });
+    }
+
     this.onSuccess = function(result) {
       var entityTitle = this.getEntityTitle(result.batchCount);
       CRM.alert(ts(ctrl.apiBatch.successMsg, {1: result.batchCount, 2: entityTitle}), ts('%1 Complete', {1: ctrl.taskTitle}), 'success');
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html
index 6352890efba5f25e71264e60679d2fcad48ddf87..f8f4517e77f770991121d66bf3abfcd5c049af25 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html
@@ -1,6 +1,9 @@
 <div id="bootstrap-theme" crm-dialog="crmSearchTask">
-  <form ng-controller="crmSearchTaskApiBatch as $ctrl">
+  <form name="crmSearchTaskApiBatchForm" ng-controller="crmSearchTaskApiBatch as $ctrl">
     <p><strong ng-if="model.apiBatch.confirmMsg">{{:: ts(model.apiBatch.confirmMsg, {1: model.ids.length, 2: $ctrl.entityTitle}) }}</strong></p>
+    <div class="form-inline" ng-repeat="field in model.apiBatch.fields">
+      <crm-search-input class="form-group" ng-model="model.apiBatch.params.values[field.name]" field="field" show-label="true"></crm-search-input>
+    </div>
     <hr />
     <div ng-if="$ctrl.run" class="crm-search-task-progress">
       <h5>{{:: ts(model.apiBatch.runMsg, {1: model.ids.length, 2: $ctrl.entityTitle}) }}</h5>
@@ -8,6 +11,6 @@
     </div>
 
     <crm-dialog-button text="ts('Cancel')" icons="{primary: 'fa-times'}" on-click="$ctrl.cancel()" disabled="$ctrl.run" ></crm-dialog-button>
-    <crm-dialog-button ng-if="model.apiBatch.confirmMsg" text="model.taskTitle" icons="{primary: $ctrl.run ? 'fa-spin fa-spinner' : 'fa-check'}" on-click="$ctrl.start(model.apiBatch.params)" disabled="$ctrl.run" ></crm-dialog-button>
+    <crm-dialog-button ng-if="model.apiBatch.confirmMsg || model.apiBatch.fields" text="model.taskTitle" icons="{primary: $ctrl.run ? 'fa-spin fa-spinner' : 'fa-check'}" on-click="$ctrl.start(model.apiBatch.params)" disabled="$ctrl.run || !crmSearchTaskApiBatchForm.$valid" ></crm-dialog-button>
   </form>
 </div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js
index 042d94cae707db16ac2f90126c62e3149f4d3eb6..e7e36396359b3bf29525cef2726eee9d43c87b7d 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js
@@ -18,10 +18,8 @@
         loadOptions: ['id', 'name', 'label', 'description', 'color', 'icon'],
         where: [['deprecated', '=', false], ["readonly", "=", false]],
       }],
-      entityInfo: ['Entity', 'get', {select: ['primary_key'], where: [['name', '=', this.entity]]}, 0]
     }).then(function(results) {
         ctrl.fields = results.getFields;
-        ctrl.idField = results.entityInfo.primary_key[0];
       });
 
     this.updateField = function(index) {
@@ -39,7 +37,7 @@
         if (ctrl.add) {
           var field = ctrl.getField(ctrl.add),
             value = '';
-          if (field.serialize) {
+          if (field.serialize || field.data_type === 'Array') {
             value = [];
           } else if (field.data_type === 'Boolean') {
             value = true;
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html
index 411329fb9ce4cc20a4f114a54de092221b4ad064..74dcb42dbb4700ce9917dccb92a96ec835f35f25 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html
@@ -10,7 +10,7 @@
     </div>
     <div ng-if="$ctrl.run" class="crm-search-task-progress">
       <h5>{{:: ts('Updating %1 %2...', {1: model.ids.length, 2: $ctrl.entityTitle}) }}</h5>
-      <crm-search-batch-runner entity="model.entity" action="update" params="$ctrl.run" ids="model.ids" success="$ctrl.onSuccess()" error="$ctrl.onError()" id-field="{{:: $ctrl.idField }}"></crm-search-batch-runner>
+      <crm-search-batch-runner entity="model.entity" action="update" params="$ctrl.run" ids="model.ids" success="$ctrl.onSuccess()" error="$ctrl.onError()" id-field="{{:: $ctrl.entityInfo.primary_key[0] }}"></crm-search-batch-runner>
     </div>
 
     <crm-dialog-button text="ts('Cancel')" icons="{primary: 'fa-times'}" on-click="$ctrl.cancel()" disabled="$ctrl.run" ></crm-dialog-button>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-buttons.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-buttons.html
new file mode 100644
index 0000000000000000000000000000000000000000..48cf2ec44c6d54657d7dacf820b7ae08e22f0662
--- /dev/null
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-buttons.html
@@ -0,0 +1,8 @@
+<button type="button"
+    class="btn btn-default crm-search-task-button"
+    ng-disabled="!$ctrl.isActionAllowed(action)"
+    ng-repeat="action in $ctrl.taskManager.tasks"
+    title="{{ $ctrl.getActionTitle(action) }}"
+    ng-click="$ctrl.doAction(action)">
+  <i class="crm-i {{:: action.icon }}"></i> {{:: action.title }}
+</button>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-menu.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-menu.html
new file mode 100644
index 0000000000000000000000000000000000000000..d09c1ff5466f7af4fc18ab73cef807583249772b
--- /dev/null
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-menu.html
@@ -0,0 +1,18 @@
+<button type="button"
+  ng-disabled="!$ctrl.taskManager.isDisplayReady()"
+  ng-click="$ctrl.openMenu = true; $ctrl.taskManager.getMetadata();"
+  class="btn dropdown-toggle btn-default crm-search-task-menu"
+  title="{{:: ts('Perform action on selected items.') }}"
+  data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
+>
+  <i class="crm-i fa-pencil"></i>
+  {{:: ts('Action') }} <span class="caret"></span>
+</button>
+<ul class="dropdown-menu" ng-if="$ctrl.openMenu">
+  <li ng-class="{disabled: !$ctrl.isActionAllowed(action)}" ng-repeat="action in $ctrl.taskManager.tasks" title="{{ $ctrl.getActionTitle(action) }}">
+    <a href ng-click="$ctrl.doAction(action); $ctrl.openMenu = false;"><i class="crm-i {{:: action.icon }}"></i> {{:: action.title }}</a>
+  </li>
+  <li class="disabled" ng-if="!$ctrl.taskManager.tasks">
+    <a href><i class="crm-i fa-spinner fa-spin"></i></a>
+  </li>
+</ul>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js
index f8fd366bf087756d6203ad2225aec2c1e5000644..1a2a1e4cf7129f054e882f581f089473222ae22a 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js
@@ -4,9 +4,10 @@
   angular.module('crmSearchTasks').component('crmSearchTasksMenu', {
     bindings: {
       taskManager: '<',
+      displayMode: '<',
       ids: '<'
     },
-    templateUrl: '~/crmSearchTasks/crmSearchTasksMenu.html',
+    template: '<div class="btn-group" ng-include="\'~/crmSearchTasks/crmSearchTasks-\'+$ctrl.displayMode+\'.html\'"></div>',
     controller: function($scope) {
       var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'),
         ctrl = this;
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html
deleted file mode 100644
index 8f460d1519d73b9dc22401f745b3fa60f7d9cc54..0000000000000000000000000000000000000000
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<div class="btn-group">
-  <button type="button"
-    ng-disabled="!$ctrl.taskManager.isDisplayReady()"
-    ng-click="$ctrl.openMenu = true; $ctrl.taskManager.getMetadata();"
-    class="btn dropdown-toggle btn-default"
-    title="{{:: ts('Perform action on selected items.') }}"
-    data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
-  >
-    <i class="crm-i fa-pencil"></i>
-    {{:: ts('Action') }} <span class="caret"></span>
-  </button>
-  <ul class="dropdown-menu" ng-if="$ctrl.openMenu">
-    <li ng-class="{disabled: !$ctrl.isActionAllowed(action)}" ng-repeat="action in $ctrl.taskManager.tasks" title="{{ $ctrl.getActionTitle(action) }}">
-      <a href ng-click="$ctrl.doAction(action); $ctrl.openMenu = false;"><i class="crm-i {{:: action.icon }}"></i> {{:: action.title }}</a>
-    </li>
-    <li class="disabled" ng-if="!$ctrl.taskManager.tasks">
-      <a href><i class="crm-i fa-spinner fa-spin"></i></a>
-    </li>
-  </ul>
-</div>
diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js b/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js
index fd525aaa170fe3ba20cb38a9de4a6278af0d6bd7..a7d7c62420b959e20d3b2bd2eeea96383b7bee5b 100644
--- a/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js
+++ b/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js
@@ -234,6 +234,11 @@
         }
         else if (status === 'success' && !editedRow && apiResults.run && apiResults.run[0]) {
           const mngr = this.taskManager;
+          // If tasks are shown as buttons, they need to be loaded right away
+          if (this.settings.actions_display_mode === 'buttons') {
+            mngr.getMetadata();
+            return;
+          }
           // If results contain a link to a task, prefetch task info to prevent latency when clicking the link
           _.each(apiResults.run[0].columns, function(column) {
             if ((column.link && column.link.task) || _.find(column.links || [], 'task')) {
diff --git a/civicrm/ext/search_kit/css/crmSearchDisplayTable.css b/civicrm/ext/search_kit/css/crmSearchDisplayTable.css
index 0c345856e1408ba74ed194d7599f03ac35e91b76..776844b386e4d1d3a00549f9a511760bd897b916 100644
--- a/civicrm/ext/search_kit/css/crmSearchDisplayTable.css
+++ b/civicrm/ext/search_kit/css/crmSearchDisplayTable.css
@@ -31,12 +31,17 @@
 table.crm-sticky-header > thead > tr {
   position: sticky !important;
   top: var(--crm-menubar-bottom, 0px);
+  z-index: 2;
 }
 
 /* Nested styling for hierarchical rows */
 #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-row {
   position: relative;
 }
+#bootstrap-theme .crm-search-display-table crm-search-display-toggle-collapse {
+  position: relative;
+  z-index: 1;
+}
 /* Depth >= 1 */
 #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-child:first-child:not(.crm-search-ctrl-column),
 #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-child {
@@ -53,6 +58,9 @@ table.crm-sticky-header > thead > tr {
   border-bottom: 2px dotted currentColor;
   border-left: 2px dotted currentColor;
 }
+#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-1 crm-search-display-toggle-collapse {
+  left: 30px;
+}
 /* Depth = 2 */
 #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-depth-2:first-child:not(.crm-search-ctrl-column),
 #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-2 {
@@ -62,6 +70,9 @@ table.crm-sticky-header > thead > tr {
 #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-2:before {
   left: 45px;
 }
+#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-2 crm-search-display-toggle-collapse {
+  left: 60px;
+}
 /* Depth = 3 */
 #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-depth-3:first-child:not(.crm-search-ctrl-column),
 #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-3 {
@@ -71,6 +82,9 @@ table.crm-sticky-header > thead > tr {
 #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-3:before {
   left: 75px;
 }
+#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-3 crm-search-display-toggle-collapse {
+  left: 90px;
+}
 /* Depth = 4 */
 #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-depth-4:first-child:not(.crm-search-ctrl-column),
 #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-4 {
@@ -80,3 +94,6 @@ table.crm-sticky-header > thead > tr {
 #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-4:before {
   left: 105px;
 }
+#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-4 crm-search-display-toggle-collapse {
+  left: 120px;
+}
diff --git a/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp b/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp
index d7f2c9eef9b62ea1f49b2630b3f02b25995b9fe7..ccb07e4c4707a9b98efc31ae794baf94720e2f06 100644
--- a/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp
+++ b/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp
@@ -1,4 +1,4 @@
 {htxt id="entity_permission"}
   <p>{ts}Set the permission level needed to view this entity.{/ts}</p>
-  <p>{ts}Users without this permission will not be able to see this entity in SearchKit.{/ts}</p>
+  <p>{ts}Users without this permission will not be able to see this entity in SearchKit nor in any search queries or displays that use this entity.{/ts}</p>
 {/htxt}
diff --git a/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php b/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php
index 2902241644513915e82c4be2225546935a904023..d0bf93d508e5c6df9b0c64dd8c1db75f095d01db 100644
--- a/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php
+++ b/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php
@@ -126,6 +126,36 @@ class AdminTest extends Api4TestBase {
       'multi' => FALSE,
     ]);
     $this->assertCount(1, $optionValueToGroup);
+
+    // Location joins
+    $addressJoins = \CRM_Utils_Array::findAll($joins['Individual'], [
+      'entity' => 'Address',
+      'multi' => TRUE,
+    ]);
+    $this->assertCount(1, $addressJoins);
+    $this->assertEquals(
+      [['id', '=', 'Contact_Address_contact_id.contact_id']],
+      $addressJoins[0]['conditions']
+    );
+    $this->assertEquals(
+      [['Contact_Address_contact_id.is_primary', '=', TRUE]],
+      $addressJoins[0]['defaults']
+    );
+
+    // LocBlock joins
+    $locBlockAddress = \CRM_Utils_Array::findAll($joins['LocBlock'], [
+      'entity' => 'Address',
+    ]);
+    $this->assertCount(2, $locBlockAddress);
+    $this->assertEquals(
+      [['address_id', '=', 'LocBlock_Address_address_id.id']],
+      $locBlockAddress[0]['conditions']
+    );
+    // Should have no defaults because it's a straight 1-1 join
+    $this->assertEquals(
+      [],
+      $locBlockAddress[0]['defaults']
+    );
   }
 
   public function testEntityRefGetJoins(): void {
diff --git a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php
index b9f564215a1e3b375396c07acbcc4fa000272f7a..da6eaa2165206a31b72f9f97d180a264930a2312 100644
--- a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php
+++ b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php
@@ -38,7 +38,9 @@ class EntityDisplayTest extends Api4TestBase {
       'api_entity' => 'Contact',
       'api_params' => [
         'version' => 4,
-        'select' => ['id', 'first_name', 'last_name', 'prefix_id:label', 'created_date', 'modified_date'],
+        // The select clause is intentionally in a different order than the columns below, and with an extra column
+        // To test the matching between columns and the select clause.
+        'select' => ['id', 'last_name', 'UPPER(first_name) AS first', 'middle_name', 'prefix_id:label', 'created_date', 'modified_date'],
         'where' => [['last_name', '=', $lastName]],
       ],
     ]);
@@ -56,7 +58,7 @@ class EntityDisplayTest extends Api4TestBase {
             'type' => 'field',
           ],
           [
-            'key' => 'first_name',
+            'key' => 'first',
             'label' => 'First Name',
             'type' => 'field',
           ],
@@ -110,9 +112,9 @@ class EntityDisplayTest extends Api4TestBase {
     $this->assertSame('Integer', $getFields['id']['data_type']);
     $this->assertSame('EntityRef', $getFields['id']['input_type']);
     $this->assertSame('Contact', $getFields['id']['fk_entity']);
-    $this->assertSame('String', $getFields['first_name']['data_type']);
-    $this->assertSame('Text', $getFields['first_name']['input_type']);
-    $this->assertNull($getFields['first_name']['fk_entity']);
+    $this->assertSame('String', $getFields['first']['data_type']);
+    $this->assertSame('Text', $getFields['first']['input_type']);
+    $this->assertNull($getFields['first']['fk_entity']);
     $this->assertSame('Integer', $getFields['prefix_id']['data_type']);
     $this->assertSame('Select', $getFields['prefix_id']['input_type']);
     $this->assertNull($getFields['prefix_id']['fk_entity']);
@@ -124,8 +126,9 @@ class EntityDisplayTest extends Api4TestBase {
 
     $rows = \CRM_Core_DAO::executeQuery('SELECT * FROM civicrm_sk_my_new_entity ORDER BY `_row`')->fetchAll();
     $this->assertCount(3, $rows);
-    $this->assertEquals('a', $rows[0]['first_name']);
-    $this->assertEquals('c', $rows[2]['first_name']);
+    $this->assertEquals('A', $rows[0]['first']);
+    $this->assertEquals('C', $rows[2]['first']);
+    $this->assertEquals($lastName, $rows[2]['last_name']);
 
     // Add a contact
     $this->createTestRecord('Contact', [
@@ -136,15 +139,15 @@ class EntityDisplayTest extends Api4TestBase {
 
     \CRM_Core_Config::singleton()->userPermissionClass->permissions = ['view all contacts'];
     $rows = civicrm_api4('SK_MyNewEntity', 'get', [
-      'select' => ['first_name', 'prefix_id:label'],
+      'select' => ['first', 'prefix_id:label'],
       'orderBy' => ['_row' => 'ASC'],
     ]);
     $this->assertCount(4, $rows);
-    $this->assertEquals('a', $rows[0]['first_name']);
+    $this->assertEquals('A', $rows[0]['first']);
     $this->assertEquals('Dr.', $rows[1]['prefix_id:label']);
-    $this->assertEquals('b', $rows[1]['first_name']);
-    $this->assertEquals('b2', $rows[2]['first_name']);
-    $this->assertEquals('c', $rows[3]['first_name']);
+    $this->assertEquals('B', $rows[1]['first']);
+    $this->assertEquals('B2', $rows[2]['first']);
+    $this->assertEquals('C', $rows[3]['first']);
     $this->assertEquals('Ms.', $rows[3]['prefix_id:label']);
 
     // Ensure entity_permission setting is enforced
diff --git a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php
index f4e4aed239d24d33f852a4b066586210c3ce7319..b9d097fac2a93b061aebc53422e7d2e1f10b6917 100644
--- a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php
+++ b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php
@@ -1357,7 +1357,7 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface {
     $this->assertEquals('text-center', $result[0]['columns'][0]['cssClass']);
     // First contact is deceased, gets strikethrough class
     $this->assertEquals('strikethrough', $result[0]['cssClass']);
-    $this->assertNotEquals('strikethrough', $result[1]['cssClass']);
+    $this->asserttrue(empty($result[1]['cssClass']));
     // Ensure the view contact link was formed
     $this->assertStringContainsString('cid=' . $contacts[0]['id'], $result[0]['columns'][1]['links'][0]['url']);
     $this->assertEquals('_blank', $result[0]['columns'][1]['links'][0]['target']);
@@ -2305,6 +2305,116 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface {
     $this->assertCount(1, $result[1]['columns'][1]['links']);
   }
 
+  public function testLinksWithGroupBy() {
+    $contacts = $this->saveTestRecords('Individual', [
+      'records' => [
+        ['first_name' => 'A', 'last_name' => 'A'],
+        ['first_name' => 'B', 'last_name' => 'B'],
+      ],
+    ]);
+    $contributions = $this->saveTestRecords('Contribution', [
+      'records' => [
+        ['contact_id' => $contacts[0]['id']],
+        ['contact_id' => $contacts[1]['id']],
+      ],
+    ]);
+    $params = [
+      'checkPermissions' => FALSE,
+      'return' => 'page:1',
+      'savedSearch' => [
+        'api_entity' => 'Contribution',
+        'api_params' => [
+          'version' => 4,
+          'select' => [
+            'id',
+            'contact_id',
+            'contact_id.sort_name',
+            'total_amount',
+            'financial_type_id:label',
+          ],
+          'orderBy' => [],
+          'where' => [
+            ['id', 'IN', $contributions->column('id')],
+          ],
+          'groupBy' => [
+            'id',
+          ],
+          'join' => [
+            [
+              'Contact AS Contribution_Contact_contact_id_01',
+              'LEFT',
+              [
+                'contact_id',
+                '=',
+                'Contribution_Contact_contact_id_01.id',
+              ],
+            ],
+          ],
+        ],
+      ],
+      'display' => [
+        'type' => 'table',
+        'label' => 'testDisplay',
+        'settings' => [
+          'description' => NULL,
+          'sort' => [],
+          'limit' => 50,
+          'pager' => [],
+          'placeholder' => 5,
+          'columns' => [
+            [
+              'type' => 'field',
+              'key' => 'id',
+              'dataType' => 'Integer',
+              'label' => 'Contribution ID',
+              'sortable' => TRUE,
+            ],
+            [
+              'type' => 'field',
+              'key' => 'contact_id.sort_name',
+              'dataType' => 'String',
+              'label' => 'Contact Sort Name',
+              'sortable' => TRUE,
+              'link' => [
+                'path' => '',
+                'entity' => 'Contact',
+                'action' => 'view',
+                'join' => 'contact_id',
+                'target' => '',
+              ],
+              'title' => 'View Contact',
+            ],
+            [
+              'type' => 'field',
+              'key' => 'total_amount',
+              'dataType' => 'Money',
+              'label' => 'Total Amount',
+              'sortable' => TRUE,
+            ],
+            [
+              'type' => 'field',
+              'key' => 'financial_type_id:label',
+              'dataType' => 'Integer',
+              'label' => 'Financial Type',
+              'sortable' => TRUE,
+            ],
+          ],
+          'actions' => TRUE,
+          'classes' => [
+            'table',
+            'table-striped',
+          ],
+        ],
+      ],
+    ];
+
+    $result = civicrm_api4('SearchDisplay', 'run', $params);
+    $this->assertCount(2, $result);
+
+    $this->assertCount(1, $result[0]['columns'][1]['links']);
+    $this->assertCount(1, $result[1]['columns'][1]['links']);
+  }
+
   public function testContactTypeIcons(): void {
     $this->createTestRecord('ContactType', [
       'label' => 'Star',
diff --git a/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php b/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php
index 11bc84e2283f259c75652c66357087b2ab2f8d68..4ca25ea203348b3efd265bfa79b57b5583b58556 100644
--- a/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php
+++ b/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php
@@ -48,12 +48,24 @@ class CRM_Standaloneusers_BAO_User extends CRM_Standaloneusers_DAO_User implemen
    * @param \Civi\Core\Event\PreEvent $event
    */
   public static function self_hook_civicrm_pre(\Civi\Core\Event\PreEvent $event) {
-    if (
-      in_array($event->action, ['create', 'edit'], TRUE) &&
-      empty($event->params['when_updated'])
-    ) {
-      // Track when_updated.
-      $event->params['when_updated'] = date('YmdHis');
+    if (in_array($event->action, ['create', 'edit'], TRUE)) {
+      if (empty($event->params['when_updated'])) {
+        // Track when_updated.
+        $event->params['when_updated'] = date('YmdHis');
+      }
+      if (empty($event->params['uf_name'])) {
+        // If no email is specified, fetch from contact
+        $contactId = $event->params['contact_id'] ?? NULL;
+
+        if ($contactId) {
+          $email = \Civi\Api4\Contact::get(FALSE)
+            ->addWhere('id', '=', $contactId)
+            ->addSelect('email_primary.email')
+            ->execute()->single()['email_primary.email'] ?? NULL;
+
+          $event->params['uf_name'] = $email;
+        }
+      }
     }
   }
 
diff --git a/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php b/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php
index ea1adafaff6c9b96793df066fd4e304dd8b98688..4a1c485011220f5cc9894bea933096a64a848dc3 100644
--- a/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php
+++ b/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php
@@ -1,12 +1,10 @@
 <?php
 use CRM_Standaloneusers_ExtensionUtil as E;
-use Civi\Standalone\Security;
 
 class CRM_Standaloneusers_Page_Login extends CRM_Core_Page {
 
   public function run() {
-    Security::singleton()->getLoggedInUfID();
-    if (CRM_Core_Session::singleton()->get('ufID')) {
+    if (CRM_Core_Config::singleton()->userSystem->isUserLoggedIn()) {
       // Already logged in.
       CRM_Utils_System::redirect('/civicrm');
     }
@@ -26,7 +24,7 @@ class CRM_Standaloneusers_Page_Login extends CRM_Core_Page {
    * Log out.
    */
   public static function logout() {
-    Security::singleton()->logoutUser();
+    CRM_Core_Config::singleton()->userSystem->logout();
     // Dump them back on the log-IN page.
     CRM_Utils_System::redirect('/civicrm/login?justLoggedOut');
   }
diff --git a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php
index 04677299117f88f645253efec99e52298835a63a..e9d1b66c6f7f69d7303a1cb070f0b7d531ef0a13 100644
--- a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php
+++ b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php
@@ -107,8 +107,8 @@ class Login extends AbstractAction {
       return;
     }
     $security = Security::singleton();
-    $user = $security->loadUserByName($this->username);
-    if (!$security->checkPassword($this->password, $user['hashed_password'] ?? '')) {
+    $userID = $security->checkPassword($this->username, $this->password);
+    if (!$userID) {
       $result['publicError'] = "Invalid credentials";
       return;
     }
@@ -126,7 +126,7 @@ class Login extends AbstractAction {
 
       case 0:
         // MFA not enabled.
-        $this->loginUser($user['id']);
+        $this->loginUser($userID);
         $result['url'] = $successUrl;
         return;
 
@@ -134,13 +134,13 @@ class Login extends AbstractAction {
         // MFA enabled. Store data in a pendingLogin key on session.
         // @todo expose the 120s timeout to config?
         \CRM_Core_Session::singleton()->set('pendingLogin', [
-          'userID' => $user['id'],
+          'userID' => $userID,
           'username' => $this->username,
           'expiry' => time() + 120,
           'successUrl' => $successUrl,
         ]);
         $mfaClass = $mfaClasses[0];
-        $mfa = new $mfaClass($user['id']);
+        $mfa = new $mfaClass($userID);
         // Return the URL for the MFA form.
         $result['url'] = $mfa->getFormUrl();
         break;
@@ -153,8 +153,7 @@ class Login extends AbstractAction {
   }
 
   protected function loginUser(int $userID) {
-    $authx = new \Civi\Authx\Standalone();
-    $authx->loginSession($userID);
+    _authx_uf()->loginSession($userID);
   }
 
 }
diff --git a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php
index 6e71dd1cde22fe263c546f90219915cfd984a52c..b4c01b9cfcd703a31f1e5d564a83e98e721017f7 100644
--- a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php
+++ b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php
@@ -39,8 +39,7 @@ class PasswordReset extends AbstractAction {
     // todo: some minimum password quality check?
 
     // Only valid change here is password, for a known ID.
-    $security = Security::singleton();
-    $userID = $security->checkPasswordResetToken($this->token);
+    $userID = Security::singleton()->checkPasswordResetToken($this->token);
     if (!$userID) {
       throw new API_Exception("Invalid token.");
     }
diff --git a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php
index f99d6e3b01d0e8e3903ebe58cc8b95b27c89fadd..547cc9535438dc88b36674d02c91d84ead0c833f 100644
--- a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php
+++ b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php
@@ -75,15 +75,10 @@ trait WriteTrait {
     $loggedInUserID = \CRM_Utils_System::getLoggedInUfID() ?? FALSE;
     $hasAdminPermission = \CRM_Core_Permission::check(['cms:administer users']);
     $authenticatedAsLoggedInUser = FALSE;
-    $security = Security::singleton();
     // Check that we have the logged-in-user's password.
     if ($this->actorPassword && $loggedInUserID) {
-      $storedHashedPassword = \Civi\Api4\User::get(FALSE)
-        ->addWhere('id', '=', $loggedInUserID)
-        ->addSelect('hashed_password')
-        ->execute()
-        ->single()['hashed_password'];
-      if (!$security->checkPassword($this->actorPassword, $storedHashedPassword)) {
+      $user = \CRM_Core_Config::singleton()->userSystem->getUserById($loggedInUserID);
+      if (!_authx_uf()->checkPassword($user['username'], $this->actorPassword)) {
         throw new UnauthorizedException("Incorrect password");
       }
       $authenticatedAsLoggedInUser = TRUE;
diff --git a/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php b/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php
index 0fe4c66466b2890e9a399de325883c6655c689e9..c2d0c944f81877aff1ad7e58a50d6940cacf3880 100644
--- a/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php
+++ b/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php
@@ -19,33 +19,48 @@ class Standalone implements AuthxInterface {
    * @inheritDoc
    */
   public function checkPassword(string $username, string $password) {
-    $security = Security::singleton();
-    $user = $security->loadUserByName($username);
-    return $security->checkPassword($password, $user['hashed_password'] ?? '') ? $user['id'] : NULL;
+    return Security::singleton()->checkPassword($username, $password);
   }
 
   /**
    * @inheritDoc
    */
   public function loginSession($userId) {
-    $user = Security::singleton()->loadUserByID($userId);
-    Security::singleton()->loginAuthenticatedUserRecord($user, TRUE);
+    $this->loginStateless($userId);
+
+    $session = \CRM_Core_Session::singleton();
+    $session->set('ufID', $userId);
+
+    // Identify the contact
+    $user = \Civi\Api4\User::get(FALSE)
+      ->addWhere('id', '=', $userId)
+      ->execute()
+      ->single();
+
+    // Confusingly, Civi stores it's *Contact* ID as *userID* on the session.
+    $session->set('userID', $user['contact_id'] ?? NULL);
+
+    if (!empty($user['language'])) {
+      $session->set('lcMessages', $user['language']);
+    }
   }
 
   /**
    * @inheritDoc
    */
   public function logoutSession() {
+    global $loggedInUserId;
+    $loggedInUserId = NULL;
     \CRM_Core_Session::singleton()->reset();
-    session_destroy();
+    // session_destroy();
   }
 
   /**
    * @inheritDoc
    */
   public function loginStateless($userId) {
-    $user = Security::singleton()->loadUserByID($userId);
-    Security::singleton()->loginAuthenticatedUserRecord($user, FALSE);
+    global $loggedInUserId;
+    $loggedInUserId = $userId;
   }
 
   /**
diff --git a/civicrm/ext/standaloneusers/Civi/Standalone/Security.php b/civicrm/ext/standaloneusers/Civi/Standalone/Security.php
index 56cb567c70a414cfb65206277dacde061f75e814..a41f50828f77269b274d9672a226fd979b92574f 100644
--- a/civicrm/ext/standaloneusers/Civi/Standalone/Security.php
+++ b/civicrm/ext/standaloneusers/Civi/Standalone/Security.php
@@ -2,18 +2,25 @@
 namespace Civi\Standalone;
 
 use Civi\Crypto\Exception\CryptoException;
-use CRM_Core_Session;
 use Civi;
 use Civi\Api4\User;
 use Civi\Api4\MessageTemplate;
 use CRM_Standaloneusers_WorkflowMessage_PasswordReset;
 
 /**
- * This is a single home for security related functions for Civi Standalone.
+ * Security related functions for Standaloneusers.
  *
- * Things may yet move around in the codebase; at the time of writing this helps
- * keep core PRs to a minimum.
+ * This is closely coupled with CRM_Utils_System_Standalone
+ * Many functions there started life here when Standalone
+ * was being resurrected.
  *
+ * Some of the generic user functions have been moved back to the
+ * System class so that they are more permanently available.
+ *
+ * Things may yet move around in the codebase - particularly if
+ * alternative user extensions to Standaloneusers are developed as
+ * these would then need to share an interface with the System
+ * class
  */
 class Security {
 
@@ -53,7 +60,10 @@ class Security {
     }
 
     // NULL means the current logged-in user
-    $userID ??= $this->getLoggedInUfID() ?? 0;
+    $userID = $userID ?? \CRM_Utils_System::getLoggedInUfID();
+
+    // now any falsey userid is equivalent to userID = 0 = anonymous user
+    $userID = $userID ?: 0;
 
     if (!isset(\Civi::$statics[__METHOD__][$userID])) {
 
@@ -88,218 +98,42 @@ class Security {
   }
 
   /**
+   * High level function to encrypt password using the site-default mechanism.
    */
-  public function getUserIDFromUsername(string $username): ?int {
-    return \Civi\Api4\User::get(FALSE)
-      ->addWhere('username', '=', $username)
-      ->execute()
-      ->first()['id'] ?? NULL;
+  public function hashPassword(string $plaintext): string {
+    // For now, we just implement D7's but this should be configurable.
+    // Sites should be able to move from one password hashing algo to another
+    // e.g. if a vulnerability is discovered.
+    $algo = new \Civi\Standalone\PasswordAlgorithms\Drupal7();
+    return $algo->hashPassword($plaintext);
   }
 
   /**
-   * Load an active user by username.
+   * Standaloneusers implementation of AuthxInterface::checkPassword
    *
-   * @return array|bool FALSE if not found.
+   * @return int|NULL
+   *   The User id, if check was successful, otherwise NULL
+   * @see \Civi\Authx\Standalone
    */
-  public function loadUserByName(string $username) {
+  public function checkPassword(string $username, string $plaintextPassword): ?int {
     $user = \Civi\Api4\User::get(FALSE)
       ->addWhere('username', '=', $username)
       ->addWhere('is_active', '=', TRUE)
-      ->execute()->first() ?? [];
-    if ($user) {
-      return $user;
-    }
-    return FALSE;
-  }
-
-  /**
-   * Load an active user by internal user ID.
-   *
-   * @return array|bool FALSE if not found.
-   */
-  public function loadUserByID(int $userID) {
-    $user = \Civi\Api4\User::get(FALSE)
-      ->addWhere('id', '=', $userID)
-      ->addWhere('is_active', '=', TRUE)
-      ->execute()->first() ?? [];
-    if ($user) {
-      return $user;
-    }
-    return FALSE;
-  }
-
-  /**
-   *
-   */
-  public function logoutUser() {
-    // This is the same call as in CRM_Authx_Page_AJAX::logout()
-    _authx_uf()->logoutSession();
-  }
-
-  /**
-   * Create a user in the CMS.
-   *
-   * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method.
-   *
-   * @param array $params keys:
-   *    - 'cms_name'
-   *    - 'cms_pass' plaintext password
-   *    - 'notify' boolean
-   * @param string $emailParam
-   *   Name of the $param which contains the email address.
-   *
-   * @return int|bool
-   *   uid if user was created, false otherwise
-   */
-  public function createUser(&$params, $emailParam) {
-    try {
-      $email = $params[$emailParam];
-      $userID = User::create(FALSE)
-        ->addValue('username', $params['cms_name'])
-        ->addValue('uf_name', $email)
-        ->addValue('password', $params['cms_pass'])
-        ->addValue('contact_id', $params['contact_id'] ?? NULL)
-        // ->addValue('uf_id', 0) // does not work without this.
-        ->execute()->single()['id'];
-    }
-    catch (\Exception $e) {
-      \Civi::log()->warning("Failed to create user '$email': " . $e->getMessage());
-      return FALSE;
-    }
-
-    // @todo This next line is what Drupal does, but it's unclear why.
-    // I think it assumes we want to be logged in as this contact, and as there's no uf match, it's not in civi.
-    // But I'm not sure if we are always becomming this user; I'm not sure waht calls this function.
-    // CRM_Core_Config::singleton()->inCiviCRM = FALSE;
-
-    return (int) $userID;
-  }
-
-  /**
-   * Update a user's email
-   *
-   * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method.
-   */
-  public function updateCMSName($ufID, $email) {
-    \Civi\Api4\User::update(FALSE)
-      ->addWhere('id', '=', $ufID)
-      ->addValue('uf_name', $email)
-      ->execute();
-  }
-
-  /**
-   * Authenticate the user against the CMS db.
-   *
-   * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method.
-   *
-   * @param string $name
-   *   The user name.
-   * @param string $password
-   *   The password for the above user.
-   * @param bool $loadCMSBootstrap
-   *   Load cms bootstrap?.
-   * @param string $realPath
-   *   Filename of script
-   *
-   * @return array|bool
-   *   [contactID, ufID, unique string] else false if no auth
-   * @throws \CRM_Core_Exception.
-   */
-  public function authenticate($name, $password, $loadCMSBootstrap = FALSE, $realPath = NULL) {
-
-    // this comment + session lines: copied from Drupal's implementation in case it's important...
-    /* Before we do any loading, let's start the session and write to it.
-     * We typically call authenticate only when we need to bootstrap the CMS
-     * directly via Civi and hence bypass the normal CMS auth and bootstrap
-     * process typically done in CLI and cron scripts. See: CRM-12648
-     */
-    $session = CRM_Core_Session::singleton();
-    $session->set('civicrmInitSession', TRUE);
-
-    $user = $this->loadUserByName($name);
+      ->addSelect('hashed_password', 'id')
+      ->execute()
+      ->first();
 
-    if (!$this->checkPassword($password, $user['password'] ?? '')) {
-      return FALSE;
+    if ($user && $this->checkHashedPassword($plaintextPassword, $user['hashed_password'])) {
+      return $user['id'];
     }
-
-    $this->applyLocaleFromUser($user);
-
-    // Note: random_int is more appropriate for cryptographical use than mt_rand
-    // The long number is the max 32 bit value.
-    return [$user['contact_id'], $user['id'], random_int(0, 2147483647)];
-  }
-
-  /**
-   * Register the given user as the currently logged in user.
-   */
-  public function loginAuthenticatedUserRecord(array $user, bool $withSession) {
-    global $loggedInUserId, $loggedInUser;
-    $loggedInUserId = $user['id'];
-    $loggedInUser = $user;
-
-    if ($withSession) {
-      $session = \CRM_Core_Session::singleton();
-      $session->set('ufID', $user['id']);
-
-      // Identify the contact
-      $contactID = civicrm_api3('UFMatch', 'get', [
-        'sequential' => 1,
-        'return' => ['contact_id'],
-        'uf_id' => $user['id'],
-      ])['values'][0]['contact_id'] ?? NULL;
-      // Confusingly, Civi stores it's *Contact* ID as *userID* on the session.
-      $session->set('userID', $contactID);
-      $this->applyLocaleFromUser($user);
-    }
-  }
-
-  /**
-   * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method.
-   */
-  public function isUserLoggedIn(): bool {
-    return !empty($this->getLoggedInUfID());
-  }
-
-  /**
-   * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method.
-   */
-  public function getLoggedInUfID(): ?int {
-    $authX = new \Civi\Authx\Standalone();
-    return $authX->getCurrentUserId();
-  }
-
-  /**
-   * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method.
-   */
-  public function languageNegotiationURL($url, $addLanguagePart = TRUE, $removeLanguagePart = FALSE) {
-    // @todo
-    return $url;
-  }
-
-  /**
-   * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method.
-   * Return the CMS-specific url for its permissions page
-   * @return array
-   */
-  public function getCMSPermissionsUrlParams() {
-    return ['ufAccessURL' => '/civicrm/admin/roles'];
-  }
-
-  /**
-   * High level function to encrypt password using the site-default mechanism.
-   */
-  public function hashPassword(string $plaintext): string {
-    // For now, we just implement D7's but this should be configurable.
-    // Sites should be able to move from one password hashing algo to another
-    // e.g. if a vulnerability is discovered.
-    $algo = new \Civi\Standalone\PasswordAlgorithms\Drupal7();
-    return $algo->hashPassword($plaintext);
+    return NULL;
   }
 
   /**
    * Check whether a password matches a hashed version.
+   * @return bool
    */
-  public function checkPassword(string $plaintextPassword, string $storedHashedPassword): bool {
+  protected function checkHashedPassword(string $plaintextPassword, string $storedHashedPassword): bool {
 
     if (preg_match('@^\$S\$[A-Za-z./0-9]{52}$@', $storedHashedPassword)) {
       // Looks like a default D7 password.
@@ -452,17 +286,4 @@ class Security {
     return $workflowMessage;
   }
 
-  /**
-   * Applies the locale from the user record.
-   *
-   * @param array $user
-   * @return void
-   */
-  private function applyLocaleFromUser(array $user) {
-    $session = CRM_Core_Session::singleton();
-    if (!empty($user['language'])) {
-      $session->set('lcMessages', $user['language']);
-    }
-  }
-
 }
diff --git a/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html b/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html
index 7df8b3b1c9be587779ebf5055af3cfc94ff9d71a..24b5cb1871bc50832aeb6182504a9ca833674fd7 100644
--- a/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html
+++ b/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html
@@ -4,7 +4,7 @@
     <af-field name="roles" />
     <af-field name="username" />
     <af-field name="contact_id" defn="{required: true, input_attrs: {quickAdd: ['civicrm/quick-add/Individual']}}" />
-    <af-field name="uf_name" />
+    <af-field name="uf_name" defn="{help_pre: ts('Email used for password resets.'), input_attrs: {placeholder: ts('Leave blank to use the primary email from the selected contact')}}" />
     <af-field name="is_active" />
     <af-field name="timezone" defn="{help_pre: ts('Set the timezone of the user. Date and times will be shown in this timezone. You can also leave it empty to use the default system timezone (which is a server setting).'), input_attrs: {placeholder: ts('Server default timezone')}}" />
     <af-field name="language" defn="{help_pre: ts('Set the user interface language of this user. You can also leave it empty to use the default system language.'), input_attrs: {placeholder: ts('System default language')}}" />
diff --git a/civicrm/ext/standaloneusers/css/standalone.css b/civicrm/ext/standaloneusers/css/standalone.css
index cf25602f916343fe5ee1509af1e13657391dbc3d..659ed53f09613801b15abfef14f5019c3f5d8381 100644
--- a/civicrm/ext/standaloneusers/css/standalone.css
+++ b/civicrm/ext/standaloneusers/css/standalone.css
@@ -1,5 +1,5 @@
 .standalone-page-padding {
-  padding: 1px 3vw 1rem;
+  padding: 1px max(10px, 1vw) 1rem;
 }
 
 html.crm-standalone  nav.breadcrumb>ol {
diff --git a/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl b/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl
index a17ab1b2a7324cdcc662891d345200336cdc2ea6..ffd6b71ff0b5746b4f2cd30ff0a431dad77993d9 100644
--- a/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl
+++ b/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl
@@ -3,8 +3,9 @@
     <form id=login-form>
       <img class="crm-logo" src="{$logoUrl}" alt="logo for CiviCRM, with an intersecting blue and green triangle">
       {if $justLoggedOut}<div class="help message info">{ts}You have been logged out.{/ts}</div>{/if}
-      {if $anonAccessDenied}<div class="help message warning">{ts}You do not have permission to access that, you may
-        need to login.{/ts}</div>{/if}
+      {if $anonAccessDenied}<div class="help message warning">
+        {ts}You do not have permission to access that. You may need to login.{/ts}
+      </div>{/if}
       {if $sessionLost}<div class="help message warning">{ts}Your session timed out.{/ts}</div>{/if}
       <div class="input-wrapper">
         <label for="usernameInput" name=username class="form-label">Username</label>
diff --git a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php
index 797783d6dfda4ab0dd42e5ff16f3770ab51980f6..487d902c8937cfd3cfee8882b6dda5733496d623 100644
--- a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php
+++ b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php
@@ -8,10 +8,9 @@ use Civi\Api4\User;
 use Civi\Api4\Role;
 use Civi\Api4\UserRole;
 use Civi\Api4\Contact;
-use Civi\Standalone\Security;
 
 /**
- * FIXME - Add test description.
+ * Test the Standaloneusers User Api4 actions
  *
  * Tips:
  *  - With HookInterface, you may implement CiviCRM hooks directly in the test class.
@@ -92,41 +91,21 @@ class UserTest extends \PHPUnit\Framework\TestCase implements EndToEndInterface,
     }
   }
 
-  /**
-   * Note I thought I could use \Civi\Authx\Standalone::logoutSession()
-   * but it calls session_destroy which messes up future tests.
-   *
-   * Not sure if there is a generic logout without session destroy.
-   *
-   */
   public function ensureLoggedOut() {
-    global $loggedInUserId, $loggedInUser;
-
-    if (\CRM_Utils_System::getLoggedInUfID()) {
-      \CRM_Core_Session::singleton()->reset();
-      $loggedInUser = $loggedInUserId = NULL;
-    }
+    \CRM_Utils_System::logout();
   }
 
   public function tearDown():void {
-    $this->deleteStuffWeMade();
+    // only tear down if we set up
+    if (CIVICRM_UF === 'Standalone') {
+      $this->ensureLoggedOut();
+      $this->deleteStuffWeMade();
+    }
     parent::tearDown();
   }
 
   protected function loginUser($userID) {
-    $security = Security::singleton();
-    $user = \Civi\Api4\User::get(FALSE)
-      ->addWhere('id', '=', $userID)
-      ->execute()->first();
-
-    $contactID = civicrm_api3('UFMatch', 'get', [
-      'sequential' => 1,
-      'return' => ['contact_id'],
-      'uf_id' => $user['id'],
-    ])['values'][0]['contact_id'] ?? NULL;
-    $this->assertNotNull($contactID);
-    /** @var \Civi\Standalone\Security $security */
-    $security->loginAuthenticatedUserRecord($user, FALSE);
+    _authx_uf()->loginSession($userID);
   }
 
   /**
diff --git a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php
index e08e65d63a5ab75600057f2af38395d6419adca1..d91db2d8ef58ca85d47fe5db156b376c7ac9a4f5 100644
--- a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php
+++ b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php
@@ -6,7 +6,7 @@ use Civi\Test\TransactionalInterface;
 use Civi\Api4\User;
 
 /**
- * FIXME - Add test description.
+ * Test Security flows in Standalone
  *
  * Tips:
  *  - With HookInterface, you may implement CiviCRM hooks directly in the test class.
@@ -52,7 +52,6 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf
   }
 
   protected function loginUser($userID) {
-    $security = Security::singleton();
     $user = \Civi\Api4\User::get(FALSE)
       ->addWhere('id', '=', $userID)
       ->execute()->first();
@@ -63,8 +62,8 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf
       'uf_id' => $user['id'],
     ])['values'][0]['contact_id'] ?? NULL;
     $this->assertNotNull($contactID);
-    /** @var \Civi\Standalone\Security $security */
-    $security->loginAuthenticatedUserRecord($user, FALSE);
+
+    \CRM_Core_Config::singleton()->userSystem->loadUser($user['username']);
   }
 
   public function testCheckPassword():void {
@@ -75,8 +74,8 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf
       ->execute()->single();
 
     // Test that the password can be checked ok.
-    $this->assertTrue($security->checkPassword('secret1', $user['hashed_password']));
-    $this->assertFalse($security->checkPassword('some other password', $user['hashed_password']));
+    $this->assertTrue((bool) $security->checkPassword($user['username'], 'secret1'));
+    $this->assertFalse((bool) $security->checkPassword($user['username'], 'some other password'));
   }
 
   public function testPerms() {
@@ -209,7 +208,7 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf
 
     $this->assertEquals(1, $result['success']);
     $user = User::get(FALSE)->addWhere('id', '=', $userID)->execute()->single();
-    $this->assertTrue($security->checkPassword('fingersCrossed', $user['hashed_password']));
+    $this->assertTrue((bool) $security->checkPassword($user['username'], 'fingersCrossed'));
 
     // Should not work a 2nd time with same token.
     try {
@@ -238,12 +237,6 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf
     $this->assertNull($security->checkPasswordResetToken($token));
   }
 
-  public function testGetUserIDFromUsername() {
-    [$contactID, $adminUserID, $security] = $this->createFixtureContactAndUser();
-    $this->assertEquals($adminUserID, $security->getUserIDFromUsername('user_one'), 'Should return admin user ID');
-    $this->assertNull($security->getUserIDFromUsername('user_unknown'), 'Should return NULL for non-existent user');
-  }
-
   protected function deleteStuffWeMade() {
     User::delete(FALSE)->addWhere('username', '=', 'testuser1')->execute();
   }
diff --git a/civicrm/js/crm.ajax.js b/civicrm/js/crm.ajax.js
index acc4205f946c7ecac2e08064e28f1ffa3d7d29a2..2ac8f2295dca021999add38e495f6629d07f9364 100644
--- a/civicrm/js/crm.ajax.js
+++ b/civicrm/js/crm.ajax.js
@@ -271,7 +271,7 @@
         if (url.search(/[&?]snippet=/) < 0) {
           url += (url.indexOf('?') < 0 ? '?' : '&') + 'snippet=' + snippetType;
         } else {
-          url = url.replace(/snippet=[^&]*/, 'snippet=' + snippetType);
+          url = url.replace(/([&?])snippet=[^&]*/, '$1snippet=' + snippetType);
         }
         // See Civi\Angular\AngularLoader
         if (snippetType === 'json' && CRM.angular) {
diff --git a/civicrm/js/version.json b/civicrm/js/version.json
index becfe0b468e4f27bbc5a52d7f8837d23f7b48d6d..96adb6d66d622f1e3df10109c70b47e87a83427a 100644
--- a/civicrm/js/version.json
+++ b/civicrm/js/version.json
@@ -1 +1 @@
-"5.79.1"
+"5.80.0"
diff --git a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php
index b9a376ab582772573963640b9202f078456f30a8..f22452a09f38dcb48d9606431ef46de034cf1af0 100644
--- a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php
+++ b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php
@@ -202,6 +202,8 @@ return [
             ],
             [
               'size' => 'btn-xs',
+              'label' => ts('Row Actions'),
+              'label_hidden' => TRUE,
               'links' => [
                 [
                   'icon' => 'fa-external-link',
diff --git a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php
index 543bfae401cc6658ccd98dfacbc00440babfc353..b9e89f03d7b1ad7028996f50a12a0bd4d071d1f7 100644
--- a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php
+++ b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php
@@ -247,6 +247,8 @@ return [
               'icon' => 'fa-bars',
               'links' => $links,
               'type' => 'menu',
+              'label' => ts('Row Actions'),
+              'label_hidden' => TRUE,
               'alignment' => 'text-right',
             ],
           ],
@@ -404,6 +406,8 @@ return [
               'style' => 'default',
               'size' => 'btn-xs',
               'icon' => 'fa-bars',
+              'label' => ts('Row Actions'),
+              'label_hidden' => TRUE,
               'links' => [
                 [
                   'entity' => 'Relationship',
diff --git a/civicrm/release-notes.md b/civicrm/release-notes.md
index 46c27d7b368ed8fbf917d29f7850145daf8fd523..cc6f13b9818558182ac019214e61162b1ba551e2 100644
--- a/civicrm/release-notes.md
+++ b/civicrm/release-notes.md
@@ -15,15 +15,6 @@ Other resources for identifying changes are:
     * https://github.com/civicrm/civicrm-joomla
     * https://github.com/civicrm/civicrm-wordpress
 
-## CiviCRM 5.79.1
-
-Released November 25, 2024
-
-- **[Synopsis](release-notes/5.79.1.md#synopsis)**
-- **[Bugs resolved](release-notes/5.79.1.md#bugs)**
-- **[Credits](release-notes/5.79.1.md#credits)**
-- **[Feedback](release-notes/5.79.1.md#feedback)**
-
 ## CiviCRM 5.79.0
 
 Released November 6, 2024
diff --git a/civicrm/release-notes/5.79.1.md b/civicrm/release-notes/5.79.1.md
deleted file mode 100644
index 205218433174a2ba15bd4d44158bbcd844d2181a..0000000000000000000000000000000000000000
--- a/civicrm/release-notes/5.79.1.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# CiviCRM 5.79.1
-
-Released November 25, 2024
-
-- **[Synopsis](#synopsis)**
-- **[Bugs resolved](#bugs)**
-- **[Credits](#credits)**
-- **[Feedback](#feedback)**
-
-## <a name="synopsis"></a>Synopsis
-
-| *Does this version...?*                                         |          |
-| --------------------------------------------------------------- | -------- |
-| Change the database schema?                                     | no       |
-| Alter the API?                                                  | no       |
-| **Require attention to configuration options?**                 | **yes**  |
-| **Fix problems installing or upgrading to a previous version?** | **yes**  |
-| Introduce features?                                             | no       |
-| **Fix bugs?**                                                   | **yes**  |
-| Fix security vulnerabilities?                                   | no       |
-
-## <a name="bugs"></a>Bugs resolved
-
-* **_CiviContribute_: Accounts are sometimes displayed with internal names instead of labels ([dev/financial#229](https://lab.civicrm.org/dev/financial/-/issues/229): [#31486](https://github.com/civicrm/civicrm-core/pull/31486))**
-* **_CiviMail_: When re-using a mailing, date fields are copied incorrectly ([#31522](https://github.com/civicrm/civicrm-core/pull/31522))**
-* **_CiviMail_: Concurrent email delivery suffers contention on new date fields ([#31517](https://github.com/civicrm/civicrm-core/pull/31517))**
-* **_Installer_: New installs fail when using alternate locales ([dev/core#5590](https://lab.civicrm.org/dev/core/-/issues/5590): [#31482](https://github.com/civicrm/civicrm-core/pull/31482))**
-* **_Profiles_: Restore validation of emails ([dev/core#5587](https://lab.civicrm.org/dev/core/-/issues/5587), [dev/core#5560](https://lab.civicrm.org/dev/core/-/issues/5560): [#31455](https://github.com/civicrm/civicrm-core/pull/31455))**
-* **_WordPress_: Shortcodes don't render in some themes ([dev/core#5553](https://lab.civicrm.org/dev/core/-/issues/5553): [wordpress#337](https://github.com/civicrm/civicrm-wordpress/pull/337))**
-
-  If shortcodes still do not work with your theme, then toggle the option `civicrm_theme_compatibility_mode`.
-
-## <a name="credits"></a>Credits
-
-This release was developed by the following authors and reviewers:
-
-Wikimedia Foundation - Eileen McNaughton; Tadpole Collective - Kevin Cristiano; MJW
-Consulting - Matthew Wire; Megaphone Technology Consulting - Jon Goldberg; JMA Consulting
-- Seamus Lee, Monish Deb; Jade Gaunt; heitz.jm; Dave D; CiviCRM - Coleman Watts, Tim
-Otten; Christian Wach; Australian Greens - Andrew Cormick-Dockery; ASMAC (American Society
-of Music Arrangers and Composers) - Jeff Kellem; Agileware - Justin Freeman, Francis
-Whittle
-
-## <a name="feedback"></a>Feedback
-
-These release notes are edited by Tim Otten and Andie Hunt.  If you'd like to
-provide feedback on them, please login to https://chat.civicrm.org/civicrm and
-contact `@agh1`.
diff --git a/civicrm/release-notes/5.80.0.md b/civicrm/release-notes/5.80.0.md
new file mode 100644
index 0000000000000000000000000000000000000000..3bbf208608ad245ff886dc95bcbc74906cc76510
--- /dev/null
+++ b/civicrm/release-notes/5.80.0.md
@@ -0,0 +1,491 @@
+
+# CiviCRM 5.80.0
+
+Released December 4, 2024;
+
+- **[Features](#features)**
+- **[Bugs resolved](#bugs)**
+- **[Miscellany](#misc)**
+- **[Credits](#credits)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?*                                         |         |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities?                                   |   no    |
+| **Change the database schema?**                                 | **yes** |
+| **Alter the API?**                                              | **yes** |
+| Require attention to configuration options?                     |   no    |
+| **Fix problems installing or upgrading to a previous version?** | **yes** |
+| **Introduce features?**                                         | **yes** |
+| **Fix bugs?**                                                   | **yes** |
+
+## <a name="features"></a>Features
+
+### Core CiviCRM
+
+- **SearchKit - Add link to edit search when viewing results
+  ([31209](https://github.com/civicrm/civicrm-core/pull/31209))**
+
+  Adds a link to edit the search when viewing a SearchKit display.
+
+- **SearchKit - Support fields in apiBatch task
+  ([31352](https://github.com/civicrm/civicrm-core/pull/31352))**
+
+  Allows api batch tasks to include fields for the user to interact with.
+
+- **SearchKit - Improve loading efficiency when multiple search displays are
+  hidden ([31392](https://github.com/civicrm/civicrm-core/pull/31392))**
+
+  Improves efficiency loading SearchKit displays.
+
+- **Package RiverLea theme extension during CiviCRM build
+  ([31527](https://github.com/civicrm/civicrm-core/pull/31527),
+  [31545](https://github.com/civicrm/civicrm-core/pull/31545),
+  [31535](https://github.com/civicrm/civicrm-core/pull/31535),
+  [31389](https://github.com/civicrm/civicrm-core/pull/31389) and
+  [31478](https://github.com/civicrm/civicrm-core/pull/31478))**
+
+  Adds Riverlea theme extension.
+
+- **SearchKit suggestion: Multiple action buttons
+  ([dev/core#5572](https://lab.civicrm.org/dev/core/-/issues/5572):
+  [31415](https://github.com/civicrm/civicrm-core/pull/31415))**
+
+  Adds the ability to add Actions as buttons to SearchKit
+  searches.
+
+- **Advanced Search: compact the Search Settings
+  ([31226](https://github.com/civicrm/civicrm-core/pull/31226))**
+
+  Makes the Advanced Search screen more web responsive.
+
+- **EnglishNumber - Create camel-case and hypenated names for 100-999
+  ([31277](https://github.com/civicrm/civicrm-core/pull/31277))**
+
+  Adds support for version numbers 5.100 - 5.999.
+
+- **Optimize Change Log Viewing For A Contact
+  ([31125](https://github.com/civicrm/civicrm-core/pull/31125))**
+
+  Optimizes the code for viewing the change logs for a contact.
+
+### CiviContribute
+
+- **Log payment processor errors that get reported to the user
+  ([31412](https://github.com/civicrm/civicrm-core/pull/31412))**
+
+  Improves logging of payment processor errors.
+
+- **Add CustomField support to Products
+  ([31250](https://github.com/civicrm/civicrm-core/pull/31250))**
+
+  Adds support for custom fields on Products.
+
+- **Improve product description
+  ([31288](https://github.com/civicrm/civicrm-core/pull/31288))**
+
+  Improves description for product.
+
+### CiviMail
+
+- **Mass SMS: enable access to reports
+  ([31425](https://github.com/civicrm/civicrm-core/pull/31425))**
+
+  Adds reports for Mass SMS.
+
+### CiviMember
+
+- **Membership User Dashboard.tpl adding Recurring links and cleanup
+  ([31342](https://github.com/civicrm/civicrm-core/pull/31342))**
+
+  Adds recurring links to the membership section of the user dashboard.
+
+### Standalone Integration
+
+- **Standalone System - use authx_login for authenticate flow
+  ([31153](https://github.com/civicrm/civicrm-core/pull/31153))**
+
+  Use the authx_login flow in CRM_Utils_System_Standalone::authenticate.
+
+## <a name="bugs"></a>Bugs resolved
+
+### Core CiviCRM
+
+- **reference to used address is lost - address master_id is set to NULL when
+  referenced address or owning contact are edited
+  ([dev/core#5592](https://lab.civicrm.org/dev/core/-/issues/5592):
+  [31559](https://github.com/civicrm/civicrm-core/pull/31559))**
+  
+- **API v4 explorer: boolean params don't render correctly for CV (short)
+  ([dev/core#4129](https://lab.civicrm.org/dev/core/-/issues/4129):
+  [31393](https://github.com/civicrm/civicrm-core/pull/31393))**
+
+- **Search Kit: DB Entity needs all columns to work
+  ([dev/core#4629](https://lab.civicrm.org/dev/core/-/issues/4629):
+  [31328](https://github.com/civicrm/civicrm-core/pull/31328))**
+
+- **Afform - Reset button click does not refresh the search result once clicked
+  ([dev/core#4871](https://lab.civicrm.org/dev/core/-/issues/4871):
+  [31263](https://github.com/civicrm/civicrm-core/pull/31263))**
+
+- **Group delete confirmation messages gives Confirm Group Delete and not the
+  group name as the deleted group
+  ([dev/core#5321](https://lab.civicrm.org/dev/core/-/issues/5321):
+  [31406](https://github.com/civicrm/civicrm-core/pull/31406))**
+
+- **Advanced Search initiated from QuickSearch doesn't show default search view
+  ([dev/core#5437](https://lab.civicrm.org/dev/core/-/issues/5437):
+  [31052](https://github.com/civicrm/civicrm-core/pull/31052))**
+
+- **SearchKit: Column links don't work with grouped by searches
+  ([dev/core#5453](https://lab.civicrm.org/dev/core/-/issues/5453):
+  [31211](https://github.com/civicrm/civicrm-core/pull/31211))**
+
+- **API4 Explorer Index
+  ([dev/core#5515](https://lab.civicrm.org/dev/core/-/issues/5515):
+  [31251](https://github.com/civicrm/civicrm-core/pull/31251))**
+
+- **SearchKit: Can't save a DB Entity
+  ([dev/core#5520](https://lab.civicrm.org/dev/core/-/issues/5520):
+  [31360](https://github.com/civicrm/civicrm-core/pull/31360))**
+
+- **Don't require both first and last name when creating contact
+  ([dev/core#5545](https://lab.civicrm.org/dev/core/-/issues/5545):
+  [31289](https://github.com/civicrm/civicrm-core/pull/31289))**
+
+- **SearchKit: CSS issue allows editable fields to show through sticky table
+  headers ([dev/core#5568](https://lab.civicrm.org/dev/core/-/issues/5568):
+  [31396](https://github.com/civicrm/civicrm-core/pull/31396))**
+
+- **5.79 : unable to install with fr_FR locale : broken SQL
+  ([dev/core#5590](https://lab.civicrm.org/dev/core/-/issues/5590):
+  [31482](https://github.com/civicrm/civicrm-core/pull/31482))**
+
+- **Literal `<del>` appears in activity tab when source contact is soft-deleted
+  ([dev/core#5609](https://lab.civicrm.org/dev/core/-/issues/5609):
+  [31494](https://github.com/civicrm/civicrm-core/pull/31494))**
+
+- **Afform - Do not allow DisplayOnly fields to submit
+  ([31421](https://github.com/civicrm/civicrm-core/pull/31421))**
+
+- **Afform - add css selector to distinguish multi select af field
+  ([31316](https://github.com/civicrm/civicrm-core/pull/31316))**
+
+- **Afform - Fix LocBlock address/email/phone saving
+  ([31343](https://github.com/civicrm/civicrm-core/pull/31343))**
+
+- **SearchKit - Fix collapsible toggle
+  ([31474](https://github.com/civicrm/civicrm-core/pull/31474))**
+
+- **SearchKit - Make hierarchical tables collapsible
+  ([31408](https://github.com/civicrm/civicrm-core/pull/31408))**
+
+- **AuthX [PHP User Deprecation] Permission 'authenticate with password' should
+  be declared with 'label' and 'description' keys. ->
+  Update hook_civicrm_permission to use new format
+  ([dev/core#5551](https://lab.civicrm.org/dev/core/-/issues/5551):
+  [31356](https://github.com/civicrm/civicrm-core/pull/31356))**
+
+- **APIv4 - Fix date formatting
+  ([31422](https://github.com/civicrm/civicrm-core/pull/31422))**
+
+- **Api4 - Un-duplicate setLegacyDateFormat function
+  ([31340](https://github.com/civicrm/civicrm-core/pull/31340))**
+
+- **AdminUI - Add 'sticky-header' to all tables
+  ([31414](https://github.com/civicrm/civicrm-core/pull/31414))**
+
+- **Regression: resets text-rendered radio button width in confirmation screens
+  ([31345](https://github.com/civicrm/civicrm-core/pull/31345))**
+
+- **SettingsManager::bootSettings - derive $civicrm_root global if not set
+  ([31335](https://github.com/civicrm/civicrm-core/pull/31335))**
+
+- **Fix addScriptUrl missing joining / between base and file paths
+  ([31362](https://github.com/civicrm/civicrm-core/pull/31362))**
+
+- **Run successful scheduled jobs first
+  ([29598](https://github.com/civicrm/civicrm-core/pull/29598))**
+
+- **Add *.boot.setting.php meta for CIVICRM_UF_BASEURL and CIVICRM_DOMAIN_ID  
+  ([31155](https://github.com/civicrm/civicrm-core/pull/31155))**
+
+- **Api3 Setting.revert - dont swallow errors, fix one reverting constant
+  settings ([31334](https://github.com/civicrm/civicrm-core/pull/31334))**
+
+- **Update the help wording for DB Entity permissions
+  ([31350](https://github.com/civicrm/civicrm-core/pull/31350))**
+
+- **OAuth - opt into scan-classes to pick up Api4 entities
+  ([31254](https://github.com/civicrm/civicrm-core/pull/31254))**
+
+- **FormBuilder: Relative datetime doesn't support time
+  ([dev/core#5517](https://lab.civicrm.org/dev/core/-/issues/5517):
+  [31257](https://github.com/civicrm/civicrm-core/pull/31257))**
+
+- **SearchSegmentExtraField - use AutoService rather than LegacySpecScanner
+  ([31230](https://github.com/civicrm/civicrm-core/pull/31230))**
+
+- **SearchDisplay rewrites: don't truncate long field keys
+  ([31333](https://github.com/civicrm/civicrm-core/pull/31333))**
+
+- **Increase size of url fields for website/activity
+  ([31420](https://github.com/civicrm/civicrm-core/pull/31420))**
+
+- **Drop binding current domain settings bag to CRM_Core_Config on boot
+  ([30899](https://github.com/civicrm/civicrm-core/pull/30899))**
+
+- **Advanced Search: icon for the Search Settings
+  ([31293](https://github.com/civicrm/civicrm-core/pull/31293))**
+
+- **Avoid duplicate ID on location form
+  ([31287](https://github.com/civicrm/civicrm-core/pull/31287))**
+
+- **crmSnippet - Fix regexes to match
+  ([31349](https://github.com/civicrm/civicrm-core/pull/31349))**
+
+- **Prevent CiviCRM resources from loading when not in CiviCRM admin
+  ([331](https://github.com/civicrm/civicrm-wordpress/pull/331))**
+
+- **Bugfix for windows machines
+  ([31265](https://github.com/civicrm/civicrm-core/pull/31265))**
+
+- **Notice fix
+  ([31434](https://github.com/civicrm/civicrm-core/pull/31434))**
+
+- **Fix merge
+  ([31431](https://github.com/civicrm/civicrm-core/pull/31431))**
+
+- **Fix fatal error if source is unavailable
+  ([335](https://github.com/civicrm/civicrm-wordpress/pull/335))**
+
+- **Fix deprecated warning in explode
+  ([31227](https://github.com/civicrm/civicrm-core/pull/31227))**
+
+### CiviCase
+
+- **CiviCase Smarty5 Compatibility: Error "Unknown modifier 'sizeof'" when
+  editing Case Status
+  ([dev/core#5516](https://lab.civicrm.org/dev/core/-/issues/5516):
+  [31256](https://github.com/civicrm/civicrm-core/pull/31256))**
+
+### CiviCampaign
+
+- **fix end date field in campaign form
+  ([31506](https://github.com/civicrm/civicrm-core/pull/31506))**
+
+- **add parent_id to campaign form entity fields
+  ([31518](https://github.com/civicrm/civicrm-core/pull/31518))**
+
+### CiviContribute
+
+- **Incorrect profile retrieved for tribute profile
+  ([dev/core#5510](https://lab.civicrm.org/dev/core/-/issues/5510):
+  [31246](https://github.com/civicrm/civicrm-core/pull/31246))**
+
+- **financial account mapping column on financial type admin screen shows
+  english account names
+  ([dev/financial#229](https://lab.civicrm.org/dev/financial/-/issues/229):
+  [31486](https://github.com/civicrm/civicrm-core/pull/31486))**
+
+- **Extract payment function
+  ([31404](https://github.com/civicrm/civicrm-core/pull/31404))**
+
+- **Contribution Confirm/ThankYou.tpl cleanup
+  ([31311](https://github.com/civicrm/civicrm-core/pull/31311))**
+
+- **Price Field: Field Type: remove help, simplify label
+  ([31269](https://github.com/civicrm/civicrm-core/pull/31269))**
+
+- **fix schema for financial type/account to have label_field=label
+  ([31483](https://github.com/civicrm/civicrm-core/pull/31483))**
+
+### CiviEvent
+
+- **Emails no longer validated on event registration
+  ([dev/core#5587](https://lab.civicrm.org/dev/core/-/issues/5587):
+  [31455](https://github.com/civicrm/civicrm-core/pull/31455))**
+
+- **Formbuilder/ event location: for an event creation, Existing event location
+  cannot be selected if update box is not ticked
+  ([dev/core#5526](https://lab.civicrm.org/dev/core/-/issues/5526):
+  [31358](https://github.com/civicrm/civicrm-core/pull/31358))**
+
+- **Formbuilder: event location is half created : I can see it in Manage events,
+  but not in Searchkit/ Location address
+  ([dev/core#5524](https://lab.civicrm.org/dev/core/-/issues/5524):
+  [31285](https://github.com/civicrm/civicrm-core/pull/31285))**
+
+- **set NOINDEX on non-public event registration pages
+  ([dev/core#5449](https://lab.civicrm.org/dev/core/-/issues/5449):
+  [31083](https://github.com/civicrm/civicrm-core/pull/31083))**
+
+- **Event confirmation emails do not populate guest details when payment is
+  confirmed by IPN (API)
+  ([dev/core#224](https://lab.civicrm.org/dev/core/-/issues/224):
+  [30374](https://github.com/civicrm/civicrm-core/pull/30374))**
+
+- **Fix poor quality markup on no events message
+  ([31329](https://github.com/civicrm/civicrm-core/pull/31329))**
+
+- **fix typo in ParticipantStatusType entity
+  ([31252](https://github.com/civicrm/civicrm-core/pull/31252))**
+
+- **Event Profiles: remove HR tags
+  ([31383](https://github.com/civicrm/civicrm-core/pull/31383))**
+
+- **Event Profile: remove the preview button from the popup
+  ([31384](https://github.com/civicrm/civicrm-core/pull/31384))**
+
+### Backdrop Integration
+
+- **FormBuilder on Backdrop does not show fields and elements to drag on to form
+  ([dev/core#5561](https://lab.civicrm.org/dev/core/-/issues/5561):
+  [31457](https://github.com/civicrm/civicrm-core/pull/31457))**
+
+### Drupal Integration
+
+- **searchkit download to xlsx broken in drupal 10
+  ([dev/core#5620](https://lab.civicrm.org/dev/core/-/issues/5620):
+  [31504](https://github.com/civicrm/civicrm-core/pull/31504))**
+
+### Standalone Integration
+
+- **standalone: can no longer login
+  ([dev/core#5523](https://lab.civicrm.org/dev/core/-/issues/5523):
+  [31281](https://github.com/civicrm/civicrm-core/pull/31281))**
+
+- **Standalone: 'Reset Paths' in 'Cleanup Caches and Update Paths' logs the user
+  out ([dev/core#5406](https://lab.civicrm.org/dev/core/-/issues/5406):
+  [31418](https://github.com/civicrm/civicrm-core/pull/31418))**
+
+- **Standalone: timezone handling issues
+  ([dev/core#5392](https://lab.civicrm.org/dev/core/-/issues/5392):
+  [31225](https://github.com/civicrm/civicrm-core/pull/31225))**
+
+- **Disable FollowSymLinks by default in Standalone .htaccess
+  ([30866](https://github.com/civicrm/civicrm-core/pull/30866))**
+
+- **email propogation during Standalone user email creation
+  ([31363](https://github.com/civicrm/civicrm-core/pull/31363))**
+
+- **change param name for CRM_Core_Permission_Standalone::check to something
+  that means something.
+  ([31249](https://github.com/civicrm/civicrm-core/pull/31249))**
+
+- **Standalone System - bring default Civi::paths factories in line with
+  installer defaults
+  ([31150](https://github.com/civicrm/civicrm-core/pull/31150))**
+
+- **Standalone - Omit trailing `?` from query string
+  ([31284](https://github.com/civicrm/civicrm-core/pull/31284))**
+
+- **SettingsManager::bootSettings - fix providing CIVICRM_DSN directly on
+  Standalone ([31216](https://github.com/civicrm/civicrm-core/pull/31216))**
+
+- **standalone.css: lower padding around crm-container
+  ([31361](https://github.com/civicrm/civicrm-core/pull/31361))**
+
+### WordPress Integration
+
+- **Shortcodes don't render in my theme in Civi 5.78+
+  ([dev/core#5553](https://lab.civicrm.org/dev/core/-/issues/5553):
+  [337](https://github.com/civicrm/civicrm-wordpress/pull/337))**
+
+- **revert 151-lab due to issues discovered with shortcode button
+  ([334](https://github.com/civicrm/civicrm-wordpress/pull/334))**
+
+## <a name="misc"></a>Miscellany
+
+- **Slightly more understandable tokens() function
+  ([31379](https://github.com/civicrm/civicrm-core/pull/31379))**
+
+- **Clean up the distmaker scripts
+  ([31325](https://github.com/civicrm/civicrm-core/pull/31325))**
+
+- **remove outdated references to getSystemDefaults in bootstrap_comments
+  ([31248](https://github.com/civicrm/civicrm-core/pull/31248))**
+
+- **Api4 - Remove unused pass-by-ref
+  ([31245](https://github.com/civicrm/civicrm-core/pull/31245))**
+
+- **Remove function that was deprecated over 2 years ago
+  ([31407](https://github.com/civicrm/civicrm-core/pull/31407))**
+
+- **Remove unreachable noisily deprecated code
+  ([31242](https://github.com/civicrm/civicrm-core/pull/31242))**
+
+- **Remove a chunk of unreachable noisily deprecated code
+  ([31239](https://github.com/civicrm/civicrm-core/pull/31239))**
+
+- **Remove noisily deprecated unreachable code
+  ([31223](https://github.com/civicrm/civicrm-core/pull/31223))**
+
+- **Remove unused variable
+  ([31368](https://github.com/civicrm/civicrm-core/pull/31368))**
+
+- **[REF] Standalone System - graduate some functions from
+  Civi\Standalone\Security to CRM_Utils_System_Standalone and
+  Civi\Authx\Standalone
+  ([31127](https://github.com/civicrm/civicrm-core/pull/31127))**
+
+- **[REF] Update PHPSpreadsheet to latest version in the 1.x series and allow
+  composer to install the 2.x in D10
+  ([31496](https://github.com/civicrm/civicrm-core/pull/31496))**
+
+- **[REF] AfformGui - Update editOptions code to ES6
+  ([31266](https://github.com/civicrm/civicrm-core/pull/31266))**
+
+- **[REF] Fix empty label accessibility issue on report elements
+  ([30694](https://github.com/civicrm/civicrm-core/pull/30694))**
+
+- **[REF] Accessibility fixes in contact summary page
+  ([30765](https://github.com/civicrm/civicrm-core/pull/30765))**
+
+- **[REF] Ensure that when copying a mailing the status is reset to draftand
+  start date and end date are blanked out
+  ([31522](https://github.com/civicrm/civicrm-core/pull/31522))**
+
+- **[REF] Fix setting mailing start date when the parent job starts "running"
+  for delivery rather than when a child job is picked up
+  ([31517](https://github.com/civicrm/civicrm-core/pull/31517))**
+
+- **[REF][PHP8.2] Declare properies in CRM_Export_Form_Select
+  ([31366](https://github.com/civicrm/civicrm-core/pull/31366))**
+
+- **[REF][PHP8.2] Declare properies in CRM_Contact_Page_View_Tag
+  ([31367](https://github.com/civicrm/civicrm-core/pull/31367))**
+
+- **(NFC) Standalone - Tweak grammar
+  ([31387](https://github.com/civicrm/civicrm-core/pull/31387))**
+
+- **(Test-Only) Fix MinkBase::login() on WordPress
+  ([31488](https://github.com/civicrm/civicrm-core/pull/31488))**
+
+- **Add unit test to validate event
+  ([31234](https://github.com/civicrm/civicrm-core/pull/31234))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following code authors:
+
+AGH Strategies - Andie Hunt; Agileware - Justin Freeman; Artful Robot - Rich
+Lott; Benjamin W; BrightMinded Ltd - Bradley Taylor; Christian Wach; CiviCRM -
+Coleman Watts, Tim Otten; Coop SymbioTIC - Mathieu Lutfy, Shane Bill; Dave D;
+ECOPLAN - Torben Bertram; forumZFD - Marc Michalsky; JMA Consulting - Monish
+Deb, Seamus Lee; John Kingsnorth; Lemniscus - Noah Miller; Megaphone Technology
+Consulting - Jon Goldberg; MJW Consulting - Matthew Wire; Mosier Consulting -
+Justin Mosier; Nicol Wistreich; Outlandish - Rasmus Winter; Parlamentwatch
+e.V. - Philipp Michael; Squiffle Consulting - Aidan Saunders; Tadpole
+Collective - Kevin Cristiano; Wikimedia Foundation - Eileen McNaughton
+
+Most authors also reviewed code for this release; in addition, the following
+reviewers contributed their comments:
+
+ASMAC (American Society of Music Arrangers and Composers) - Jeff Kellem;
+Australian Greens - Andrew Cormick-Dockery; Blackfly Solutions - Alan Dixon;
+Circle Interactive - Dave Jenkins; CiviCRM - Coleman Watts, Tim Otten;
+CiviDesk - Yashodha Chaku; Guydn; Humanists UK - Andrew West; Jade Gaunt;
+Richard van Oosterhout; Stephen Palmstrom; Third Sector Design - Michael
+McAndrew, William Mortada;
diff --git a/civicrm/schema/Activity/Activity.entityType.php b/civicrm/schema/Activity/Activity.entityType.php
index d3c86bd4b4ce3202b4e2565967f1703cffd364e2..58fc0999d51fa0c23957ddcfefd4d24fe4bd8cd1 100644
--- a/civicrm/schema/Activity/Activity.entityType.php
+++ b/civicrm/schema/Activity/Activity.entityType.php
@@ -146,7 +146,7 @@ return [
     ],
     'location' => [
       'title' => ts('Location'),
-      'sql_type' => 'varchar(255)',
+      'sql_type' => 'varchar(2048)',
       'input_type' => 'Text',
       'description' => ts('Location of the activity (optional, open text).'),
       'add' => '1.1',
diff --git a/civicrm/schema/Contribute/Product.entityType.php b/civicrm/schema/Contribute/Product.entityType.php
index 6f8375e9df246a09382ec319582cf049bbb50939..140b0e9f60857111b9a350f2e69f9582627e7a54 100644
--- a/civicrm/schema/Contribute/Product.entityType.php
+++ b/civicrm/schema/Contribute/Product.entityType.php
@@ -7,7 +7,7 @@ return [
   'getInfo' => fn() => [
     'title' => ts('Product'),
     'title_plural' => ts('Products'),
-    'description' => ts('able - stores "product info" for premiums and can be used for non-incentive products'),
+    'description' => ts('Stores "product info" for premiums and can be used for non-incentive products'),
     'log' => TRUE,
     'add' => '1.4',
     'label_field' => 'name',
diff --git a/civicrm/schema/Core/Website.entityType.php b/civicrm/schema/Core/Website.entityType.php
index 526ca1856f785806005a08ee11cc1131ee534032..4495e74356913d8f064626b65ce2857caa3adee2 100644
--- a/civicrm/schema/Core/Website.entityType.php
+++ b/civicrm/schema/Core/Website.entityType.php
@@ -48,7 +48,7 @@ return [
     ],
     'url' => [
       'title' => ts('Website'),
-      'sql_type' => 'varchar(255)',
+      'sql_type' => 'varchar(2048)',
       'input_type' => 'Text',
       'description' => ts('Website'),
       'add' => '3.2',
diff --git a/civicrm/schema/Event/ParticipantStatusType.entityType.php b/civicrm/schema/Event/ParticipantStatusType.entityType.php
index 6ce3ad883b976e79de2a89e3dc128ded00df0506..d0ebc9cdd3a0e32e01b67259be46a38ecb774245 100644
--- a/civicrm/schema/Event/ParticipantStatusType.entityType.php
+++ b/civicrm/schema/Event/ParticipantStatusType.entityType.php
@@ -60,7 +60,7 @@ return [
       ],
     ],
     'is_reserved' => [
-      'title' => ts('Participant Status Is Reserved?>'),
+      'title' => ts('Participant Status Is Reserved?'),
       'sql_type' => 'boolean',
       'input_type' => 'CheckBox',
       'required' => TRUE,
diff --git a/civicrm/schema/Financial/FinancialAccount.entityType.php b/civicrm/schema/Financial/FinancialAccount.entityType.php
index 9c41c4fac3f7e58e97a5ea9026357f23aba8363f..a902adbda1cae1be03cdc08d1f9f1e74f87ac0c6 100644
--- a/civicrm/schema/Financial/FinancialAccount.entityType.php
+++ b/civicrm/schema/Financial/FinancialAccount.entityType.php
@@ -10,7 +10,7 @@ return [
     'description' => ts('Financial Accounts'),
     'log' => TRUE,
     'add' => '3.2',
-    'label_field' => 'name',
+    'label_field' => 'label',
   ],
   'getPaths' => fn() => [
     'add' => 'civicrm/admin/financial/financialAccount/edit?action=add&reset=1',
diff --git a/civicrm/schema/Financial/FinancialType.entityType.php b/civicrm/schema/Financial/FinancialType.entityType.php
index 049232d9b4a9c8b9a381ee9a610ae1fba4c2ca1a..c2027d86279106dcf7ffab2b817aa1659b51bda7 100644
--- a/civicrm/schema/Financial/FinancialType.entityType.php
+++ b/civicrm/schema/Financial/FinancialType.entityType.php
@@ -10,7 +10,7 @@ return [
     'description' => ts('Formerly civicrm_contribution_type merged into this table in 4.3'),
     'log' => TRUE,
     'add' => '1.3',
-    'label_field' => 'name',
+    'label_field' => 'label',
   ],
   'getPaths' => fn() => [
     'add' => 'civicrm/admin/financial/financialType/edit?action=add&reset=1',
diff --git a/civicrm/settings/System.boot.setting.php b/civicrm/settings/Core.boot.setting.php
similarity index 80%
rename from civicrm/settings/System.boot.setting.php
rename to civicrm/settings/Core.boot.setting.php
index ee7b16f3e5c408b2939070562b6af64101ffd92e..fac3eaba330f1c99ab400fad665eaf463705bf12 100644
--- a/civicrm/settings/System.boot.setting.php
+++ b/civicrm/settings/Core.boot.setting.php
@@ -20,7 +20,6 @@
  */
 return [
   'installed' => [
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'CiviCRM Preferences',
     'group' => 'core',
     'name' => 'installed',
@@ -35,7 +34,6 @@ return [
     'help_text' => NULL,
   ],
   'enable_components' => [
-    'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group_name' => 'CiviCRM Preferences',
     'group' => 'core',
     'name' => 'enable_components',
@@ -60,4 +58,20 @@ return [
       'callback' => 'CRM_Core_SelectValues::getComponentSelectValues',
     ],
   ],
+  'domain' => [
+    'group_name' => 'CiviCRM Preferences',
+    'group' => 'core',
+    'name' => 'domain',
+    'type' => 'String',
+    'default' => 1,
+    'title' => ts('CiviCRM Domain ID'),
+    'description' => ts('The current domain if CiviCRM is running multi-site.'),
+    'help_text' => NULL,
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'is_constant' => TRUE,
+    'is_env_loadable' => TRUE,
+    'global_name' => 'CIVICRM_DOMAIN_ID',
+    'add' => '5.80',
+  ],
 ];
diff --git a/civicrm/settings/Url.boot.setting.php b/civicrm/settings/Url.boot.setting.php
index 64f30b4a392e999af85615b593f0b905e88c42cd..0f7f653d54383efad775cc2d54209095b8d826c7 100644
--- a/civicrm/settings/Url.boot.setting.php
+++ b/civicrm/settings/Url.boot.setting.php
@@ -18,6 +18,22 @@
  * Settings metadata file
  */
 return [
+  'userFrameworkBaseURL' => [
+    'group_name' => 'URL Preferences',
+    'group' => 'url',
+    'name' => 'userFrameworkBaseURL',
+    'type' => 'String',
+    'default' => NULL,
+    'title' => ts('User Framework Base URL'),
+    'description' => ts('The base URL of the user framework or CMS that CiviCRM is running in.'),
+    'help_text' => NULL,
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'is_constant' => TRUE,
+    'is_env_loadable' => TRUE,
+    'global_name' => 'CIVICRM_UF_BASEURL',
+    'add' => '5.80',
+  ],
   'userFrameworkResourceURL' => [
     'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().',
     'group' => 'url',
diff --git a/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php b/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php
index 956d0f66bf1f8781c2f68a551669ea37ff7e0892..bd04a8da332ba06d82f82defba9e0d5c15e1de09 100644
--- a/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php
+++ b/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php
@@ -161,22 +161,33 @@ if (!defined('CIVI_SETUP')) {
       ->execute()->indexBy('name');
 
     // Create contact+user for admin.
-    $contactID = \Civi\Api4\Contact::create(FALSE)
-      ->setValues([
-        'contact_type' => 'Individual',
-        'first_name' => 'Standalone',
-        'last_name' => 'Admin',
-      ])
-      ->execute()->first()['id'];
+    $adminUser = $e->getModel()->extras['adminUser'];
+    $adminPass = $e->getModel()->extras['adminPass'];
     $adminEmail = $e->getModel()->extras['adminEmail'];
-    $params = [
-      'cms_name'   => $e->getModel()->extras['adminUser'],
-      'cms_pass'   => $e->getModel()->extras['adminPass'],
-      'email'      => $adminEmail,
-      'notify'     => FALSE,
-      'contact_id' => $contactID,
-    ];
-    $userID = \CRM_Core_BAO_CMSUser::create($params, 'email');
+
+    $contactID = \Civi\Api4\Contact::create(FALSE)
+      ->addValue('contact_type', 'Individual')
+      ->addValue('first_name', 'Standalone')
+      ->addValue('last_name', 'Admin')
+      ->execute()->single()['id'];
+
+    // add email to the contact
+    \Civi\Api4\Email::create(FALSE)
+      ->addValue('contact_id', $contactID)
+      ->addValue('email', $adminEmail)
+      ->execute();
+
+    // NOTE: normally uf_name would be derived automatically
+    // from the contact email, and roles could be provided using
+    // the facade on the User entity
+    // BUT: User BAO pre hooks are not online in the installer
+    // so we need to do them directly
+    $userID = \Civi\Api4\User::create(FALSE)
+      ->addValue('contact_id', $contactID)
+      ->addValue('username', $adminUser)
+      ->addValue('password', $adminPass)
+      ->addValue('uf_name', $adminEmail)
+      ->execute()->single()['id'];
 
     // Assign 'admin' role to user
     \Civi\Api4\UserRole::create(FALSE)
@@ -184,9 +195,9 @@ if (!defined('CIVI_SETUP')) {
       ->addValue('role_id', $roles['admin']['id'])
       ->execute();
 
-    $message = "Created new user \"{$e->getModel()->extras['adminUser']}\" (user ID #$userID, contact ID #$contactID) with 'admin' role and ";
+    $message = "Created new user \"{$adminUser}\" (user ID #$userID, contact ID #$contactID) with 'admin' role and ";
     $message .= empty($e->getModel()->extras['adminPassWasSpecified'])
-    ? "random password \"" . ($e->getModel()->extras['adminPass']) . '"'
+    ? "random password \"" . ($adminPass) . '"'
     : "specified password";
     \Civi::log()->notice($message);
 
diff --git a/civicrm/setup/res/htaccess.txt b/civicrm/setup/res/htaccess.txt
index 3fd51c17ef937859d6cb90327a3c3e14cb07d5a8..3f92ecaa009adb77cc401e9c08bfc36ec030aa96 100644
--- a/civicrm/setup/res/htaccess.txt
+++ b/civicrm/setup/res/htaccess.txt
@@ -16,8 +16,9 @@
 # Don't show directory listings for URLs which map to a directory.
 Options -Indexes
 
-# Follow symbolic links in this directory.
-Options +FollowSymLinks
+# Uncomment if you need to follow symbolic links within your Standalone install
+# (Disabled by default as some webhosts may not allow this)
+# Options +FollowSymLinks
 
 # Make CiviCRM handle any 404 errors.
 ErrorDocument 404 /index.php
diff --git a/civicrm/sql/civicrm_generated.mysql b/civicrm/sql/civicrm_generated.mysql
index 4e7bd09d1490472db33dd67ac2f277349d2a7bac..8a95c030c233c8634c4deee859bd39b8db8ad14b 100644
--- a/civicrm/sql/civicrm_generated.mysql
+++ b/civicrm/sql/civicrm_generated.mysql
@@ -2969,7 +2969,7 @@ UNLOCK TABLES;
 LOCK TABLES `civicrm_domain` WRITE;
 /*!40000 ALTER TABLE `civicrm_domain` DISABLE KEYS */;
 INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES
- (1,'Default Domain Name',NULL,'5.79.1',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
+ (1,'Default Domain Name',NULL,'5.80.0',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
 /*!40000 ALTER TABLE `civicrm_domain` ENABLE KEYS */;
 UNLOCK TABLES;
 
diff --git a/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl b/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl
index 22228d607fd64f0d4e61605eef42a8e1f3a9236a..96d968c329c47879391a2248f230a642294ca91d 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl
@@ -13,7 +13,6 @@
 CRM.$(function($) {
   // Bind first click of accordion header to load crm-accordion-body with snippet
   // everything else is taken care of by crmAccordions()
-  $('.crm-search_criteria_basic-accordion summary').addClass('active');
   $('.crm-ajax-accordion').on('click', 'summary:not(.active)', function() {
     loadPanes($(this).attr('id'));
   });
@@ -87,15 +86,7 @@ CRM.$(function($) {
 {/if}
 
 {strip}
-  <details class="crm-accordion-bold crm-search_criteria_basic-accordion" open>
-    <summary>
-      {ts}Display Settings For Results{/ts}
-    </summary>
-    <div class="crm-accordion-body">
-      {include file="CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl"}
-    </div>
-  </details>
-  <details class="crm-accordion-bold crm-search_criteria_basic-accordion" open>
+  <details class="crm-accordion-settings crm-search_criteria_basic-accordion">
     <summary>
       {ts}Search Settings{/ts}
     </summary>
@@ -108,6 +99,15 @@ CRM.$(function($) {
       {ts}Basic Criteria{/ts}
     </summary>
     <div class="crm-accordion-body">
+      <div class="float-right">
+        <span class="crm-submit-buttons reset-advanced-search">
+          <a href="{crmURL p='civicrm/contact/search/advanced' q='reset=1'}" id="resetAdvancedSearch" class="crm-hover-button crm-inline-button" title="{ts}Clear all search criteria{/ts}">
+            <i class="crm-i fa-undo" aria-hidden="true"></i>
+            &nbsp;{ts}Reset Form{/ts}
+          </a>
+        </span>
+        {include file="CRM/common/formButtons.tpl" location="top"}
+      </div>
       {include file="CRM/Contact/Form/Search/Criteria/Basic.tpl"}
     </div>
   </details>
@@ -125,12 +125,6 @@ CRM.$(function($) {
     <tr>
       <td>
         {include file="CRM/common/formButtons.tpl" location="bottom"}
-        <div class="crm-submit-buttons reset-advanced-search">
-          <a href="{crmURL p='civicrm/contact/search/advanced' q='reset=1'}" id="resetAdvancedSearch" class="crm-hover-button" title="{ts}Clear all search criteria{/ts}">
-            <i class="crm-i fa-undo" aria-hidden="true"></i>
-            &nbsp;{ts}Reset Form{/ts}
-          </a>
-        </div>
       </td>
     </tr>
   </table>
diff --git a/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl b/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl
index 8b93dbbfc74bcacedad10d5996adcfa762a15d95..91c9476016e163642adf32da6a6b570232ebc7e2 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl
@@ -33,4 +33,9 @@
       {include file=$fieldSpec.template}
     {/if}
   {/foreach}
+  {if !empty($form.deleted_contacts)}
+    <div class="search-field">
+      {$form.deleted_contacts.html} {$form.deleted_contacts.label}
+    </div>
+  {/if}
 </div>
diff --git a/civicrm/templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl b/civicrm/templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl
deleted file mode 100644
index 7a969b8514c21bc167cf7add62ab99e132321b66..0000000000000000000000000000000000000000
--- a/civicrm/templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-<div id="display-settings" class="form-item">
-  <table>
-    <tr>
-      <td>
-        {if !empty($form.component_mode)}
-          {$form.component_mode.label} {help id="id-display-results"}
-          <br />
-          {$form.component_mode.html}
-          {if !empty($form.display_relationship_type)}
-            <div id="crm-display_relationship_type">{$form.display_relationship_type.html}</div>
-          {/if}
-        {else}
-          &nbsp;
-        {/if}
-      </td>
-      <td>
-        {$form.uf_group_id.label} {help id="id-search-views"}<br />{$form.uf_group_id.html}
-      </td>
-    </tr>
-  </table>
-</div>
diff --git a/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl b/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl
index b788e7f364eb8f563f6210651727c20ed05fd500..75166d2ddc9241fa5d710eedb57fde643b674800 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl
@@ -1,19 +1,20 @@
-<div id="search-settings" class="form-item">
-  <table>
-    <tr>
-      <td>{$form.operator.label} {help id="id-search-operator"}<br />{$form.operator.html}</td>
-      <td>
-        {if !empty($form.deleted_contacts)}{$form.deleted_contacts.html} {$form.deleted_contacts.label}{/if}
-      </td>
-      <td class="adv-search-top-submit" colspan="2">
-          {include file="CRM/common/formButtons.tpl" location="top"}
-        <div class="crm-submit-buttons reset-advanced-search">
-          <a href="{crmURL p='civicrm/contact/search/advanced' q='reset=1'}" id="resetAdvancedSearch" class="crm-hover-button" title="{ts}Clear all search criteria{/ts}">
-            <i class="crm-i fa-undo" aria-hidden="true"></i>
-            &nbsp;{ts}Reset Form{/ts}
-          </a>
-        </div>
-      </td>
-    </tr>
-  </table>
+<div id="display-settings" class="advanced-search-fields basic-fields form-layout">
+  <div class="search-field">
+    {if !empty($form.component_mode)}
+      {$form.component_mode.label} {help id="id-display-results"}
+      <br />
+      {$form.component_mode.html}
+      {if !empty($form.display_relationship_type)}
+        <div id="crm-display_relationship_type">{$form.display_relationship_type.html}</div>
+      {/if}
+    {else}
+      &nbsp;
+    {/if}
+  </div>
+  <div class="search-field">
+    {$form.uf_group_id.label} {help id="id-search-views"}<br />{$form.uf_group_id.html}
+  </div>
+  <div class="search-field">
+    {$form.operator.label} {help id="id-search-operator"}<br />{$form.operator.html}
+  </div>
 </div>
diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl
index 86e887eca8ab5e6a745db894a8876b72047a8b67..dda6377301939f1ad9c9054efca770f2a37aa8f8 100644
--- a/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl
@@ -10,7 +10,7 @@
 {if $action & 1024}
   {include file="CRM/Contribute/Form/Contribution/PreviewHeader.tpl"}
 {/if}
-
+{* Please keep Confirm.tpl and ThankYou.tpl somewhat in sync *}
 <div class="crm-contribution-page-id-{$contributionPageID} crm-block crm-contribution-confirm-form-block" data-page-id="{$contributionPageID}" data-page-template="confirm">
   <div class="help">
     <p>{ts}Please verify the information below carefully. Click <strong>Go Back</strong> if you need to make changes.{/ts}
@@ -32,138 +32,136 @@
         {if !$membershipBlock AND $amount OR ($isDisplayLineItems and $lineItem)}{ts}Contribution Amount{/ts}{else}{ts}Membership Fee{/ts} {/if}
       </div>
 
-      <div class="display-block">
-        {if $isDisplayLineItems && $lineItem}
-          {if !$amount}{assign var="amount" value=0}{/if}
-          {assign var="totalAmount" value=$amount}
-          {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" getTaxDetails=$totalTaxAmount displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''}
-        {elseif $is_separate_payment}
-          {if $amount AND $minimum_fee}
-            {$membership_name} {ts}Membership{/ts}:
-            <strong>{$membershipTotalAmount|crmMoney}</strong>
-            <br/>
-            {ts}Additional Contribution{/ts}:
-            <strong>{$nonMembershipTotalAmount|crmMoney}</strong>
-            <br/>
-            <strong> -------------------------------------------</strong>
-            <br/>
-            {ts}Total{/ts}:
-            <strong>{$orderTotal|crmMoney}</strong>
-            <br/>
-          {elseif $amount}
-            {ts}Amount{/ts}:
-            <strong>{$amount|crmMoney} {if $amount_level}<span class='crm-price-amount-label'>
-                &ndash; {$amount_level}</span>{/if}</strong>
-          {else}
-            {$membership_name} {ts}Membership{/ts}:
-            <strong>{$minimum_fee|crmMoney}</strong>
-          {/if}
-        {else}
-          {if $totalTaxAmount}
-            {ts 1=$taxTerm}Total %1 Amount{/ts}:
-            <strong>{$totalTaxAmount|crmMoney} </strong>
-            <br/>
-          {/if}
-          {if $amount}
-            {if $installments}{ts}Installment Amount{/ts}{else}{ts}Total Amount{/ts}{/if}:
-            <strong>{$amount|crmMoney:$currency}{if $amount_level}<span class='crm-price-amount-label'>
-                &ndash; {$amount_level}</span>{/if}</strong>
+      <div class="crm-section no-label amount_display-section">
+        <div class="content">
+          {if $isDisplayLineItems && $lineItem}
+            {if !$amount}{assign var="amount" value=0}{/if}
+            {assign var="totalAmount" value=$amount}
+            {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" getTaxDetails=$totalTaxAmount displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''}
+          {elseif $is_separate_payment}
+            {if $amount AND $minimum_fee}
+              {$membership_name} {ts}Membership{/ts}:
+              <strong>{$membershipTotalAmount|crmMoney}</strong>
+              <br/>
+              {ts}Additional Contribution{/ts}:
+              <strong>{$nonMembershipTotalAmount|crmMoney}</strong>
+              <br/>
+              <strong> -------------------------------------------</strong>
+              <br/>
+              {ts}Total{/ts}:
+              <strong>{$orderTotal|crmMoney}</strong>
+              <br/>
+            {elseif $amount}
+              {ts}Amount{/ts}:
+              <strong>{$amount|crmMoney} {if $amount_level}<span class='crm-price-amount-label'>
+                  &ndash; {$amount_level}</span>{/if}</strong>
+            {else}
+              {$membership_name} {ts}Membership{/ts}:
+              <strong>{$minimum_fee|crmMoney}</strong>
+            {/if}
           {else}
-            {$membership_name} {ts}Membership{/ts}:
-            <strong>{$minimum_fee|crmMoney}</strong>
+            {if $totalTaxAmount}
+              {ts}Tax Amount{/ts}: <strong>{$totalTaxAmount|crmMoney}</strong><br />
+            {/if}
+            {if $amount}
+              {if $installments}{ts}Installment Amount{/ts}{else}{ts}Total Amount{/ts}{/if}:
+              <strong>{$amount|crmMoney:$currency}{if $amount_level}<span class='crm-price-amount-label'>
+                  &ndash; {$amount_level}</span>{/if}</strong>
+            {else}
+              {$membership_name} {ts}Membership{/ts}:
+              <strong>{$minimum_fee|crmMoney}</strong>
+            {/if}
           {/if}
-        {/if}
 
-        {if $is_recur}
-          {if !empty($auto_renew)} {* Auto-renew membership confirmation *}
-            {crmRegion name="contribution-confirm-recur-membership"}
-              <br />
-                {if $frequency_interval > 1}
-                  {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
-                  {if $frequency_unit eq 'day'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong>
-                  {elseif $frequency_unit eq 'week'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong>
-                  {elseif $frequency_unit eq 'month'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong>
-                  {elseif $frequency_unit eq 'year'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong>
+          {* Recurring contribution / pledge information *}
+          {if $is_recur}
+            {if !empty($auto_renew)} {* Auto-renew membership confirmation *}
+              {crmRegion name="contribution-confirm-recur-membership"}
+                <p>
+                  {if $frequency_interval > 1}
+                    {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
+                    {if $frequency_unit eq 'day'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong>
+                    {elseif $frequency_unit eq 'week'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong>
+                    {elseif $frequency_unit eq 'month'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong>
+                    {elseif $frequency_unit eq 'year'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong>
+                    {/if}
+                  {else}
+                    {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
+                    {if $frequency_unit eq 'day'}
+                      <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong>
+                    {elseif $frequency_unit eq 'week'}
+                      <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong>
+                    {elseif $frequency_unit eq 'month'}
+                      <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong>
+                    {elseif $frequency_unit eq 'year'}
+                      <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong>
+                    {/if}
                   {/if}
-                {else}
-                  {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
-                  {if $frequency_unit eq 'day'}
-                    <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong>
-                  {elseif $frequency_unit eq 'week'}
-                    <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong>
-                  {elseif $frequency_unit eq 'month'}
-                    <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong>
-                  {elseif $frequency_unit eq 'year'}
-                    <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong>
-                  {/if}
-                {/if}
-              <div class="description crm-auto-renew-cancel-info">{ts}Your initial membership fee will be processed once you complete the confirmation step. You will be able to cancel the auto-renewal option by visiting the web page link that will be included in your receipt.{/ts}</div>
-            {/crmRegion}
-          {else}
-            {crmRegion name="contribution-confirm-recur"}
-              {if $installments > 1}
-                {if $frequency_interval > 1}
-                  {if $frequency_unit eq 'day'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'week'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'month'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'year'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                </p>
+                <div class="description crm-auto-renew-cancel-info">{ts}Your initial membership fee will be processed once you complete the confirmation step. You will be able to cancel the auto-renewal option by visiting the web page link that will be included in your receipt.{/ts}</div>
+              {/crmRegion}
+            {else}
+              {crmRegion name="contribution-confirm-recur"}
+                {if $installments > 1}
+                  {if $frequency_interval > 1}
+                    {if $frequency_unit eq 'day'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'week'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'month'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'year'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {/if}
+                  {else}
+                    <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p>
                   {/if}
                 {else}
-                  <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p>
-                {/if}
-              {else}
-                {if $frequency_interval > 1}
-                  {if $frequency_unit eq 'day'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'week'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'month'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'year'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p>
-                  {/if}
-                {else}
-                  {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
-                  {if $frequency_unit eq 'day'}
-                    <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'week'}
-                    <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'month'}
-                    <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'year'}
-                    <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p>
+                  {if $frequency_interval > 1}
+                    {if $frequency_unit eq 'day'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'week'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'month'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'year'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p>
+                    {/if}
+                  {else}
+                    {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
+                    {if $frequency_unit eq 'day'}
+                      <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'week'}
+                      <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'month'}
+                      <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'year'}
+                      <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p>
+                    {/if}
                   {/if}
                 {/if}
-              {/if}
-            <p>{ts}Your initial contribution will be processed once you complete the confirmation step. You will be able to cancel the recurring contribution by visiting the web page link that will be included in your receipt.{/ts}</p>
-            {/crmRegion}
+                <p>{ts}Your initial contribution will be processed once you complete the confirmation step. You will be able to cancel the recurring contribution by visiting the web page link that will be included in your receipt.{/ts}</p>
+              {/crmRegion}
+            {/if}
           {/if}
-        {/if}
-
-        {if $is_pledge}
-          {if $pledge_frequency_interval GT 1}
-            <p>
-              <strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong>
-            </p>
-          {else}
-            <p>
-              <strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong>
-            </p>
-          {/if}
-          {if $is_pay_later}
-            <p>{ts 1=$receiptFromEmail 2=$button}Click &quot;%2&quot; below to register your pledge. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p>
-          {else}
-            <p>{ts 1=$receiptFromEmail 2=$button}Your initial pledge payment will be processed when you click &quot;%2&quot; below. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p>
+          {if $is_pledge}
+            {if $pledge_frequency_interval GT 1}
+              <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong></p>
+            {else}
+              <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong></p>
+            {/if}
+            {if $is_pay_later}
+              <p>{ts 1=$receiptFromEmail 2=$button}Click &quot;%2&quot; below to register your pledge. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p>
+            {else}
+              <p>{ts 1=$receiptFromEmail 2=$button}Your initial pledge payment will be processed when you click &quot;%2&quot; below. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p>
+            {/if}
           {/if}
-        {/if}
+        </div>
+        <div class="clear"></div>
       </div>
     </div>
   {/if}
@@ -204,51 +202,48 @@
         {if $pcp_is_anonymous}
           <strong>{ts}anonymously{/ts}.</strong>
         {else}
-          {ts}under the name{/ts}:
-          <strong>{$pcp_roll_nickname}</strong>
-          <br/>
+          {ts}under the name{/ts}: <strong>{$pcp_roll_nickname}</strong><br/>
           {if $pcp_personal_note}
-            {ts}With the personal note{/ts}:
-            <strong>{$pcp_personal_note}</strong>
+            {ts}With the personal note{/ts}: <strong>{$pcp_personal_note}</strong>
           {else}
             <strong>{ts}With no personal note{/ts}</strong>
           {/if}
         {/if}
-        <br/>
+        <br />
       </div>
     </div>
   {/if}
 
-    {if $billingName or $address}
-        <div class="crm-group billing_name_address-group">
-          <div class="header-dark">
+  {if $billingName or $address}
+      <div class="crm-group billing_name_address-group">
+        <div class="header-dark">
             {ts}Billing Name and Address{/ts}
-          </div>
-          <div class="crm-section no-label billing_name-section">
-            <div class="content">{$billingName}</div>
-            <div class="clear"></div>
-          </div>
-          <div class="crm-section no-label billing_address-section">
-            <div class="content">{$address|nl2br}</div>
-            <div class="clear"></div>
-          </div>
         </div>
-      {/if}
-    {if $email && !$emailExists}
-      <div class="crm-group contributor_email-group">
-        <div class="header-dark">
-          {ts}Your Email{/ts}
+        <div class="crm-section no-label billing_name-section">
+          <div class="content">{$billingName}</div>
+          <div class="clear"></div>
         </div>
-        <div class="crm-section no-label contributor_email-section">
-          <div class="content">{$email}</div>
+        <div class="crm-section no-label billing_address-section">
+          <div class="content">{$address|nl2br}</div>
           <div class="clear"></div>
         </div>
       </div>
     {/if}
+  {if !$emailExists && $email}
+    <div class="crm-group contributor_email-group">
+      <div class="header-dark">
+        {ts}Your Email{/ts}
+      </div>
+      <div class="crm-section no-label contributor_email-section">
+        <div class="content">{$email}</div>
+        <div class="clear"></div>
+      </div>
+    </div>
+  {/if}
 
   {* Show credit or debit card section for 'direct' mode, except for PayPal Express (detected because credit card number is empty) *}
+  {if in_array('credit_card_number', $paymentFields) || in_array('bank_account_number', $paymentFields) && ($amount GT 0 OR $minimum_fee GT 0)}
     {crmRegion name="contribution-confirm-billing-block"}
-    {if in_array('credit_card_number', $paymentFields) || in_array('bank_account_number', $paymentFields)}
       <div class="crm-group credit_card-group">
         {if $paymentFieldsetLabel}
           <div class="header-dark">
@@ -257,10 +252,10 @@
         {/if}
         {if in_array('bank_account_number', $paymentFields) && $bank_account_number}
           <div class="display-block">
-            {ts}Account Holder{/ts}: {$account_holder}<br/>
-            {ts}Bank Account Number{/ts}: {$bank_account_number}<br/>
-            {ts}Bank Identification Number{/ts}: {$bank_identification_number}<br/>
-            {ts}Bank Name{/ts}: {$bank_name}<br/>
+            {ts}Account Holder{/ts}: {$account_holder}<br />
+            {ts}Bank Identification Number{/ts}: {$bank_identification_number}<br />
+            {ts}Bank Name{/ts}: {$bank_name}<br />
+            {ts}Bank Account Number{/ts}: {$bank_account_number}<br />
           </div>
           {if $paymentAgreementText}
             <div class="crm-group debit_agreement-group">
@@ -282,8 +277,8 @@
           </div>
         {/if}
       </div>
-    {/if}
     {/crmRegion}
+  {/if}
 
   {include file="CRM/Contribute/Form/Contribution/PremiumBlock.tpl" context="confirmContribution" showPremiumSelectionFields=false preview=false}
 
diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl
index 04cd616d8e85274be5159999953e94ca16386184..b91dbb3404da50a247f05e0b15fcc40b6686b7dd 100644
--- a/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl
@@ -26,30 +26,14 @@
         {/if}
       {/if}
     </div>
-
   {strip}
-    <table id="membership-listings">
+    <div id="membership-listings">
       {foreach from=$membershipTypes item=row}
-        <tr valign="top">
-          <td style="width: auto;">
-                <span class="bold">{$row.name} &nbsp;
-                </span><br />
-            {$row.description} &nbsp;
-          </td>
-
-          <td style="width: auto;">
-          </td>
-        </tr>
-
+        <p>
+          <strong>{$row.name}</strong>
+          <br>{$row.description}
+        </p>
       {/foreach}
-      {if array_key_exists('auto_renew', $form)}
-        <tr id="allow_auto_renew">
-          <td style="width: auto;">{$form.auto_renew.html}</td>
-          <td style="width: auto;">
-            {$form.auto_renew.label}
-          </td>
-        </tr>
-      {/if}
-    </table>
+    </div>
   {/strip}
 {/if}
diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl
index 5dcd0f0f48ddcde655d38cb2542cd5e24f6a2f10..eab284a811601b17e3185889b1ef7300c140aa54 100644
--- a/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl
@@ -10,7 +10,7 @@
 {if $action & 1024}
   {include file="CRM/Contribute/Form/Contribution/PreviewHeader.tpl"}
 {/if}
-
+{* Please keep Confirm.tpl and ThankYou.tpl somewhat in sync *}
 <div class="crm-contribution-page-id-{$contributionPageID} crm-block crm-contribution-thankyou-form-block" data-page-id="{$contributionPageID}" data-page-template="thankyou">
   {if $thankyou_text}
     <div id="thankyou_text" class="crm-section thankyou_text-section">
@@ -78,135 +78,138 @@
         {if !$membershipBlock AND $amount OR ($priceSetID and $lineItem)}{ts}Contribution Information{/ts}{else}{ts}Membership Fee{/ts}{/if}
       </div>
 
-      <div class="display-block">
-        {if $lineItem and $priceSetID}
-          {if !$amount}{assign var="amount" value=0}{/if}
-          {assign var="totalAmount" value=$amount}
-          {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''}
-        {elseif $membership_amount}
-          {$membership_name} {ts}Membership{/ts}: <strong>{$membership_amount|crmMoney}</strong><br />
-          {if $amount}
-            {if !$is_separate_payment}
-              {ts}Contribution Amount{/ts}: <strong>{$amount|crmMoney}</strong><br />
-            {else}
-              {ts}Additional Contribution{/ts}: <strong>{$amount|crmMoney}</strong><br />
+      <div class="crm-section no-label amount_display-section">
+        <div class="content">
+          {if $lineItem and $priceSetID}
+            {if !$amount}{assign var="amount" value=0}{/if}
+            {assign var="totalAmount" value=$amount}
+            {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''}
+          {elseif $membership_amount}
+            {$membership_name} {ts}Membership{/ts}: <strong>{$membership_amount|crmMoney}</strong><br />
+            {if $amount}
+              {if !$is_separate_payment}
+                {ts}Contribution Amount{/ts}: <strong>{$amount|crmMoney}</strong><br />
+              {else}
+                {ts}Additional Contribution{/ts}: <strong>{$amount|crmMoney}</strong><br />
+              {/if}
             {/if}
+            <strong> -------------------------------------------</strong><br />
+            {ts}Total{/ts}: <strong>{$orderTotal|crmMoney}</strong><br />
+          {else}
+            {if $totalTaxAmount}
+              {ts}Tax Amount{/ts}: <strong>{$totalTaxAmount|crmMoney}</strong><br />
+            {/if}
+            {if $installments}{ts}Installment Amount{/ts}{else}{ts}Amount{/ts}{/if}: <strong>{$amount|crmMoney:$currency}{if $amount_level} &ndash; {$amount_level}{/if}</strong>
           {/if}
-          <strong> -------------------------------------------</strong><br />
-          {ts}Total{/ts}: <strong>{$orderTotal|crmMoney}</strong><br />
-        {else}
-          {if $totalTaxAmount}
-            {ts}Tax Amount{/ts}: <strong>{$totalTaxAmount|crmMoney}</strong><br />
-          {/if}
-          {if $installments}{ts}Installment Amount{/ts}{else}{ts}Amount{/ts}{/if}: <strong>{$amount|crmMoney:$currency}{if $amount_level} &ndash; {$amount_level}{/if}</strong>
-        {/if}
 
-        {if $receive_date}
-          {ts}Date{/ts}: <strong>{$receive_date|crmDate}</strong><br />
-        {/if}
-        {if $trxn_id}
-          {ts}Transaction #{/ts}: {$trxn_id}<br />
-        {/if}
-        {if $membership_trx_id}
-          {ts}Membership Transaction #{/ts}: {$membership_trx_id}
-        {/if}
+          {if $receive_date}
+            {ts}Date{/ts}: <strong>{$receive_date|crmDate}</strong><br />
+          {/if}
+          {if $trxn_id}
+            {ts}Transaction #{/ts}: {$trxn_id}<br />
+          {/if}
+          {if $membership_trx_id}
+            {ts}Membership Transaction #{/ts}: {$membership_trx_id}
+          {/if}
 
-        {* Recurring contribution / pledge information *}
-        {if $is_recur}
-          {if !empty($auto_renew)} {* Auto-renew membership confirmation *}
-            {crmRegion name="contribution-thankyou-recur-membership"}
-              <br />
-                {if $frequency_interval > 1}
-                  {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
-                  {if $frequency_unit eq 'day'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong>
-                  {elseif $frequency_unit eq 'week'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong>
-                  {elseif $frequency_unit eq 'month'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong>
-                  {elseif $frequency_unit eq 'year'}
-                    <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong>
+          {* Recurring contribution / pledge information *}
+          {if $is_recur}
+            {if !empty($auto_renew)} {* Auto-renew membership confirmation *}
+              {crmRegion name="contribution-thankyou-recur-membership"}
+                <p>
+                  {if $frequency_interval > 1}
+                    {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
+                    {if $frequency_unit eq 'day'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong>
+                    {elseif $frequency_unit eq 'week'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong>
+                    {elseif $frequency_unit eq 'month'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong>
+                    {elseif $frequency_unit eq 'year'}
+                      <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong>
+                    {/if}
+                  {else}
+                    {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
+                    {if $frequency_unit eq 'day'}
+                      <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong>
+                    {elseif $frequency_unit eq 'week'}
+                      <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong>
+                    {elseif $frequency_unit eq 'month'}
+                      <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong>
+                    {elseif $frequency_unit eq 'year'}
+                      <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong>
+                    {/if}
+                  {/if}
+                </p>
+                <div class="description crm-auto-renew-cancel-info">{ts}You will receive an email receipt which includes information about how to cancel the auto-renewal option.{/ts}</div>
+              {/crmRegion}
+            {else}
+              {crmRegion name="contribution-thankyou-recur"}
+                {if $installments > 1}
+                  {if $frequency_interval > 1}
+                    {if $frequency_unit eq 'day'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'week'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'month'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'year'}
+                      <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p>
+                    {/if}
+                  {else}
+                    <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p>
                   {/if}
                 {else}
-                  {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
-                  {if $frequency_unit eq 'day'}
-                    <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong>
-                  {elseif $frequency_unit eq 'week'}
-                    <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong>
-                  {elseif $frequency_unit eq 'month'}
-                    <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong>
-                  {elseif $frequency_unit eq 'year'}
-                    <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong>
+                  {if $frequency_interval > 1}
+                    {if $frequency_unit eq 'day'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'week'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'month'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'year'}
+                      <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p>
+                    {/if}
+                  {else}
+                    {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
+                    {if $frequency_unit eq 'day'}
+                      <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'week'}
+                      <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'month'}
+                      <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p>
+                    {elseif $frequency_unit eq 'year'}
+                      <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p>
+                    {/if}
                   {/if}
                 {/if}
-              <div class="description crm-auto-renew-cancel-info">({ts}You will receive an email receipt which includes information about how to cancel the auto-renewal option.{/ts})</div>
-            {/crmRegion}
-          {else}
-            {crmRegion name="contribution-thankyou-recur"}
-              {if $installments > 1}
-                {if $frequency_interval > 1}
-                  {if $frequency_unit eq 'day'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'week'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'month'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'year'}
-                    <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p>
-                  {/if}
-                {else}
-                  <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p>
+                {if $is_email_receipt}
+                  <p>
+                    {ts}You will receive an email receipt which includes information about how to update or cancel this recurring contribution.{/ts}
+                  </p>
                 {/if}
+              {/crmRegion}
+            {/if}
+          {/if}
+          {if $is_pledge}
+            {if $pledge_frequency_interval GT 1}
+              <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong></p>
+            {else}
+              <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong></p>
+            {/if}
+            <p>
+              {if $is_pay_later}
+                {ts 1=$receiptFromEmail}We will record your initial pledge payment when we receive it from you. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}
               {else}
-                {if $frequency_interval > 1}
-                  {if $frequency_unit eq 'day'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'week'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'month'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'year'}
-                    <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p>
-                  {/if}
-                {else}
-                  {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *}
-                  {if $frequency_unit eq 'day'}
-                    <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'week'}
-                    <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'month'}
-                    <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p>
-                  {elseif $frequency_unit eq 'year'}
-                    <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p>
-                  {/if}
-                {/if}
+                {ts 1=$receiptFromEmail}Your initial pledge payment has been processed. You will be able to modify or cancel future pledge payments at any time by contacting us at %1.{/ts}
               {/if}
-              {if $is_email_receipt}
-                <p>
-                  {ts}You will receive an email receipt which includes information about how to update or cancel this recurring contribution.{/ts}
-                </p>
+              {if $max_reminders}
+                {ts 1=$initial_reminder_day}We will send you a payment reminder %1 days prior to each scheduled payment date. The reminder will include a link to a page where you can make your payment online.{/ts}
               {/if}
-            {/crmRegion}
-          {/if}
-        {/if}
-
-        {if $is_pledge}
-          {if $pledge_frequency_interval GT 1}
-            <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong></p>
-          {else}
-            <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong></p>
+            </p>
           {/if}
-          <p>
-            {if $is_pay_later}
-              {ts 1=$receiptFromEmail}We will record your initial pledge payment when we receive it from you. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}
-            {else}
-              {ts 1=$receiptFromEmail}Your initial pledge payment has been processed. You will be able to modify or cancel future pledge payments at any time by contacting us at %1.{/ts}
-            {/if}
-            {if $max_reminders}
-              {ts 1=$initial_reminder_day}We will send you a payment reminder %1 days prior to each scheduled payment date. The reminder will include a link to a page where you can make your payment online.{/ts}
-            {/if}
-          </p>
-        {/if}
+        </div>
+        <div class="clear"></div>
       </div>
     </div>
   {/if}
@@ -214,7 +217,7 @@
   {if $onbehalfProfile && $onbehalfProfile|@count}
     <div class="crm-group onBehalf_display-group label-left crm-profile-view">
       {include file="CRM/UF/Form/Block.tpl" fields=$onbehalfProfile prefix='onbehalf' hideFieldset=false}
-     </div>
+    </div>
   {/if}
 
   {if $honoreeProfileFields && $honoreeProfileFields|@count}
@@ -223,12 +226,12 @@
         {$soft_credit_type}
       </div>
       <div class="display-block">
-       <div class="label-left crm-section honoree_profile-section">
+        <div class="label-left crm-section honoree_profile-section">
           <strong>{$honorName}</strong><br/>
           {include file="CRM/UF/Form/Block.tpl" fields=$honoreeProfileFields prefix='honor' hideFieldset=false}
         </div>
       </div>
-   </div>
+    </div>
   {/if}
 
   {if $customPre}
@@ -277,7 +280,7 @@
   {if !$emailExists && $email}
     <div class="crm-group contributor_email-group">
       <div class="header-dark">
-          {ts}Your Email{/ts}
+        {ts}Your Email{/ts}
       </div>
       <div class="crm-section no-label contributor_email-section">
         <div class="content">{$email}</div>
@@ -294,7 +297,7 @@
             {$paymentFieldsetLabel}
           </div>
         {/if}
-          {if in_array('bank_account_number', $paymentFields) && $bank_account_number}
+        {if in_array('bank_account_number', $paymentFields) && $bank_account_number}
           <div class="display-block">
             {ts}Account Holder{/ts}: {$account_holder}<br />
             {ts}Bank Identification Number{/ts}: {$bank_identification_number}<br />
diff --git a/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl b/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl
index 9bc8da609ed2729730f13e7d3454e6a52b2c126d..9ae3dde95a92bfeb68948eea6c22cb0713720754 100644
--- a/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl
@@ -137,7 +137,8 @@
   </details>
   {/crmRegion}
  {/if}
-<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
+  {include file="CRM/common/customDataBlock.tpl" customDataType='Product' entityID=$productId}
+  <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
 </div>
 {if $action eq 1 or $action eq 2}
 
diff --git a/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl b/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl
index 019d5761e8e16d0b928293866b863254b3c9a172..572aef78a2419e23a4810e84ba107c59bed4e2af 100644
--- a/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl
+++ b/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl
@@ -37,7 +37,7 @@
         <td id="locUsedMsg" colspan="3">
         </td>
       </tr>
-      <tr id="is_show_location" class="crm-event-manage-location-form-block-is_show_location">
+      <tr class="crm-event-manage-location-form-block-is_show_location">
         <td class="labels">
           {$form.is_show_location.label} {help id="id-is_show_location"}
         </td>
diff --git a/civicrm/templates/CRM/Event/Page/DashBoard.tpl b/civicrm/templates/CRM/Event/Page/DashBoard.tpl
index 1fb1c38ce3a0cd7ba3b7690fe1ba6a906104d028..19d258b7eb3872480af01f3dd6411393fe8e7bd0 100644
--- a/civicrm/templates/CRM/Event/Page/DashBoard.tpl
+++ b/civicrm/templates/CRM/Event/Page/DashBoard.tpl
@@ -125,13 +125,9 @@
 {else}
     <br />
     <div class="messages status no-popup">
-        <table>
-            <tr>{icon icon="fa-info-circle"}{/icon}</tr>
-            <tr>
-                {ts}There are no active Events to display.{/ts}
-                {ts 1=$newEventURL}You can <a href="%1">Create a New Event</a> now.{/ts}
-            </tr>
-        </table>
+      {icon icon="fa-info-circle"}{/icon}
+      {ts}There are no active Events to display.{/ts}
+      {ts 1=$newEventURL}You can <a href="%1">Create a New Event</a> now.{/ts}
     </div>
 {/if}
 
diff --git a/civicrm/templates/CRM/Mailing/Page/Report.tpl b/civicrm/templates/CRM/Mailing/Page/Report.tpl
index ce763e86bdc21b1d03f3488be0a9fbc7059aeff7..78d3150287a014b32859abd31514be535e5c2e92 100644
--- a/civicrm/templates/CRM/Mailing/Page/Report.tpl
+++ b/civicrm/templates/CRM/Mailing/Page/Report.tpl
@@ -152,9 +152,13 @@
 <tr>
   <td class="label nowrap">{ts}Text Message{/ts}</td>
   <td>
-    {$report.mailing.body_text|mb_truncate:30|escape|nl2br}
-    <br />
-    <strong><a class="crm-popup" href='{$textViewURL}'><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View complete message{/ts}</a></strong>
+    {if $report.mailing.sms_provider_id}
+      {$report.mailing.body_text|escape|nl2br}
+    {else}
+      {$report.mailing.body_text|mb_truncate:100|escape|nl2br}
+      <br />
+      <strong><a class="crm-popup" href='{$textViewURL}'><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View complete message{/ts}</a></strong>
+    {/if}
   </td>
 </tr>
 {/if}
@@ -188,25 +192,24 @@
 <legend>
     {ts}Mailing Settings{/ts}
 </legend>
-{strip}
 <table class="crm-info-panel">
 <tr><td class="label">{ts}Mailing Name{/ts}</td><td>{$report.mailing.name}</td></tr>
-<tr><td class="label">{ts}Subject{/ts}</td><td>{$report.mailing.subject}</td></tr>
-<tr><td class="label">{ts}From{/ts}</td><td>{$report.mailing.from_name} &lt;{$report.mailing.from_email}&gt;</td></tr>
-<tr><td class="label">{ts}Reply-to email{/ts}</td><td>{$report.mailing.replyto_email|escape:'htmlall'}</td></tr>
-
-<tr><td class="label">{ts}Forward replies{/ts}</td><td>{if $report.mailing.forward_replies}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
-<tr><td class="label">{ts}Auto-respond to replies{/ts}</td><td>{if $report.mailing.auto_responder}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
-
-<tr><td class="label">{ts}Open tracking{/ts}</td><td>{if $report.mailing.open_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
-<tr><td class="label">{ts}URL Click-through tracking{/ts}</td><td>{if $report.mailing.url_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
-{if $public_url}<td class="label">{ts}Public url{/ts}</td><td><a href="{$public_url}"> {$public_url}</a></td></tr>{/if}
+{if !$report.mailing.sms_provider_id}
+  <tr><td class="label">{ts}Subject{/ts}</td><td>{$report.mailing.subject}</td></tr>
+  <tr><td class="label">{ts}From{/ts}</td><td>{$report.mailing.from_name} &lt;{$report.mailing.from_email}&gt;</td></tr>
+  <tr><td class="label">{ts}Reply-to email{/ts}</td><td>{$report.mailing.replyto_email|escape:'htmlall'}</td></tr>
+  <tr><td class="label">{ts}Forward replies{/ts}</td><td>{if $report.mailing.forward_replies}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
+  <tr><td class="label">{ts}Auto-respond to replies{/ts}</td><td>{if $report.mailing.auto_responder}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
+  <tr><td class="label">{ts}Open tracking{/ts}</td><td>{if $report.mailing.open_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
+  <tr><td class="label">{ts}URL Click-through tracking{/ts}</td><td>{if $report.mailing.url_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr>
+{/if}
+{if $public_url}
+  <tr><td class="label">{ts}Public url{/ts}</td><td><a href="{$public_url}"> {$public_url}</a></td></tr>
+{/if}
 {if $report.mailing.campaign}
-<tr><td class="label">{ts}Campaign{/ts}</td><td>{$report.mailing.campaign}</td></tr>
+  <tr><td class="label">{ts}Campaign{/ts}</td><td>{$report.mailing.campaign}</td></tr>
 {/if}
-
 </table>
-{/strip}
 </fieldset>
 <div class="action-link">
     <a href="{$backUrl}" ><i class="crm-i fa-chevron-left" aria-hidden="true"></i> {$backUrlTitle}</a>
diff --git a/civicrm/templates/CRM/Member/Page/UserDashboard.tpl b/civicrm/templates/CRM/Member/Page/UserDashboard.tpl
index 2f43daab19b1bee493620d785401c653b32ea644..cc6de7055d9bc6b97cb5b07fb0d25744d3e9f3f6 100644
--- a/civicrm/templates/CRM/Member/Page/UserDashboard.tpl
+++ b/civicrm/templates/CRM/Member/Page/UserDashboard.tpl
@@ -30,7 +30,14 @@
           <td class="crm-active-membership-start_date">{$activeMember.start_date|crmDate}</td>
           <td class="crm-active-membership-end_date">{$activeMember.end_date|crmDate}</td>
           <td class="crm-active-membership-status">{$activeMember.status}</td>
-          <td class="crm-active-membership-renew">{if $activeMember.renewPageId}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$activeMember.renewPageId`&mid=`$activeMember.id`&reset=1"}">[ {ts}Renew Now{/ts} ]</a>{/if}</td>
+          {if ($activeMember.status !== 'Current' AND $activeMember.status !== 'Cancelled') OR !empty($activeMember.cancelSubscriptionUrl) OR !empty($activeMember.updateSubscriptionBillingUrl) OR !empty($activeMember.updateSubscriptionURL)}
+            <td class="crm-active-membership-renew">
+              {if $activeMember.status !== 'Current' AND $activeMember.status !== 'Cancelled'}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$activeMember.renewPageId`&mid=`$activeMember.id`&reset=1"}" class="button"><span class="nowrap">{ts}Renew Now{/ts}</span></a>{/if}
+              {if !empty($activeMember.cancelSubscriptionUrl)}<a href="{$activeMember.cancelSubscriptionUrl}" class="button"><span class="nowrap">{ts}Cancel Subscription{/ts}</span></a>{/if}
+              {if !empty($activeMember.updateSubscriptionBillingUrl)}<a href="{$activeMember.updateSubscriptionBillingUrl}" class="button"><span class="nowrap">{ts}Update Billing Information{/ts}</span></a>{/if}
+              {if !empty($activeMember.updateSubscriptionUrl)}<a href="{$activeMember.updateSubscriptionUrl}" class="button"><span class="nowrap">{ts}Chnage Subscription Amount{/ts}</span></a>{/if}
+            </td>
+          {/if}
         </tr>
         {/foreach}
         </table>
@@ -60,6 +67,14 @@
           <td class="crm-inactive-membership-start_date">{$inActiveMember.start_date|crmDate}</td>
           <td class="crm-inactive-membership-end_date">{$inActiveMember.end_date|crmDate}</td>
           <td class="crm-inactive-membership-status">{$inActiveMember.status}</td>
+          {if $inActiveMember.status == 'Expired' OR !empty($activeMember.cancelSubscriptionUrl) OR !empty($activeMember.updateSubscriptionBillingUrl) OR !empty($activeMember.updateSubscriptionURL)}
+            <td class="crm-active-membership-renew">
+              {if $inActiveMember.status == 'Expired'}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$inActiveMember.renewPageId`&mid=`$inActiveMember.id`&reset=1"}" class="button"><span class="nowrap">{ts}Renew Now{/ts}</span></a>{/if}
+              {if !empty($inActiveMember.cancelSubscriptionUrl)}<a href="{$inActiveMember.cancelSubscriptionUrl}" class="button"><span class="nowrap">{ts}Cancel Subscription{/ts}</span></a>{/if}
+              {if !empty($inActiveMember.updateSubscriptionBillingUrl)}<a href="{$inActiveMember.updateSubscriptionBillingUrl}" class="button"><span class="nowrap">{ts}Update Billing Information{/ts}</span></a>{/if}
+              {if !empty($inActiveMember.updateSubscriptionUrl)}<a href="{$inActiveMember.updateSubscriptionUrl}" class="button"><span class="nowrap">{ts}Chnage Subscription Amount{/ts}</span></a>{/if}
+            </td>
+          {/if}
           <td class="crm-inactive-membership-renew">{if $inActiveMember.renewPageId}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$inActiveMember.renewPageId`&mid=`$inActiveMember.id`&reset=1"}">[ {ts}Renew Now{/ts} ]</a>{/if}</td>
         </tr>
         {/foreach}
diff --git a/civicrm/templates/CRM/Price/Form/Field.tpl b/civicrm/templates/CRM/Price/Form/Field.tpl
index f766e1c555ba76d29af1bd12464680b1c85444a8..d9d887daac24756dcb857eab986671c2b17ccc7a 100644
--- a/civicrm/templates/CRM/Price/Form/Field.tpl
+++ b/civicrm/templates/CRM/Price/Form/Field.tpl
@@ -90,25 +90,13 @@
       <td>{$form.html_type.html}
       </td>
     </tr>
-  {if $action neq 4 and $action neq 2}
-    <tr>
-      <td>&nbsp;</td>
-      <td class="description">{ts}Select the html type used to offer options for this field{/ts}
-      </td>
-    </tr>
-  {/if}
   </table>
-
   <div class="spacer"></div>
   <div id="price-block" {if $action eq 2 && $form.html_type.value.0 eq 'Text'} class="show-block" {else} class="hiddenElement" {/if}>
     <table class="form-layout">
       <tr class="crm-price-field-form-block-price">
-        <td class="label">{$form.price.label|smarty:nodefaults} <span class="crm-marker" title="{ts}This field is required.{/ts}">*</span></td>
-        <td>{$form.price.html}
-        {if $action neq 4}
-          <br /><span class="description">{ts}Unit price.{/ts}</span> {help id="id-negative"}
-        {/if}
-        </td>
+        <td class="label">{$form.price.label|smarty:nodefaults} <span class="crm-marker" title="{ts}This field is required.{/ts}">*</span> {help id="id-negative"}</td>
+        <td>{$form.price.html}</td>
       </tr>
       <tr class="crm-price-field-form-block-non-deductible-amount">
         <td class="label">{$form.non_deductible_amount.label|smarty:nodefaults}</td>
@@ -209,8 +197,8 @@
       <td>&nbsp;{$form.is_required.html}</td>
     </tr>
     <tr class="crm-price-field-form-block-visibility_id">
-      <td class="label">{$form.visibility_id.label}</td>
-      <td>&nbsp;{$form.visibility_id.html}  {help id="id-visibility"}</td>
+      <td class="label">{$form.visibility_id.label} {help id="id-visibility"}</td>
+      <td>&nbsp;{$form.visibility_id.html}</td>
     </tr>
     <tr class="crm-price-field-form-block-is_active">
       <td class="label">{$form.is_active.label}</td>
diff --git a/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl b/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl
index b1b7081003e76e16dc1aa465d5fe777d6c8fa4d6..7d6aadcca69589573a1086e486b3fbd4705c23b0 100644
--- a/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl
+++ b/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl
@@ -37,7 +37,12 @@
                     <td class="label report-contents">{if !empty($field.title)}{$field.title}{/if}</td>
                     <td class="report-contents">{$form.$fieldOp.html}</td>
                     <td>
-                      <span id="{$filterVal}_cell">{$form.$filterVal.label}&nbsp;{$form.$filterVal.html}</span>
+                      <span id="{$filterVal}_cell">
+                        <label class="sr-only" for="{$form.$filterVal.id}">
+                          {if !empty($field.title)}{$field.title}{else}{$field.name}{/if} filter value
+                        </label>
+                        {$form.$filterVal.label}&nbsp;{$form.$filterVal.html}
+                      </span>
                       <span id="{$filterMin}_max_cell">
                         {if array_key_exists($filterMin, $form) && $form.$filterMin}{$form.$filterMin.label}&nbsp;{$form.$filterMin.html}&nbsp;&nbsp;{/if}
                         {if array_key_exists($filterMax, $form) && $form.$filterMax}{$form.$filterMax.label}&nbsp;{$form.$filterMax.html}{/if}
diff --git a/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl b/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl
index c6fdeff238ce8a94ab6880ee056cb3c32926b392..fb6e17f21ecb48b13bb28bebe42f00a9d5e356ce 100644
--- a/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl
+++ b/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl
@@ -3,19 +3,13 @@
  *}
 <script type="text/template" id="designer_template">
   <div class="crm-designer-toolbar full-height">
-    <div class="crm-designer-buttonset-region ui-dialog-buttonset">
-    </div>
-    <hr />
-    <div class="crm-designer-palette-region full-height">
-    </div>
+    <div class="crm-designer-buttonset-region ui-dialog-buttonset"></div>
+    <div class="crm-designer-palette-region full-height"></div>
   </div>
   <div class="crm-designer-canvas full-height scroll">
     <div class="crm-designer-preview-canvas"></div>
-    <div class="crm-designer-form-region">
-    </div>
-    <hr />
-    <div class="crm-designer-fields-region">
-    </div>
+    <div class="crm-designer-form-region"></div>
+    <div class="crm-designer-fields-region"></div>
   </div>
 </script>
 
@@ -34,7 +28,6 @@
           </select>
         </span>
       </div>
-      <hr>
       <input type="text" class="crm-form-text" placeholder="{ts}Search Fields{/ts}" />
       <a class="crm-designer-palette-clear-search crm-hover-button" href="#" style="visibility:hidden" title="{ts}Clear search{/ts}"><i class="crm-i fa-times" aria-hidden="true"></i></a>
       <div class="crm-designer-palette-controls">
@@ -99,7 +92,6 @@
 
 <script type="text/template" id="designer_buttons_template">
   <button class="crm-designer-save">{ts}Save{/ts}</button>
-  <button class="crm-designer-preview">{ts}Preview{/ts}</button>
 </script>
 
 <script type="text/template" id="field_canvas_view_template">
diff --git a/civicrm/vendor/autoload.php b/civicrm/vendor/autoload.php
index 21520050c613dc84e20ead104c13898bf175ed8d..86190f1705feea55e8b6c82b384091ee6fc2711d 100644
--- a/civicrm/vendor/autoload.php
+++ b/civicrm/vendor/autoload.php
@@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
 
 require_once __DIR__ . '/composer/autoload_real.php';
 
-return ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494::getLoader();
+return ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30::getLoader();
diff --git a/civicrm/vendor/composer/autoload_real.php b/civicrm/vendor/composer/autoload_real.php
index 0c222b4fc8908006154e852126edb05a5d1e659d..e7f93af427a4db7a74e32b688df1dc1f8defe7a2 100644
--- a/civicrm/vendor/composer/autoload_real.php
+++ b/civicrm/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php @generated by Composer
 
-class ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494
+class ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30
 {
     private static $loader;
 
@@ -24,22 +24,22 @@ class ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494
 
         require __DIR__ . '/platform_check.php';
 
-        spl_autoload_register(array('ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30', 'loadClassLoader'), true, true);
         self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
-        spl_autoload_unregister(array('ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30', 'loadClassLoader'));
 
         $includePaths = require __DIR__ . '/include_paths.php';
         $includePaths[] = get_include_path();
         set_include_path(implode(PATH_SEPARATOR, $includePaths));
 
         require __DIR__ . '/autoload_static.php';
-        call_user_func(\Composer\Autoload\ComposerStaticInit22d6b31e3ab44c8446106332c4473494::getInitializer($loader));
+        call_user_func(\Composer\Autoload\ComposerStaticInit6af910361fa5fc09ae381c6379550e30::getInitializer($loader));
 
         $loader->register(true);
 
-        $includeFiles = \Composer\Autoload\ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$files;
+        $includeFiles = \Composer\Autoload\ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$files;
         foreach ($includeFiles as $fileIdentifier => $file) {
-            composerRequire22d6b31e3ab44c8446106332c4473494($fileIdentifier, $file);
+            composerRequire6af910361fa5fc09ae381c6379550e30($fileIdentifier, $file);
         }
 
         return $loader;
@@ -51,7 +51,7 @@ class ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494
  * @param string $file
  * @return void
  */
-function composerRequire22d6b31e3ab44c8446106332c4473494($fileIdentifier, $file)
+function composerRequire6af910361fa5fc09ae381c6379550e30($fileIdentifier, $file)
 {
     if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
         $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
diff --git a/civicrm/vendor/composer/autoload_static.php b/civicrm/vendor/composer/autoload_static.php
index b0760254fb0fbe1f1ba5e98c2c4e98de865cc6c1..c12c7ca360a379ebd0a2ec5fa204e7c2f28addce 100644
--- a/civicrm/vendor/composer/autoload_static.php
+++ b/civicrm/vendor/composer/autoload_static.php
@@ -4,7 +4,7 @@
 
 namespace Composer\Autoload;
 
-class ComposerStaticInit22d6b31e3ab44c8446106332c4473494
+class ComposerStaticInit6af910361fa5fc09ae381c6379550e30
 {
     public static $files = array (
         'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
@@ -684,11 +684,11 @@ class ComposerStaticInit22d6b31e3ab44c8446106332c4473494
     public static function getInitializer(ClassLoader $loader)
     {
         return \Closure::bind(function () use ($loader) {
-            $loader->prefixLengthsPsr4 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$prefixLengthsPsr4;
-            $loader->prefixDirsPsr4 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$prefixDirsPsr4;
-            $loader->prefixesPsr0 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$prefixesPsr0;
-            $loader->fallbackDirsPsr0 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$fallbackDirsPsr0;
-            $loader->classMap = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$classMap;
+            $loader->prefixLengthsPsr4 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$prefixDirsPsr4;
+            $loader->prefixesPsr0 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$prefixesPsr0;
+            $loader->fallbackDirsPsr0 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$fallbackDirsPsr0;
+            $loader->classMap = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$classMap;
 
         }, null, ClassLoader::class);
     }
diff --git a/civicrm/vendor/composer/installed.json b/civicrm/vendor/composer/installed.json
index 33be58ea143ffe96be1d49ca72b1adddf258923c..dd750be63794a71876ccfb11e7d757fd3650c3b6 100644
--- a/civicrm/vendor/composer/installed.json
+++ b/civicrm/vendor/composer/installed.json
@@ -2873,17 +2873,17 @@
         },
         {
             "name": "phpoffice/phpspreadsheet",
-            "version": "1.29.2",
-            "version_normalized": "1.29.2.0",
+            "version": "1.29.4",
+            "version_normalized": "1.29.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
-                "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f"
+                "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f",
-                "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/7ca7e325dca3adb6a598385aab81f527b8d6c75d",
+                "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d",
                 "shasum": ""
             },
             "require": {
@@ -2929,7 +2929,7 @@
                 "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
                 "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
             },
-            "time": "2024-09-29T07:04:47+00:00",
+            "time": "2024-11-10T16:26:22+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -2975,7 +2975,7 @@
             ],
             "support": {
                 "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
-                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.2"
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.4"
             },
             "install-path": "../phpoffice/phpspreadsheet"
         },
diff --git a/civicrm/vendor/composer/installed.php b/civicrm/vendor/composer/installed.php
index 4eece9e5fa7692bb526955c9fa2c599eaab12b7e..16784d307e08c44265ca399d2f51b5868415f40e 100644
--- a/civicrm/vendor/composer/installed.php
+++ b/civicrm/vendor/composer/installed.php
@@ -1,9 +1,9 @@
 <?php return array(
     'root' => array(
         'name' => 'civicrm/civicrm-core',
-        'pretty_version' => '5.79.x-dev',
-        'version' => '5.79.9999999.9999999-dev',
-        'reference' => '745bcfe730c1b49bf73323e3dcef2a9160f25e78',
+        'pretty_version' => '5.80.x-dev',
+        'version' => '5.80.9999999.9999999-dev',
+        'reference' => '86d265a74da20b9294d72517810c6580a7293cc2',
         'type' => 'library',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -47,9 +47,9 @@
             'dev_requirement' => false,
         ),
         'civicrm/civicrm-core' => array(
-            'pretty_version' => '5.79.x-dev',
-            'version' => '5.79.9999999.9999999-dev',
-            'reference' => '745bcfe730c1b49bf73323e3dcef2a9160f25e78',
+            'pretty_version' => '5.80.x-dev',
+            'version' => '5.80.9999999.9999999-dev',
+            'reference' => '86d265a74da20b9294d72517810c6580a7293cc2',
             'type' => 'library',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
@@ -431,9 +431,9 @@
             'dev_requirement' => false,
         ),
         'phpoffice/phpspreadsheet' => array(
-            'pretty_version' => '1.29.2',
-            'version' => '1.29.2.0',
-            'reference' => '3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f',
+            'pretty_version' => '1.29.4',
+            'version' => '1.29.4.0',
+            'reference' => '7ca7e325dca3adb6a598385aab81f527b8d6c75d',
             'type' => 'library',
             'install_path' => __DIR__ . '/../phpoffice/phpspreadsheet',
             'aliases' => array(),
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md b/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
index 170398c36c1762a84b0f15a928fb5f2530faa1d9..02794b295b0d4067a8f1b75d372761bcbaf8894e 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com)
 and this project adheres to [Semantic Versioning](https://semver.org).
 
+## 1.29.4 - 2024-11-10
+
+### Fixed
+
+- 1.29.3 omitted
+- Backported security patches.
+- Write ignoredErrors Tag Before Drawings. Backport of [PR #4212](https://github.com/PHPOffice/PhpSpreadsheet/pull/4212) intended for 3.4.0.
+- Changes to ROUNDDOWN/ROUNDUP/TRUNC. Backport of [PR #4214](https://github.com/PHPOffice/PhpSpreadsheet/pull/4214) intended for 3.4.0.
+- Replace str_starts_with in Drawing. [Issue #4215](https://github.com/PHPOffice/PhpSpreadsheet/issues/4215)
+
+### Added
+
+- Method to Test Whether Csv Will Be Affected by Php9. Backport of [PR #4189](https://github.com/PHPOffice/PhpSpreadsheet/pull/4189)  intended for 3.4.0.
+
 ## 1.29.2 - 2024-09-29
 
 ### Fixed
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php
index 94b634118aa7d143b84e13b882be58aab6f00856..00144137f0a9b92909e009302ee48e764b1c330e 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php
@@ -5,6 +5,8 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
 use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
 use PhpOffice\PhpSpreadsheet\Calculation\Exception;
 use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
+// following added in Php8.4
+use RoundingMode;
 
 class Round
 {
@@ -67,22 +69,19 @@ class Round
             return 0.0;
         }
 
-        $digitsPlus1 = $digits + 1;
-        if ($number < 0.0) {
-            if ($digitsPlus1 < 0) {
-                return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN);
-            }
-            $result = sprintf("%.{$digitsPlus1}f", $number - 0.5 * 0.1 ** $digits);
-
-            return round((float) $result, $digits, PHP_ROUND_HALF_DOWN);
+        if (PHP_VERSION_ID >= 80400) {
+            return round(
+                (float) (string) $number,
+                $digits,
+                RoundingMode::AwayFromZero //* @phpstan-ignore-line
+            );
         }
 
-        if ($digitsPlus1 < 0) {
-            return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN);
+        if ($number < 0.0) {
+            return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN);
         }
-        $result = sprintf("%.{$digitsPlus1}f", $number + 0.5 * 0.1 ** $digits);
 
-        return round((float) $result, $digits, PHP_ROUND_HALF_DOWN);
+        return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN);
     }
 
     /**
@@ -90,8 +89,8 @@ class Round
      *
      * Rounds a number down to a specified number of decimal places
      *
-     * @param array|float $number Number to round, or can be an array of numbers
-     * @param array|int $digits Number of digits to which you want to round $number, or can be an array of numbers
+     * @param null|array|float|string $number Number to round, or can be an array of numbers
+     * @param array|float|int|string $digits Number of digits to which you want to round $number, or can be an array of numbers
      *
      * @return array|float|string Rounded Number, or a string containing an error
      *         If an array of numbers is passed as the argument, then the returned result will also be an array
@@ -114,23 +113,19 @@ class Round
             return 0.0;
         }
 
-        $digitsPlus1 = $digits + 1;
-        if ($number < 0.0) {
-            if ($digitsPlus1 < 0) {
-                return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP);
-            }
-            $result = sprintf("%.{$digitsPlus1}f", $number + 0.5 * 0.1 ** $digits);
-
-            return round((float) $result, $digits, PHP_ROUND_HALF_UP);
+        if (PHP_VERSION_ID >= 80400) {
+            return round(
+                (float) (string) $number,
+                $digits,
+                RoundingMode::TowardsZero //* @phpstan-ignore-line
+            );
         }
 
-        if ($digitsPlus1 < 0) {
-            return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP);
+        if ($number < 0.0) {
+            return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP);
         }
 
-        $result = sprintf("%.{$digitsPlus1}f", $number - 0.5 * 0.1 ** $digits);
-
-        return round((float) $result, $digits, PHP_ROUND_HALF_UP);
+        return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP);
     }
 
     /**
@@ -141,7 +136,7 @@ class Round
      * @param mixed $number Expect float. Number to round, or can be an array of numbers
      * @param mixed $multiple Expect int. Multiple to which you want to round, or can be an array of numbers.
      *
-     * @return array|float|string Rounded Number, or a string containing an error
+     * @return array|float|int|string Rounded Number, or a string containing an error
      *         If an array of numbers is passed as the argument, then the returned result will also be an array
      *            with the same dimensions
      */
@@ -210,7 +205,7 @@ class Round
      *
      * @param array|float $number Number to round, or can be an array of numbers
      *
-     * @return array|float|string Rounded Number, or a string containing an error
+     * @return array|float|int|string Rounded Number, or a string containing an error
      *         If an array of numbers is passed as the argument, then the returned result will also be an array
      *            with the same dimensions
      */
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php
index ee60105bb1b0be8ce47cb93d2c64b890fe09c958..bd128ba64d66576f58c475a73847b0f83375f440 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php
@@ -3,7 +3,6 @@
 namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
 
 use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
-use PhpOffice\PhpSpreadsheet\Calculation\Exception;
 
 class Trunc
 {
@@ -13,11 +12,14 @@ class Trunc
      * TRUNC.
      *
      * Truncates value to the number of fractional digits by number_digits.
+     * This will probably not be the precise result in the unlikely
+     * event that the number of digits to the left of the decimal
+     * plus the number of digits to the right exceeds PHP_FLOAT_DIG
+     * (or possibly that value minus 1).
+     * Excel is unlikely to do any better.
      *
-     * @param array|float $value
-     *                      Or can be an array of values
-     * @param array|int $digits
-     *                      Or can be an array of values
+     * @param null|array|float|string $value Or can be an array of values
+     * @param array|float|int|string $digits Or can be an array of values
      *
      * @return array|float|string Truncated value, or a string containing an error
      *         If an array of numbers is passed as an argument, then the returned result will also be an array
@@ -29,33 +31,6 @@ class Trunc
             return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $digits);
         }
 
-        try {
-            $value = Helpers::validateNumericNullBool($value);
-            $digits = Helpers::validateNumericNullSubstitution($digits, null);
-        } catch (Exception $e) {
-            return $e->getMessage();
-        }
-
-        if ($value == 0) {
-            return $value;
-        }
-
-        if ($value >= 0) {
-            $minusSign = '';
-        } else {
-            $minusSign = '-';
-            $value = -$value;
-        }
-
-        $digits = (int) floor($digits);
-        if ($digits < 0) {
-            $power = (int) (10 ** -$digits);
-            $result = intdiv((int) floor($value), $power) * $power;
-            return ($minusSign === '') ? $result : -$result;
-        }
-        $digitsPlus1 = $digits + 1;
-        $result = substr($minusSign . sprintf("%.{$digitsPlus1}f", $value), 0, -1);
-
-        return (float) $result;
+        return Round::down($value, $digits);
     }
 }
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php
index 3feec8e8854486547a6f81ed0272d44a69f10370..b866892757b92a073ff4dcdb0d102415721cfdd5 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php
@@ -10,6 +10,7 @@ use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
 use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
 use PhpOffice\PhpSpreadsheet\Spreadsheet;
 use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
+use Throwable;
 
 class Csv extends BaseReader
 {
@@ -85,7 +86,7 @@ class Csv extends BaseReader
      * It is anticipated that it will conditionally be set
      * to null-string for Php9 and above.
      */
-    private static string $defaultEscapeCharacter = '\\';
+    private static string $defaultEscapeCharacter = PHP_VERSION_ID < 90000 ? '\\' : '';
 
     /**
      * Callback for setting defaults in construction.
@@ -295,6 +296,12 @@ class Csv extends BaseReader
         if (!$fhandle) {
             throw new Exception($filename . ' is an Invalid Spreadsheet file.');
         }
+        if ($this->inputEncoding === 'UTF-8') {
+            $encoding = self::guessEncodingBom($filename);
+            if ($encoding !== '') {
+                $this->inputEncoding = $encoding;
+            }
+        }
         if ($this->inputEncoding === self::GUESS_ENCODING) {
             $this->inputEncoding = self::guessEncoding($filename, $this->fallbackEncoding);
         }
@@ -322,7 +329,7 @@ class Csv extends BaseReader
     private function setAutoDetect(?string $value): ?string
     {
         $retVal = null;
-        if ($value !== null && $this->testAutodetect) {
+        if ($value !== null && $this->testAutodetect && PHP_VERSION_ID < 90000) {
             $retVal2 = @ini_set('auto_detect_line_endings', $value);
             if (is_string($retVal2)) {
                 $retVal = $retVal2;
@@ -371,6 +378,20 @@ class Csv extends BaseReader
         // Deprecated in Php8.1
         $iniset = $this->setAutoDetect('1');
 
+        try {
+            $this->loadStringOrFile2($filename, $spreadsheet, $dataUri);
+            $this->setAutoDetect($iniset);
+        } catch (Throwable $e) {
+            $this->setAutoDetect($iniset);
+
+            throw $e;
+        }
+
+        return $spreadsheet;
+    }
+
+    private function loadStringOrFile2(string $filename, Spreadsheet $spreadsheet, bool $dataUri): void
+    {
         // Open file
         if ($dataUri) {
             $this->openDataUri($filename);
@@ -428,11 +449,6 @@ class Csv extends BaseReader
 
         // Close file
         fclose($fileHandle);
-
-        $this->setAutoDetect($iniset);
-
-        // Return
-        return $spreadsheet;
     }
 
     /**
@@ -544,6 +560,10 @@ class Csv extends BaseReader
      */
     public function setEscapeCharacter(string $escapeCharacter): self
     {
+        if (PHP_VERSION_ID >= 90000 && $escapeCharacter !== '') {
+            throw new ReaderException('Escape character must be null string for Php9+');
+        }
+
         $this->escapeCharacter = $escapeCharacter;
 
         return $this;
@@ -620,17 +640,15 @@ class Csv extends BaseReader
         }
     }
 
-    private static function guessEncodingBom(string $filename): string
+    public static function guessEncodingBom(string $filename, ?string $convertString = null): string
     {
         $encoding = '';
-        $first4 = file_get_contents($filename, false, null, 0, 4);
-        if ($first4 !== false) {
-            self::guessEncodingTestBom($encoding, $first4, self::UTF8_BOM, 'UTF-8');
-            self::guessEncodingTestBom($encoding, $first4, self::UTF16BE_BOM, 'UTF-16BE');
-            self::guessEncodingTestBom($encoding, $first4, self::UTF32BE_BOM, 'UTF-32BE');
-            self::guessEncodingTestBom($encoding, $first4, self::UTF32LE_BOM, 'UTF-32LE');
-            self::guessEncodingTestBom($encoding, $first4, self::UTF16LE_BOM, 'UTF-16LE');
-        }
+        $first4 = $convertString ?? (string) file_get_contents($filename, false, null, 0, 4);
+        self::guessEncodingTestBom($encoding, $first4, self::UTF8_BOM, 'UTF-8');
+        self::guessEncodingTestBom($encoding, $first4, self::UTF16BE_BOM, 'UTF-16BE');
+        self::guessEncodingTestBom($encoding, $first4, self::UTF32BE_BOM, 'UTF-32BE');
+        self::guessEncodingTestBom($encoding, $first4, self::UTF32LE_BOM, 'UTF-32LE');
+        self::guessEncodingTestBom($encoding, $first4, self::UTF16LE_BOM, 'UTF-16LE');
 
         return $encoding;
     }
@@ -679,4 +697,39 @@ class Csv extends BaseReader
 
         return fgetcsv($stream, $length, $separator, $enclosure, $escape);
     }
+
+    public static function affectedByPhp9(
+        string $filename,
+        string $inputEncoding = 'UTF-8',
+        ?string $delimiter = null,
+        string $enclosure = '"',
+        string $escapeCharacter = '\\'
+    ): bool {
+        if (PHP_VERSION_ID < 70400 || PHP_VERSION_ID >= 90000) {
+            throw new ReaderException('Function valid only for Php7.4 or Php8'); // @codeCoverageIgnore
+        }
+        $reader1 = new self();
+        $reader1->setInputEncoding($inputEncoding)
+            ->setTestAutoDetect(true)
+            ->setEscapeCharacter($escapeCharacter)
+            ->setDelimiter($delimiter)
+            ->setEnclosure($enclosure);
+        $spreadsheet1 = $reader1->load($filename);
+        $sheet1 = $spreadsheet1->getActiveSheet();
+        $array1 = $sheet1->toArray(null, false, false);
+        $spreadsheet1->disconnectWorksheets();
+
+        $reader2 = new self();
+        $reader2->setInputEncoding($inputEncoding)
+            ->setTestAutoDetect(false)
+            ->setEscapeCharacter('')
+            ->setDelimiter($delimiter)
+            ->setEnclosure($enclosure);
+        $spreadsheet2 = $reader2->load($filename);
+        $sheet2 = $spreadsheet2->getActiveSheet();
+        $array2 = $sheet2->toArray(null, false, false);
+        $spreadsheet2->disconnectWorksheets();
+
+        return $array1 !== $array2;
+    }
 }
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php
index 19bf67b20039d05406f4449a896141d676717b98..bfb52401aa0c9259b8536a43c278c789e9c265cd 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php
@@ -168,7 +168,7 @@ class Html extends BaseReader
     private function readEnding(): string
     {
         $meta = stream_get_meta_data($this->fileHandle);
-        $filename = $meta['uri']; // @phpstan-ignore-line
+        $filename = $meta['uri'];
 
         $size = (int) filesize($filename);
         if ($size === 0) {
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php
index 9ac5e955d1544ecd915a0f1e9caa89a66aafe062..bb743277d6218bfc4a1519f2ef97e8d760836652 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php
@@ -6,6 +6,9 @@ use PhpOffice\PhpSpreadsheet\Reader;
 
 class XmlScanner
 {
+    private const ENCODING_PATTERN = '/encoding\\s*=\\s*(["\'])(.+?)\\1/s';
+    private const ENCODING_UTF7 = '/encoding\\s*=\\s*(["\'])UTF-7\\1/si';
+
     /**
      * String used to identify risky xml elements.
      *
@@ -114,13 +117,24 @@ class XmlScanner
     private function toUtf8($xml)
     {
         $charset = $this->findCharSet($xml);
+        $foundUtf7 = $charset === 'UTF-7';
         if ($charset !== 'UTF-8') {
+            $testStart = '/^.{0,4}\\s*<?xml/s';
+            $startWithXml1 = preg_match($testStart, $xml);
             $xml = self::forceString(mb_convert_encoding($xml, 'UTF-8', $charset));
-
-            $charset = $this->findCharSet($xml);
-            if ($charset !== 'UTF-8') {
-                throw new Reader\Exception('Suspicious Double-encoded XML, spreadsheet file load() aborted to prevent XXE/XEE attacks');
+            if ($startWithXml1 === 1 && preg_match($testStart, $xml) !== 1) {
+                throw new Reader\Exception('Double encoding not permitted');
             }
+            $foundUtf7 = $foundUtf7 || (preg_match(self::ENCODING_UTF7, $xml) === 1);
+            $xml = preg_replace(self::ENCODING_PATTERN, '', $xml) ?? $xml;
+        } else {
+            $foundUtf7 = $foundUtf7 || (preg_match(self::ENCODING_UTF7, $xml) === 1);
+        }
+        if ($foundUtf7) {
+            throw new Reader\Exception('UTF-7 encoding not permitted');
+        }
+        if (substr($xml, 0, Reader\Csv::UTF8_BOM_LEN) === Reader\Csv::UTF8_BOM) {
+            $xml = substr($xml, Reader\Csv::UTF8_BOM_LEN);
         }
 
         return $xml;
@@ -128,15 +142,16 @@ class XmlScanner
 
     private function findCharSet(string $xml): string
     {
-        $patterns = [
-            '/encoding\\s*=\\s*"([^"]*]?)"/',
-            "/encoding\\s*=\\s*'([^']*?)'/",
-        ];
-
-        foreach ($patterns as $pattern) {
-            if (preg_match($pattern, $xml, $matches)) {
-                return strtoupper($matches[1]);
-            }
+        if (substr($xml, 0, 4) === "\x4c\x6f\xa7\x94") {
+            throw new Reader\Exception('EBCDIC encoding not permitted');
+        }
+        $encoding = Reader\Csv::guessEncodingBom('', $xml);
+        if ($encoding !== '') {
+            return $encoding;
+        }
+        $xml = str_replace("\0", '', $xml);
+        if (preg_match(self::ENCODING_PATTERN, $xml, $matches)) {
+            return strtoupper($matches[2]);
         }
 
         return 'UTF-8';
@@ -151,13 +166,16 @@ class XmlScanner
      */
     public function scan($xml)
     {
-        $xml = "$xml";
         $this->disableEntityLoaderCheck();
+        // Don't rely purely on libxml_disable_entity_loader()
+        $pattern = '/\\0*' . implode('\\0*', /** @scrutinizer ignore-type */ str_split($this->pattern)) . '\\0*/';
 
-        $xml = $this->toUtf8($xml);
+        $xml = "$xml";
+        if (preg_match($pattern, $xml)) {
+            throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks');
+        }
 
-        // Don't rely purely on libxml_disable_entity_loader()
-        $pattern = '/\\0?' . implode('\\0?', /** @scrutinizer ignore-type */ str_split($this->pattern)) . '\\0?/';
+        $xml = $this->toUtf8($xml);
 
         if (preg_match($pattern, $xml)) {
             throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks');
@@ -171,7 +189,7 @@ class XmlScanner
     }
 
     /**
-     * Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks.
+     * Scan the XML for use of <!ENTITY to prevent XXE/XEE attacks.
      *
      * @param string $filestream
      *
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php
index 6be26fc2c62b9d88ed4783bd395b6ebc3d779c5f..e60f2de4c48a4b7d884ca7748767dd566d6ba0db 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php
@@ -17,7 +17,6 @@ use PhpOffice\PhpSpreadsheet\RichText\RichText;
 use PhpOffice\PhpSpreadsheet\Settings;
 use PhpOffice\PhpSpreadsheet\Shared\Date;
 use PhpOffice\PhpSpreadsheet\Shared\File;
-use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
 use PhpOffice\PhpSpreadsheet\Spreadsheet;
 use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
 use SimpleXMLElement;
@@ -77,10 +76,8 @@ class Xml extends BaseReader
         ];
 
         // Open file
-        $data = file_get_contents($filename) ?: '';
-
-        // Why?
-        //$data = str_replace("'", '"', $data); // fix headers with single quote
+        $data = (string) file_get_contents($filename);
+        $data = $this->getSecurityScannerOrThrow()->scan($data);
 
         $valid = true;
         foreach ($signature as $match) {
@@ -92,14 +89,6 @@ class Xml extends BaseReader
             }
         }
 
-        //    Retrieve charset encoding
-        if (preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $data, $matches)) {
-            $charSet = strtoupper($matches[1]);
-            if (preg_match('/^ISO-8859-\d[\dL]?$/i', $charSet) === 1) {
-                $data = StringHelper::convertEncoding($data, 'UTF-8', $charSet);
-                $data = (string) preg_replace('/(<?xml.*encoding=[\'"]).*?([\'"].*?>)/um', '$1' . 'UTF-8' . '$2', $data, 1);
-            }
-        }
         $this->fileContents = $data;
 
         return $valid;
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php
index aec54266dccb9c26f387a7a436820717eff58a3c..4b4d724b3ffd1426356a7f36d45ce2be1bd5c58d 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php
@@ -167,7 +167,7 @@ class Drawing extends BaseDrawing
     {
         $mime = (string) @mime_content_type($path);
         $retVal = false;
-        if (str_starts_with($mime, 'image/')) {
+        if (strpos($mime, 'image/') === 0) {
             $retVal = true;
         } elseif ($mime === 'application/octet-stream') {
             $extension = pathinfo($path, PATHINFO_EXTENSION);
diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
index 5e453b3d86b493988b97286f64f71ded6adad699..588c5214fbcd6a1ba91f81b9e9ed49aaa607b8b3 100644
--- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
+++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
@@ -122,6 +122,9 @@ class Worksheet extends WriterPart
         // Breaks
         $this->writeBreaks($objWriter, $worksheet);
 
+        // IgnoredErrors
+        $this->writeIgnoredErrors($objWriter);
+
         // Drawings and/or Charts
         $this->writeDrawings($objWriter, $worksheet, $includeCharts);
 
@@ -134,9 +137,6 @@ class Worksheet extends WriterPart
         // AlternateContent
         $this->writeAlternateContent($objWriter, $worksheet);
 
-        // IgnoredErrors
-        $this->writeIgnoredErrors($objWriter);
-
         // Table
         $this->writeTable($objWriter, $worksheet);
 
diff --git a/civicrm/xml/templates/joomla.tpl b/civicrm/xml/templates/joomla.tpl
index f51a8cba80705871eda97558e175caec3fb73246..d16f21e7e1a2a40d27e4134b74724a38cfcd23fe 100644
--- a/civicrm/xml/templates/joomla.tpl
+++ b/civicrm/xml/templates/joomla.tpl
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
     Generated from {$smarty.template}
-    {$generated}
 -->
 <extension method="upgrade" type="component" version="2.5">
   <name>CiviCRM</name>
diff --git a/civicrm/xml/version.xml b/civicrm/xml/version.xml
index eb243c5359e4bb0f54ca51975df8284d7a2a8ad4..72925a0ea4bda2a22952cf8d38b7635df3c369c0 100644
--- a/civicrm/xml/version.xml
+++ b/civicrm/xml/version.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
 <version>
-  <version_no>5.79.1</version_no>
-  <releaseDate>2024-11-25</releaseDate>
+  <version_no>5.80.0</version_no>
+  <releaseDate>2024-12-05</releaseDate>
 </version>
diff --git a/wp-rest/Autoloader.php b/wp-rest/Autoloader.php
index a98c1f4562a65aba90e9598e20fd2e8af4f9647a..7acc809f6b5c17178c3e4c556b524351a32e14cf 100644
--- a/wp-rest/Autoloader.php
+++ b/wp-rest/Autoloader.php
@@ -67,7 +67,7 @@ class Autoloader {
     self::instance();
 
     if (!is_readable(trailingslashit($source_path))) {
-      return \WP_Error('civicrm_wp_rest_error', sprintf(__('The source %s is not readable.', 'civicrm'), $source));
+      return new \WP_Error('civicrm_wp_rest_error', sprintf(__('The source %s is not readable.', 'civicrm'), $source));
     }
 
     self::$source_directories[] = $source_path;