From 2da308993426341fa3e82dcb6f9f1d6d2b477331 Mon Sep 17 00:00:00 2001
From: Kevin Cristiano <kcristiano@kcristiano.com>
Date: Thu, 17 Sep 2020 15:20:02 -0400
Subject: [PATCH] civicrm release

---
 civicrm.php                                   |  4 +-
 civicrm/CRM/Core/DAO/CustomField.php          |  8 ++--
 civicrm/CRM/Core/Payment/PayPalImpl.php       | 24 +++++++----
 civicrm/CRM/Dedupe/Merger.php                 |  6 +++
 civicrm/CRM/Report/Form.php                   |  8 +---
 .../Upgrade/Incremental/sql/5.29.1.mysql.tpl  |  7 ++++
 civicrm/Civi/Api4/Generic/AbstractAction.php  | 16 ++++----
 civicrm/api/v3/CustomField.php                | 37 ++++++++++++++---
 civicrm/civicrm-version.php                   |  2 +-
 civicrm/release-notes.md                      |  9 ++++
 civicrm/release-notes/5.29.1.md               | 41 +++++++++++++++++++
 civicrm/sql/civicrm.mysql                     |  2 +-
 civicrm/sql/civicrm_data.mysql                |  2 +-
 civicrm/sql/civicrm_generated.mysql           |  2 +-
 civicrm/vendor/autoload.php                   |  2 +-
 civicrm/vendor/composer/autoload_real.php     | 14 +++----
 civicrm/vendor/composer/autoload_static.php   | 12 +++---
 civicrm/xml/schema/Core/CustomField.xml       |  4 +-
 civicrm/xml/version.xml                       |  2 +-
 19 files changed, 151 insertions(+), 51 deletions(-)
 create mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.29.1.mysql.tpl
 create mode 100644 civicrm/release-notes/5.29.1.md

diff --git a/civicrm.php b/civicrm.php
index 62bb020b46..ec634adb08 100644
--- a/civicrm.php
+++ b/civicrm.php
@@ -2,7 +2,7 @@
 /*
 Plugin Name: CiviCRM
 Description: CiviCRM - Growing and Sustaining Relationships
-Version: 5.29.0
+Version: 5.29.1
 Requires at least: 4.9
 Requires PHP:      7.1
 Author: CiviCRM LLC
@@ -56,7 +56,7 @@ if ( ! defined( 'ABSPATH' ) ) exit;
 
 
 // Set version here: when it changes, will force JS to reload
-define( 'CIVICRM_PLUGIN_VERSION', '5.29.0' );
+define( 'CIVICRM_PLUGIN_VERSION', '5.29.1' );
 
 // Store reference to this file
 if (!defined('CIVICRM_PLUGIN_FILE')) {
diff --git a/civicrm/CRM/Core/DAO/CustomField.php b/civicrm/CRM/Core/DAO/CustomField.php
index 624a00f484..e866fd532c 100644
--- a/civicrm/CRM/Core/DAO/CustomField.php
+++ b/civicrm/CRM/Core/DAO/CustomField.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/CustomField.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7bdf73d78bf9965895218895184e40a9)
+ * (GenCodeChecksum:1acb9b3538bd3005b99e6af6d9ec062f)
  */
 
 /**
@@ -225,7 +225,7 @@ class CRM_Core_DAO_CustomField extends CRM_Core_DAO {
   public $option_group_id;
 
   /**
-   * Serialization method - a non-null value indicates a multi-valued field.
+   * Serialization method - a non-zero value indicates a multi-valued field.
    *
    * @var int
    */
@@ -686,8 +686,10 @@ class CRM_Core_DAO_CustomField extends CRM_Core_DAO {
           'name' => 'serialize',
           'type' => CRM_Utils_Type::T_INT,
           'title' => ts('Serialize'),
-          'description' => ts('Serialization method - a non-null value indicates a multi-valued field.'),
+          'description' => ts('Serialization method - a non-zero value indicates a multi-valued field.'),
+          'required' => TRUE,
           'where' => 'civicrm_custom_field.serialize',
+          'default' => '0',
           'table_name' => 'civicrm_custom_field',
           'entity' => 'CustomField',
           'bao' => 'CRM_Core_BAO_CustomField',
diff --git a/civicrm/CRM/Core/Payment/PayPalImpl.php b/civicrm/CRM/Core/Payment/PayPalImpl.php
index 79c2ecd9de..38a6eb300d 100644
--- a/civicrm/CRM/Core/Payment/PayPalImpl.php
+++ b/civicrm/CRM/Core/Payment/PayPalImpl.php
@@ -160,12 +160,22 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
         $form->_expressButtonName = $form->getButtonName('upload', 'express');
       }
       $form->assign('expressButtonName', $form->_expressButtonName);
-      $form->add(
-        'image',
-        $form->_expressButtonName,
-        $this->_paymentProcessor['url_button'],
-        ['class' => 'crm-form-submit']
-      );
+      $form->add('xbutton', $form->_expressButtonName, ts('Pay using PayPal'), [
+        'type' => 'submit',
+        'formnovalidate' => 'formnovalidate',
+        'class' => 'crm-form-submit',
+      ]);
+      CRM_Core_Resources::singleton()->addStyle('
+        button#' . $form->_expressButtonName . '{
+         background-image: url(' . $this->_paymentProcessor['url_button'] . ');
+         color: transparent;
+         background-repeat: no-repeat;
+         background-color: transparent;
+         background-position: center;
+         min-width: 150px;
+         min-height: 50px;
+         border: none;
+       ');
     }
   }
 
@@ -1109,7 +1119,6 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     if ($this->isPayPalType($this::PAYPAL_EXPRESS)) {
       return TRUE;
     }
-
     // This would occur postProcess.
     if (!empty($params['token'])) {
       return TRUE;
@@ -1123,6 +1132,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     $possibleExpressFields = [
       '_qf_Register_upload_express_x',
       '_qf_Payment_upload_express_x',
+      '_qf_Main_upload_express',
     ];
     if (array_intersect_key($params, array_fill_keys($possibleExpressFields, 1))) {
       return TRUE;
diff --git a/civicrm/CRM/Dedupe/Merger.php b/civicrm/CRM/Dedupe/Merger.php
index c4be7070d9..74016a80a2 100644
--- a/civicrm/CRM/Dedupe/Merger.php
+++ b/civicrm/CRM/Dedupe/Merger.php
@@ -541,6 +541,12 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
         continue;
       }
 
+      if ($table === 'civicrm_dashboard_contact') {
+        $sqls[] = "UPDATE IGNORE civicrm_dashboard_contact SET contact_id = $mainId WHERE contact_id = $otherId";
+        $sqls[] = "DELETE FROM civicrm_dashboard_contact WHERE contact_id = $otherId";
+        continue;
+      }
+
       if ($table === 'civicrm_dedupe_exception') {
         $sqls[] = "UPDATE IGNORE civicrm_dedupe_exception SET contact_id1 = $mainId WHERE contact_id1 = $otherId";
         $sqls[] = "UPDATE IGNORE civicrm_dedupe_exception SET contact_id2 = $mainId WHERE contact_id2 = $otherId";
diff --git a/civicrm/CRM/Report/Form.php b/civicrm/CRM/Report/Form.php
index 449e1a087c..d202b84561 100644
--- a/civicrm/CRM/Report/Form.php
+++ b/civicrm/CRM/Report/Form.php
@@ -1465,7 +1465,7 @@ class CRM_Report_Form extends CRM_Core_Form {
     if (!CRM_Core_Permission::check('view report sql')) {
       return;
     }
-    $ignored_output_modes = ['pdf', 'csv', 'print', 'excel2007'];
+    $ignored_output_modes = ['pdf', 'csv', 'print'];
     if (in_array($this->_outputMode, $ignored_output_modes)) {
       return;
     }
@@ -2900,12 +2900,6 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
         $this->addPaging = $this->outputHandler->isAddPaging();
         $this->_absoluteUrl = $this->outputHandler->isAbsoluteUrl();
       }
-
-    }
-    elseif ($this->_outputMode == 'excel2007') {
-      $printOnly = TRUE;
-      $this->_absoluteUrl = TRUE;
-      $this->addPaging = FALSE;
     }
     elseif ($this->_outputMode == 'copy' && $this->_criteriaForm) {
       $this->_createNew = TRUE;
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.29.1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.29.1.mysql.tpl
new file mode 100644
index 0000000000..f51e009f0d
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.29.1.mysql.tpl
@@ -0,0 +1,7 @@
+{* file to handle db changes in 5.29.1 during upgrade *}
+
+UPDATE `civicrm_custom_field` SET `serialize` = 0 WHERE `serialize` IS NULL;
+
+ALTER TABLE `civicrm_custom_field`
+CHANGE COLUMN `serialize`
+`serialize` int unsigned NOT NULL DEFAULT 0 COMMENT 'Serialization method - a non-zero value indicates a multi-valued field.';
diff --git a/civicrm/Civi/Api4/Generic/AbstractAction.php b/civicrm/Civi/Api4/Generic/AbstractAction.php
index 8d0111e6b3..fa995ce0d8 100644
--- a/civicrm/Civi/Api4/Generic/AbstractAction.php
+++ b/civicrm/Civi/Api4/Generic/AbstractAction.php
@@ -407,13 +407,15 @@ abstract class AbstractAction implements \ArrayAccess {
       'default' => ['administer CiviCRM'],
     ];
     $action = $this->getActionName();
-    if (isset($permissions[$action])) {
-      return $permissions[$action];
-    }
-    elseif (in_array($action, ['getActions', 'getFields'])) {
-      return $permissions['meta'];
-    }
-    return $permissions['default'];
+    // Map specific action names to more generic versions
+    $map = [
+      'getActions' => 'meta',
+      'getFields' => 'meta',
+      'replace' => 'delete',
+      'save' => 'create',
+    ];
+    $generic = $map[$action] ?? 'default';
+    return $permissions[$action] ?? $permissions[$generic] ?? $permissions['default'];
   }
 
   /**
diff --git a/civicrm/api/v3/CustomField.php b/civicrm/api/v3/CustomField.php
index 1667721744..a9b664b0b5 100644
--- a/civicrm/api/v3/CustomField.php
+++ b/civicrm/api/v3/CustomField.php
@@ -122,18 +122,45 @@ function civicrm_api3_custom_field_delete($params) {
  * @return array
  */
 function civicrm_api3_custom_field_get($params) {
-  if (CRM_Core_BAO_Domain::isDBVersionAtLeast('5.27.alpha1') && ($params['legacy_html_type'] ?? TRUE) && !empty($params['return'])) {
-    if (is_array($params['return'])) {
+  // Legacy handling for serialize property
+  $handleLegacy = (($params['legacy_html_type'] ?? !isset($params['serialize'])) && CRM_Core_BAO_Domain::isDBVersionAtLeast('5.27.alpha1'));
+  if ($handleLegacy && !empty($params['return'])) {
+    if (!is_array($params['return'])) {
+      $params['return'] = explode(',', str_replace(' ', '', $params['return']));
+    }
+    if (!in_array('serialize', $params['return'])) {
       $params['return'][] = 'serialize';
     }
-    elseif (is_string($params['return'])) {
-      $params['return'] .= ',serialize';
+  }
+  if ($handleLegacy && !empty($params['html_type'])) {
+    $serializedTypes = ['CheckBox', 'Multi-Select', 'Multi-Select Country', 'Multi-Select State/Province'];
+    if (is_string($params['html_type'])) {
+      if (strpos($params['html_type'], 'Multi-Select') === 0) {
+        $params['html_type'] = str_replace('Multi-Select', 'Select', $params['html_type']);
+        $params['serialize'] = 1;
+      }
+      elseif (!in_array($params['html_type'], $serializedTypes)) {
+        $params['serialize'] = 0;
+      }
+    }
+    elseif (is_array($params['html_type']) && !empty($params['html_type']['IN'])) {
+      $excludeNonSerialized = !array_diff($params['html_type']['IN'], $serializedTypes);
+      $onlyNonSerialized = !array_intersect($params['html_type']['IN'], $serializedTypes);
+      $params['html_type']['IN'] = array_map(function($val) {
+        return str_replace('Multi-Select', 'Select', $val);
+      }, $params['html_type']['IN']);
+      if ($excludeNonSerialized) {
+        $params['serialize'] = 1;
+      }
+      if ($onlyNonSerialized) {
+        $params['serialize'] = 0;
+      }
     }
   }
 
   $results = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 
-  if (($params['legacy_html_type'] ?? TRUE) && !empty($results['values']) && is_array($results['values'])) {
+  if ($handleLegacy && !empty($results['values']) && is_array($results['values']) && !isset($params['serialize'])) {
     foreach ($results['values'] as $id => $result) {
       if (!empty($result['serialize']) && !empty($result['html_type'])) {
         $results['values'][$id]['html_type'] = str_replace('Select', 'Multi-Select', $result['html_type']);
diff --git a/civicrm/civicrm-version.php b/civicrm/civicrm-version.php
index 5362bfefa3..2fd54269c2 100644
--- a/civicrm/civicrm-version.php
+++ b/civicrm/civicrm-version.php
@@ -1,7 +1,7 @@
 <?php
 /** @deprecated */
 function civicrmVersion( ) {
-  return array( 'version'  => '5.29.0',
+  return array( 'version'  => '5.29.1',
                 'cms'      => 'Wordpress',
                 'revision' => '' );
 }
diff --git a/civicrm/release-notes.md b/civicrm/release-notes.md
index d2d501d26a..b12dfb5a91 100644
--- a/civicrm/release-notes.md
+++ b/civicrm/release-notes.md
@@ -15,6 +15,15 @@ Other resources for identifying changes are:
     * https://github.com/civicrm/civicrm-joomla
     * https://github.com/civicrm/civicrm-wordpress
 
+## CiviCRM 5.29.1
+
+Released September 15, 2020
+
+- **[Synopsis](release-notes/5.29.1.md#synopsis)**
+- **[Bugs resolved](release-notes/5.29.1.md#bugs)**
+- **[Credits](release-notes/5.29.1.md#credits)**
+- **[Feedback](release-notes/5.29.1.md#feedback)**
+
 ## CiviCRM 5.29.0
 
 Released September 2, 2020
diff --git a/civicrm/release-notes/5.29.1.md b/civicrm/release-notes/5.29.1.md
new file mode 100644
index 0000000000..5ad7bbbc81
--- /dev/null
+++ b/civicrm/release-notes/5.29.1.md
@@ -0,0 +1,41 @@
+# CiviCRM 5.29.1
+
+Released September 15, 2020
+
+- **[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?                     | no       |
+| Fix problems installing or upgrading to a previous version?     | no       |
+| Introduce features?                                             | no       |
+| **Fix bugs?**                                                   | **yes**  |
+
+## <a name="bugs"></a>Bugs resolved
+
+* **_APIv3_: Searching list of custom-fields using traditional field-types ([dev/core#1996](https://lab.civicrm.org/dev/core/-/issues/1996): [#18347](https://github.com/civicrm/civicrm-core/pull/18347))**
+* **_Dedupe_: Merging contacts with "Dashboard" settings produces error ([dev/core#1998](https://lab.civicrm.org/dev/core/-/issues/1998): [#18353](https://github.com/civicrm/civicrm-core/pull/18353))**
+* **_Message Templates_: Permission error affects some authorized users ([dev/core#2008](https://lab.civicrm.org/dev/core/-/issues/2008): [#18437](https://github.com/civicrm/civicrm-core/pull/18437))**
+* **_PayPal Pro_: Validation error prevents payment submission ([dev/financial#147](https://lab.civicrm.org/dev/financial/-/issues/147): [#18459](https://github.com/civicrm/civicrm-core/pull/18459))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following authors and reviewers:
+
+Wikimedia Foundation - Eileen McNaughton; Tadpole Collective - Kevin Cristiano; Samuele Masetto;
+SYSTOPIA Organisationsberatung - Björn Endres; Maynard Smith; Korlon - Stuart Gaston; JMA
+Consulting - Seamus Lee; CiviCoop - Jaap Jansma; CiviCRM - Coleman Watts, Tim Otten; Circle
+Interactive - Pradeep Nayak
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Tim Otten and Andrew 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/sql/civicrm.mysql b/civicrm/sql/civicrm.mysql
index 48d11ec0e3..cbcb27da70 100644
--- a/civicrm/sql/civicrm.mysql
+++ b/civicrm/sql/civicrm.mysql
@@ -1817,7 +1817,7 @@ CREATE TABLE `civicrm_custom_field` (
      `note_rows` int unsigned    COMMENT 'Number of rows in Note Field',
      `column_name` varchar(255)    COMMENT 'Name of the column that holds the values for this field.',
      `option_group_id` int unsigned    COMMENT 'For elements with options, the option group id that is used',
-     `serialize` int unsigned    COMMENT 'Serialization method - a non-null value indicates a multi-valued field.',
+     `serialize` int unsigned NOT NULL  DEFAULT 0 COMMENT 'Serialization method - a non-zero value indicates a multi-valued field.',
      `filter` varchar(255)    COMMENT 'Stores Contact Get API params contact reference custom fields. May be used for other filters in the future.',
      `in_selector` tinyint   DEFAULT 0 COMMENT 'Should the multi-record custom field values be displayed in tab table listing' 
 ,
diff --git a/civicrm/sql/civicrm_data.mysql b/civicrm/sql/civicrm_data.mysql
index 5082547f7c..1aab8338dd 100644
--- a/civicrm/sql/civicrm_data.mysql
+++ b/civicrm/sql/civicrm_data.mysql
@@ -23897,4 +23897,4 @@ INSERT INTO `civicrm_report_instance`
     ( `domain_id`, `title`, `report_id`, `description`, `permission`, `form_values`)
 VALUES
     (  @domainID, 'Survey Details', 'survey/detail', 'Detailed report for canvassing, phone-banking, walk lists or other surveys.', 'access CiviReport', 'a:39:{s:6:"fields";a:2:{s:9:"sort_name";s:1:"1";s:6:"result";s:1:"1";}s:22:"assignee_contact_id_op";s:2:"eq";s:25:"assignee_contact_id_value";s:0:"";s:12:"sort_name_op";s:3:"has";s:15:"sort_name_value";s:0:"";s:17:"street_number_min";s:0:"";s:17:"street_number_max";s:0:"";s:16:"street_number_op";s:3:"lte";s:19:"street_number_value";s:0:"";s:14:"street_name_op";s:3:"has";s:17:"street_name_value";s:0:"";s:15:"postal_code_min";s:0:"";s:15:"postal_code_max";s:0:"";s:14:"postal_code_op";s:3:"lte";s:17:"postal_code_value";s:0:"";s:7:"city_op";s:3:"has";s:10:"city_value";s:0:"";s:20:"state_province_id_op";s:2:"in";s:23:"state_province_id_value";a:0:{}s:13:"country_id_op";s:2:"in";s:16:"country_id_value";a:0:{}s:12:"survey_id_op";s:2:"in";s:15:"survey_id_value";a:0:{}s:12:"status_id_op";s:2:"eq";s:15:"status_id_value";s:1:"1";s:11:"custom_1_op";s:2:"in";s:14:"custom_1_value";a:0:{}s:11:"custom_2_op";s:2:"in";s:14:"custom_2_value";a:0:{}s:17:"custom_3_relative";s:1:"0";s:13:"custom_3_from";s:0:"";s:11:"custom_3_to";s:0:"";s:11:"description";s:75:"Detailed report for canvassing, phone-banking, walk lists or other surveys.";s:13:"email_subject";s:0:"";s:8:"email_to";s:0:"";s:8:"email_cc";s:0:"";s:10:"permission";s:17:"access CiviReport";s:6:"groups";s:0:"";s:9:"domain_id";i:1;}');
-UPDATE civicrm_domain SET version = '5.29.0';
+UPDATE civicrm_domain SET version = '5.29.1';
diff --git a/civicrm/sql/civicrm_generated.mysql b/civicrm/sql/civicrm_generated.mysql
index d1972c9448..c1fafd9745 100644
--- a/civicrm/sql/civicrm_generated.mysql
+++ b/civicrm/sql/civicrm_generated.mysql
@@ -399,7 +399,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.29.0',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
+INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,'5.29.1',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
 /*!40000 ALTER TABLE `civicrm_domain` ENABLE KEYS */;
 UNLOCK TABLES;
 
diff --git a/civicrm/vendor/autoload.php b/civicrm/vendor/autoload.php
index c3e3e239b7..5333a90fa0 100644
--- a/civicrm/vendor/autoload.php
+++ b/civicrm/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer/autoload_real.php';
 
-return ComposerAutoloaderInit191eca689b99b98f3334e35c02d03840::getLoader();
+return ComposerAutoloaderInitc0c306f7aec196654ddc587ff3d70d96::getLoader();
diff --git a/civicrm/vendor/composer/autoload_real.php b/civicrm/vendor/composer/autoload_real.php
index 6775052330..8e5f2d3763 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 ComposerAutoloaderInit191eca689b99b98f3334e35c02d03840
+class ComposerAutoloaderInitc0c306f7aec196654ddc587ff3d70d96
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit191eca689b99b98f3334e35c02d03840
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInit191eca689b99b98f3334e35c02d03840', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInitc0c306f7aec196654ddc587ff3d70d96', 'loadClassLoader'), true, true);
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInit191eca689b99b98f3334e35c02d03840', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInitc0c306f7aec196654ddc587ff3d70d96', 'loadClassLoader'));
 
         $includePaths = require __DIR__ . '/include_paths.php';
         $includePaths[] = get_include_path();
@@ -31,7 +31,7 @@ class ComposerAutoloaderInit191eca689b99b98f3334e35c02d03840
         if ($useStaticLoader) {
             require_once __DIR__ . '/autoload_static.php';
 
-            call_user_func(\Composer\Autoload\ComposerStaticInit191eca689b99b98f3334e35c02d03840::getInitializer($loader));
+            call_user_func(\Composer\Autoload\ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96::getInitializer($loader));
         } else {
             $map = require __DIR__ . '/autoload_namespaces.php';
             foreach ($map as $namespace => $path) {
@@ -52,19 +52,19 @@ class ComposerAutoloaderInit191eca689b99b98f3334e35c02d03840
         $loader->register(true);
 
         if ($useStaticLoader) {
-            $includeFiles = Composer\Autoload\ComposerStaticInit191eca689b99b98f3334e35c02d03840::$files;
+            $includeFiles = Composer\Autoload\ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96::$files;
         } else {
             $includeFiles = require __DIR__ . '/autoload_files.php';
         }
         foreach ($includeFiles as $fileIdentifier => $file) {
-            composerRequire191eca689b99b98f3334e35c02d03840($fileIdentifier, $file);
+            composerRequirec0c306f7aec196654ddc587ff3d70d96($fileIdentifier, $file);
         }
 
         return $loader;
     }
 }
 
-function composerRequire191eca689b99b98f3334e35c02d03840($fileIdentifier, $file)
+function composerRequirec0c306f7aec196654ddc587ff3d70d96($fileIdentifier, $file)
 {
     if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
         require $file;
diff --git a/civicrm/vendor/composer/autoload_static.php b/civicrm/vendor/composer/autoload_static.php
index 072ec1603e..c31616f97c 100644
--- a/civicrm/vendor/composer/autoload_static.php
+++ b/civicrm/vendor/composer/autoload_static.php
@@ -4,7 +4,7 @@
 
 namespace Composer\Autoload;
 
-class ComposerStaticInit191eca689b99b98f3334e35c02d03840
+class ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96
 {
     public static $files = array (
         '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
@@ -531,11 +531,11 @@ class ComposerStaticInit191eca689b99b98f3334e35c02d03840
     public static function getInitializer(ClassLoader $loader)
     {
         return \Closure::bind(function () use ($loader) {
-            $loader->prefixLengthsPsr4 = ComposerStaticInit191eca689b99b98f3334e35c02d03840::$prefixLengthsPsr4;
-            $loader->prefixDirsPsr4 = ComposerStaticInit191eca689b99b98f3334e35c02d03840::$prefixDirsPsr4;
-            $loader->prefixesPsr0 = ComposerStaticInit191eca689b99b98f3334e35c02d03840::$prefixesPsr0;
-            $loader->fallbackDirsPsr0 = ComposerStaticInit191eca689b99b98f3334e35c02d03840::$fallbackDirsPsr0;
-            $loader->classMap = ComposerStaticInit191eca689b99b98f3334e35c02d03840::$classMap;
+            $loader->prefixLengthsPsr4 = ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96::$prefixDirsPsr4;
+            $loader->prefixesPsr0 = ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96::$prefixesPsr0;
+            $loader->fallbackDirsPsr0 = ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96::$fallbackDirsPsr0;
+            $loader->classMap = ComposerStaticInitc0c306f7aec196654ddc587ff3d70d96::$classMap;
 
         }, null, ClassLoader::class);
     }
diff --git a/civicrm/xml/schema/Core/CustomField.xml b/civicrm/xml/schema/Core/CustomField.xml
index 2bfd28999a..3e8c2b7d64 100644
--- a/civicrm/xml/schema/Core/CustomField.xml
+++ b/civicrm/xml/schema/Core/CustomField.xml
@@ -286,11 +286,13 @@
     <type>int unsigned</type>
     <title>Serialize</title>
     <length>255</length>
-    <comment>Serialization method - a non-null value indicates a multi-valued field.</comment>
+    <comment>Serialization method - a non-zero value indicates a multi-valued field.</comment>
     <pseudoconstant>
       <callback>CRM_Core_SelectValues::fieldSerialization</callback>
     </pseudoconstant>
     <add>5.27</add>
+    <required>true</required>
+    <default>0</default>
   </field>
   <field>
     <name>filter</name>
diff --git a/civicrm/xml/version.xml b/civicrm/xml/version.xml
index 1f477e75ac..b94dfffc42 100644
--- a/civicrm/xml/version.xml
+++ b/civicrm/xml/version.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="iso-8859-1" ?>
 <version>
-  <version_no>5.29.0</version_no>
+  <version_no>5.29.1</version_no>
 </version>
-- 
GitLab