Forminator Payment, Quiz and Contact Form Plugin - Version 1.18.1

Version Description

( 2022-09-15 ) =

  • New: Forminator Reports to help with tracking performance of forms, polls, and quizzes
  • Add: Admin email Macro {admin_email}
  • Improvement: Form fields now have a unique ID. This unique ID is also added as data-uid attribute to the form tag, so If you currently have scripts that use field ID's, these will need to be updated now
  • Improvement: Convert Zapier integration to Webhook integration
  • Improvement: Additional appearance settings for Input Border Radius and Hover Colours
  • Improvement: Replace Select placeholder default "null" to "Search"
  • Fix: Checkboxes and selects do not save multiple selections separately
  • Fix: A float cannot be used as a number if inline validation is disabled
  • Fix: The time picker checks on time limits in real-time
  • Fix: The checkbox fields aren't showing up as checked
  • Fix: Conditions apply when the visibility rules are set to Hidden
  • Fix: Validation of email fields is not disabled
  • Fix: Safari does not support e-signature
  • Fix: Conditions not working for the address field
  • Fix: Can't clear date limits for the Datepicker field
  • Fix: Error when Site Registration is enabled on the registration form
  • Fix: Issue with ACF and file upload field in the registration form
  • Fix: Going out of range for the number field when using the up/down arrow keys
  • Fix: Selecting a default future date does not show the correct date for specific date formats
  • Fix: Visibility conditions don't work when adding the Stripe field and not connecting it
  • Fix: A calculation field's 'hidden' setting is overridden if a 'visibility' condition has been set previously and not deleted
  • Fix: The PayPal and Stripe fields do not appear in Divi's popup
  • Fix: Issue with Stripe 3D secure payment
  • Fix: Load form Ajax conflict with SEOpress plugin
  • Fix: the e-signature is not saved after submission
  • Fix: PayPal displays an error when two different forms with PayPal buttons are added to the same page
  • Fix: Max and Min Limits are not working when setting a number field as required
  • Fix: Address field does not work with query parameters
  • Fix: Stripe field doesn't exist error
  • Fix: Values for select fields are not saved when visibility is dependent on a checkbox
  • Fix: Error when input field visibility is dependent on a select box
  • Fix: Limit validation fails for the Currency field when using some formatting separators
  • Fix: Form Email Routing does not work with recipients added from Select or Radio buttons
  • Fix: Visibility conditions fail for a Textarea field dependant on Currency and Calculations fields
  • Fix: Failing to validate numeric fields in some cases
  • Fix: The country flags are broken in the phone field on mobile devices
  • Fix: The country code does not appear for the default country
  • Fix: Symbols do not work with Stripe metadata
  • Fix: Checkbox pre-selected option is removed when its visibility is dependent on another field
  • Fix: The year select dropdown displays the current year instead of "Select year" when the Datepicker field type is set to dropdown and the Year Range 'To' filed is set to a future date
  • Fix: Stripe field does not work with visibility conditions
  • Fix: Removing a custom error message doesn't revert to the default one
  • Fix: The pre-populate function only works if the query variable is after the selected option
  • Fix: Comma or Separators in Fields cause some problems
  • Fix: Stripe Font is not Displaying Correctly
  • Fix: Stripe failing with 0 balance form
  • Fix: No value is passed when the calculation field is mapped to a custom field and submitted
  • Fix: Error when having null values for hidden fields set as required
  • Fix: Conflict with Ultimate Member plugin
  • Fix: Textarea field label issue with RTL
  • Fix: The fields are not prefilled via the URL query when setting the Name field to Multiple
  • Fix: Number and Text fields do not display 0 on the front end when 0 is set as the default value
  • Fix: Some fields are cut off when adding a Page Break
  • Fix: The Select Field requires a placeholder if set as required
  • Fix: Names and values of select/radio fields do not sync
  • Fix: Recaptcha does not work in Divi's popup
  • Fix: Removing spaces before a tag in the Text field description
  • Fix: Returning an empty array or WP_Error object in the get_forms() method of the Forminator API
  • Fix: HTML Validator posts errors coming from Forminator
  • Fix: Upload file issue on mobile applications
  • Fix: The description field in HubSpot does not work
  • Fix: Fields are missing in email notifications
  • Fix: The pagination progress bar and next button disappear from the form
  • Fix: Calculation field decimal separator causes an infinite loop in JS
  • Fix: Posts are created when the inline validation option is disabled
  • Fix: Form is not submitting with Stripe field in the same row with other fields
  • Fix: Trello integration does not add cards
  • Fix: Browser console error when adding the same form twice on the same page
  • Fix: PayPal does not work when Pre-fill Billing Details is disabled
  • Fix: Incorrect Country flag showing up in Phone field
  • Fix: PayPal module doesn't show up when pagination is enabled
  • Fix: Recaptcha and hCaptcha verification fail if Stripe field is hidden
  • Fix: Forminator will only add the associated ticket to Hubspot If the contact belongs to a list
  • Fix: Quiz ActiveCampaign integration issue
  • Fix: Active Campaign integration doesn't show the correct fields
  • Fix: Mailchimp submission error with radio type
  • Fix: Consent filed label always shows an asterisk even if it is not required
  • Fix: The number field in the stripe description create a fatal error
Download this release

Release Info

Developer Dency
Plugin Icon 128x128 Forminator Payment, Quiz and Contact Form Plugin
Version 1.18.1
Comparing to
See all releases

Code changes from version 1.17.2 to 1.18.1

Files changed (88) hide show
  1. addons/pro/activecampaign/class-forminator-addon-activecampaign-form-settings.php +13 -14
  2. addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings.php +18 -10
  3. addons/pro/aweber/class-forminator-addon-aweber-form-hooks.php +10 -6
  4. addons/pro/hubspot/class-forminator-addon-hubspot-form-hooks.php +14 -12
  5. addons/pro/hubspot/views/form-settings/create-ticket.php +1 -3
  6. addons/pro/mailchimp/class-forminator-addon-mailchimp-form-hooks.php +8 -0
  7. addons/pro/slack/class-forminator-addon-slack.php +38 -7
  8. addons/pro/trello/class-forminator-addon-trello-form-hooks.php +21 -19
  9. addons/pro/webhook/assets/icons/webhook.png +0 -0
  10. addons/pro/webhook/assets/icons/webhook@2x.png +0 -0
  11. addons/pro/webhook/assets/img/banner.png +0 -0
  12. addons/pro/webhook/assets/img/banner@2x.png +0 -0
  13. addons/pro/webhook/assets/img/webhook.png +0 -0
  14. addons/pro/webhook/assets/img/webhook@2x.png +0 -0
  15. addons/pro/webhook/class-forminator-addon-webhook-exception.php +9 -0
  16. addons/pro/webhook/class-forminator-addon-webhook-form-hooks.php +573 -0
  17. addons/pro/webhook/class-forminator-addon-webhook-form-settings-exception.php +68 -0
  18. addons/pro/webhook/class-forminator-addon-webhook-form-settings.php +468 -0
  19. addons/pro/webhook/class-forminator-addon-webhook-poll-hooks.php +411 -0
  20. addons/pro/webhook/class-forminator-addon-webhook-poll-settings-exception.php +68 -0
  21. addons/pro/webhook/class-forminator-addon-webhook-poll-settings.php +386 -0
  22. addons/pro/webhook/class-forminator-addon-webhook-quiz-hooks.php +619 -0
  23. addons/pro/webhook/class-forminator-addon-webhook-quiz-settings-exception.php +68 -0
  24. addons/pro/webhook/class-forminator-addon-webhook-quiz-settings.php +434 -0
  25. addons/pro/webhook/class-forminator-addon-webhook.php +437 -0
  26. addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-exception.php +10 -0
  27. addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-not-found-exception.php +10 -0
  28. addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api.php +316 -0
  29. addons/pro/webhook/views/poll-settings/setup-webhook.php +101 -0
  30. addons/pro/webhook/views/quiz-settings/setup-webhook.php +101 -0
  31. addons/pro/webhook/views/settings/setup-connect-success.php +14 -0
  32. addons/pro/webhook/views/settings/setup-connect.php +86 -0
  33. addons/pro/webhook/webhook.php +37 -0
  34. addons/pro/zapier/assets/icons/zapier.png +0 -0
  35. addons/pro/zapier/assets/icons/zapier@2x.png +0 -0
  36. addons/pro/zapier/assets/img/banner.png +0 -0
  37. addons/pro/zapier/assets/img/banner@2x.png +0 -0
  38. addons/pro/zapier/assets/img/zapier.png +0 -0
  39. addons/pro/zapier/assets/img/zapier@2x.png +0 -0
  40. addons/pro/zapier/class-forminator-addon-zapier-exception.php +3 -4
  41. addons/pro/zapier/class-forminator-addon-zapier-form-hooks.php +3 -531
  42. addons/pro/zapier/class-forminator-addon-zapier-form-settings-exception.php +3 -61
  43. addons/pro/zapier/class-forminator-addon-zapier-form-settings.php +3 -480
  44. addons/pro/zapier/class-forminator-addon-zapier-poll-hooks.php +3 -357
  45. addons/pro/zapier/class-forminator-addon-zapier-poll-settings-exception.php +3 -62
  46. addons/pro/zapier/class-forminator-addon-zapier-poll-settings.php +3 -382
  47. addons/pro/zapier/class-forminator-addon-zapier-quiz-hooks.php +3 -556
  48. addons/pro/zapier/class-forminator-addon-zapier-quiz-settings-exception.php +3 -61
  49. addons/pro/zapier/class-forminator-addon-zapier-quiz-settings.php +3 -430
  50. addons/pro/zapier/class-forminator-addon-zapier.php +4 -423
  51. addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-exception.php +3 -4
  52. addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-not-found-exception.php +3 -4
  53. addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api.php +3 -300
  54. addons/pro/zapier/views/poll-settings/setup-webhook.php +0 -118
  55. addons/pro/zapier/views/quiz-settings/setup-webhook.php +0 -118
  56. addons/pro/zapier/views/settings/setup-connect-success.php +0 -13
  57. addons/pro/zapier/views/settings/setup-connect.php +0 -83
  58. addons/pro/zapier/zapier.php +3 -33
  59. admin/abstracts/class-admin-module-edit-page.php +8 -0
  60. admin/abstracts/class-admin-page.php +64 -0
  61. admin/classes/class-admin-ajax.php +160 -80
  62. admin/classes/class-admin.php +293 -447
  63. admin/classes/class-reports-page.php +460 -0
  64. admin/locale.php +152 -147
  65. admin/pages/entries-page.php +2 -63
  66. admin/pages/reports-page.php +291 -0
  67. admin/pages/settings-page.php +4 -0
  68. admin/views/addons/action-button.php +0 -6
  69. admin/views/addons/addons-list.php +1 -1
  70. admin/views/common/entries/content.php +1 -1
  71. admin/views/common/popup/import.php +20 -0
  72. admin/views/common/reports/chart-content.php +58 -0
  73. admin/views/common/reports/content-none.php +17 -0
  74. admin/views/common/reports/content.php +27 -0
  75. admin/views/common/reports/header.php +11 -0
  76. admin/views/common/reports/integration-report.php +79 -0
  77. admin/views/common/reports/report-content.php +100 -0
  78. admin/views/common/reports/single-report.php +104 -0
  79. admin/views/common/reports/tab-dashboard.php +84 -0
  80. admin/views/custom-form/entries/content.php +1 -1
  81. admin/views/custom-form/popup/import-cf7.php +1 -1
  82. admin/views/dashboard/content.php +1 -1
  83. admin/views/dashboard/new-feature-notice.php +17 -19
  84. admin/views/dashboard/promote-free-plan.php +128 -0
  85. admin/views/integrations/addon.php +1 -1
  86. admin/views/quiz/entries/content.php +1 -1
  87. assets/forminator-ui/CHANGELOG.md +10 -0
  88. assets/forminator-ui/css/forminator-forms.min.css +0 -1
addons/pro/activecampaign/class-forminator-addon-activecampaign-form-settings.php CHANGED
@@ -199,7 +199,7 @@ class Forminator_Addon_Activecampaign_Form_Settings extends Forminator_Addon_For
199
  $is_submit = ! empty( $submitted_data );
200
  $has_errors = false;
201
 
202
- $lists = array();
203
 
204
  try {
205
 
@@ -342,8 +342,8 @@ class Forminator_Addon_Activecampaign_Form_Settings extends Forminator_Addon_For
342
  'email_fields' => $email_fields,
343
  );
344
 
345
- $is_submit = ! empty( $submitted_data );
346
- $has_errors = false;
347
  $custom_fields = array();
348
 
349
  $fields = array(
@@ -358,23 +358,22 @@ class Forminator_Addon_Activecampaign_Form_Settings extends Forminator_Addon_For
358
 
359
  try {
360
 
361
- $ac_api = $this->addon->get_api();
362
- $list_detail = $ac_api->get_list( $list_id );
363
  $lists_request = $ac_api->get_lists();
364
- foreach ( $lists_request as $key => $data ) {
365
- if ( isset( $data->id ) ) {
366
- if ( isset( $data->fields ) ) {
367
- $custom_fields[ $list_id ] = $data->fields;
 
 
368
  }
369
  }
370
  }
371
 
372
- //get global fields assigned to the form as well as explecit field
373
- if ( ! empty( $custom_fields ) && is_array( $custom_fields ) ) {
374
  foreach ( $custom_fields as $custom_field ) {
375
- foreach ( $custom_field as $field ) {
376
- $fields[ $field->id ] = $field->title;
377
- }
378
  }
379
  }
380
 
199
  $is_submit = ! empty( $submitted_data );
200
  $has_errors = false;
201
 
202
+ $lists = array();
203
 
204
  try {
205
 
342
  'email_fields' => $email_fields,
343
  );
344
 
345
+ $is_submit = ! empty( $submitted_data );
346
+ $has_errors = false;
347
  $custom_fields = array();
348
 
349
  $fields = array(
358
 
359
  try {
360
 
361
+ $ac_api = $this->addon->get_api();
 
362
  $lists_request = $ac_api->get_lists();
363
+ $custom_fields = array();
364
+
365
+ foreach ( $lists_request as $list ) {
366
+ if ( $list_id === $list->id ) {
367
+ if ( ! empty( $list->fields ) ) {
368
+ $custom_fields = $list->fields;
369
  }
370
  }
371
  }
372
 
373
+ // get global fields assigned to the form as well as explecit field
374
+ if ( ! empty( $custom_fields ) ) {
375
  foreach ( $custom_fields as $custom_field ) {
376
+ $fields[ $custom_field->id ] = $custom_field->title;
 
 
377
  }
378
  }
379
 
addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings.php CHANGED
@@ -340,12 +340,11 @@ class Forminator_Addon_Activecampaign_Quiz_Settings extends Forminator_Addon_Qui
340
  if ( 'email' === $form_field['type'] ) {
341
  $email_fields[] = $form_field;
342
  }
343
-
344
  }
345
 
346
  $quiz_questions = $this->get_quiz_fields();
347
  $quiz_fields = array(
348
- 'quiz-name' => __( 'Quiz Name', 'forminator' ),
349
  );
350
  foreach ( $quiz_questions as $quiz_question ) {
351
  // collect element ids.
@@ -355,10 +354,10 @@ class Forminator_Addon_Activecampaign_Quiz_Settings extends Forminator_Addon_Qui
355
  if ( 'knowledge' === $this->quiz->quiz_type ) {
356
  $quiz_fields['correct-answers'] = __( 'Correct Answers', 'forminator' );
357
  $quiz_fields['total-answers'] = __( 'Total Answers', 'forminator' );
358
- array_push( $forminator_quiz_element_ids,'quiz-name','correct-answers', 'total-answers' );
359
  } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
360
  $quiz_fields['result-answers'] = __( 'Result Answer', 'forminator' );
361
- array_push( $forminator_quiz_element_ids,'quiz-name', 'result-answers' );
362
  }
363
 
364
  $forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
@@ -388,13 +387,22 @@ class Forminator_Addon_Activecampaign_Quiz_Settings extends Forminator_Addon_Qui
388
 
389
  try {
390
 
391
- $ac_api = $this->addon->get_api();
392
- $list_detail = $ac_api->get_list( $list_id );
 
 
 
 
 
 
 
 
 
393
 
394
- //get global fields assigned to the form as well as explecit field
395
- if ( ! empty( $this->custom_fields ) && is_array( $this->custom_fields ) ) {
396
- foreach ( $this->custom_fields as $field ) {
397
- $fields[ $field->id ] = $field->title;
398
  }
399
  }
400
 
340
  if ( 'email' === $form_field['type'] ) {
341
  $email_fields[] = $form_field;
342
  }
 
343
  }
344
 
345
  $quiz_questions = $this->get_quiz_fields();
346
  $quiz_fields = array(
347
+ 'quiz-name' => __( 'Quiz Name', 'forminator' ),
348
  );
349
  foreach ( $quiz_questions as $quiz_question ) {
350
  // collect element ids.
354
  if ( 'knowledge' === $this->quiz->quiz_type ) {
355
  $quiz_fields['correct-answers'] = __( 'Correct Answers', 'forminator' );
356
  $quiz_fields['total-answers'] = __( 'Total Answers', 'forminator' );
357
+ array_push( $forminator_quiz_element_ids, 'quiz-name', 'correct-answers', 'total-answers' );
358
  } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
359
  $quiz_fields['result-answers'] = __( 'Result Answer', 'forminator' );
360
+ array_push( $forminator_quiz_element_ids, 'quiz-name', 'result-answers' );
361
  }
362
 
363
  $forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
387
 
388
  try {
389
 
390
+ $ac_api = $this->addon->get_api();
391
+ $lists_request = $ac_api->get_lists();
392
+ $custom_fields = array();
393
+
394
+ foreach ( $lists_request as $list ) {
395
+ if ( $list_id === $list->id ) {
396
+ if ( ! empty( $list->fields ) ) {
397
+ $custom_fields = $list->fields;
398
+ }
399
+ }
400
+ }
401
 
402
+ // get global fields assigned to the form as well as explecit field
403
+ if ( ! empty( $custom_fields ) ) {
404
+ foreach ( $custom_fields as $custom_field ) {
405
+ $fields[ $custom_field->id ] = $custom_field->title;
406
  }
407
  }
408
 
addons/pro/aweber/class-forminator-addon-aweber-form-hooks.php CHANGED
@@ -4,7 +4,6 @@
4
  * Class Forminator_Addon_Aweber_Form_Hooks
5
  *
6
  * @since 1.0 Aweber Addon
7
- *
8
  */
9
  class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
10
 
@@ -142,7 +141,7 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
142
  $form_settings_instance = $this->form_settings_instance;
143
  $form_settings = $this->form_settings_instance->get_form_settings();
144
 
145
- //check required fields
146
  try {
147
  $api = $this->addon->get_api();
148
  $args = array();
@@ -166,7 +165,7 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
166
  $email = strtolower( trim( $email ) );
167
  $args['email'] = $email;
168
 
169
- //find existing subscriber first
170
  /**
171
  * Filter arguments to passed on to Find Subscriber AWeber API
172
  *
@@ -292,10 +291,15 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
292
  $element_id = str_ireplace( '}', '', $element_id );
293
 
294
  if ( isset( $submitted_data[ $element_id ] ) ) {
295
- $tags[] = strtolower( (string) $submitted_data[ $element_id ] ); // tag must be string.
 
 
 
 
 
296
  }
297
  } else {
298
- $tags[] = strtolower( $tag );
299
  }
300
  }
301
 
@@ -712,7 +716,7 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
712
  *
713
  * @param $addon_meta_data
714
  * @param $key
715
- * @param string $default
716
  *
717
  * @return string
718
  */
4
  * Class Forminator_Addon_Aweber_Form_Hooks
5
  *
6
  * @since 1.0 Aweber Addon
 
7
  */
8
  class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
9
 
141
  $form_settings_instance = $this->form_settings_instance;
142
  $form_settings = $this->form_settings_instance->get_form_settings();
143
 
144
+ // check required fields
145
  try {
146
  $api = $this->addon->get_api();
147
  $args = array();
165
  $email = strtolower( trim( $email ) );
166
  $args['email'] = $email;
167
 
168
+ // find existing subscriber first
169
  /**
170
  * Filter arguments to passed on to Find Subscriber AWeber API
171
  *
291
  $element_id = str_ireplace( '}', '', $element_id );
292
 
293
  if ( isset( $submitted_data[ $element_id ] ) ) {
294
+ $field_tags = $submitted_data[ $element_id ];
295
+ $field_tags = explode( ',', $field_tags );
296
+
297
+ foreach ( $field_tags as $tag ) {
298
+ $tags[] = sanitize_title( $tag );
299
+ }
300
  }
301
  } else {
302
+ $tags[] = sanitize_title( $tag );
303
  }
304
  }
305
 
716
  *
717
  * @param $addon_meta_data
718
  * @param $key
719
+ * @param string $default
720
  *
721
  * @return string
722
  */
addons/pro/hubspot/class-forminator-addon-hubspot-form-hooks.php CHANGED
@@ -4,7 +4,6 @@
4
  * Class Forminator_Addon_Hubspot_Form_Hooks
5
  *
6
  * @since 1.0 HubSpot Addon
7
- *
8
  */
9
  class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
10
 
@@ -145,14 +144,14 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
145
  if ( empty( $connection_settings['name'] ) ) {
146
  $connection_settings['name'] = __( 'HubSpot', 'forminator' );
147
  }
148
- //check required fields
149
  try {
150
  $api = $this->addon->get_api();
151
  $args = array();
152
 
153
  $list_id = $connection_settings['list_id'];
154
 
155
- $deafult_fields = $connection_settings['fields_map'];
156
  $custom_fields_map = array_filter( $connection_settings['custom_fields_map'] );
157
 
158
  $fields_map = array_merge( $deafult_fields, $custom_fields_map );
@@ -173,10 +172,10 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
173
  'lastname',
174
  'jobtitle',
175
  );
176
- $extra_field = array();
177
  if ( ! empty( $custom_fields_map ) ) {
178
- foreach( $custom_fields_map as $custom => $custom_field ) {
179
- if( ! empty( $custom ) ) {
180
  $extra_field[] = $custom;
181
  }
182
  }
@@ -223,7 +222,7 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
223
  * @param array $form_settings Displayed Form settings.
224
  * @param Forminator_Addon_Hubspot_Form_Settings $form_settings_instance HubSpot Addon Form Settings instance.
225
  */
226
- $args = apply_filters(
227
  'forminator_addon_hubspot_create_contact_args',
228
  $args,
229
  $form_id,
@@ -236,9 +235,12 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
236
  $contact_id = $api->add_update_contact( $args );
237
  // Add contact to contact list.
238
  $toObjectId = null;
239
- if ( ! empty( $list_id ) && ! empty( $contact_id ) && ! is_object( $contact_id ) && (int) $contact_id > 0 ) {
240
  $toObjectId = $contact_id;
241
- $api->add_to_contact_list( $contact_id, $args['email'], $list_id );
 
 
 
242
  }
243
 
244
  $create_ticket = isset( $connection_settings['create_ticket'] ) ? $connection_settings['create_ticket'] : '';
@@ -554,7 +556,7 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
554
  *
555
  * @param $addon_meta_data
556
  * @param $key
557
- * @param string $default
558
  *
559
  * @return string
560
  */
@@ -609,7 +611,7 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
609
  * @since 1.0 HubSpot Addon
610
  *
611
  * @param Forminator_Form_Entry_Model $entry_model
612
- * @param array $addon_meta_data
613
  *
614
  * @return bool
615
  */
@@ -733,4 +735,4 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
733
  }
734
 
735
  }
736
- }
4
  * Class Forminator_Addon_Hubspot_Form_Hooks
5
  *
6
  * @since 1.0 HubSpot Addon
 
7
  */
8
  class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
9
 
144
  if ( empty( $connection_settings['name'] ) ) {
145
  $connection_settings['name'] = __( 'HubSpot', 'forminator' );
146
  }
147
+ // check required fields
148
  try {
149
  $api = $this->addon->get_api();
150
  $args = array();
151
 
152
  $list_id = $connection_settings['list_id'];
153
 
154
+ $deafult_fields = $connection_settings['fields_map'];
155
  $custom_fields_map = array_filter( $connection_settings['custom_fields_map'] );
156
 
157
  $fields_map = array_merge( $deafult_fields, $custom_fields_map );
172
  'lastname',
173
  'jobtitle',
174
  );
175
+ $extra_field = array();
176
  if ( ! empty( $custom_fields_map ) ) {
177
+ foreach ( $custom_fields_map as $custom => $custom_field ) {
178
+ if ( ! empty( $custom ) ) {
179
  $extra_field[] = $custom;
180
  }
181
  }
222
  * @param array $form_settings Displayed Form settings.
223
  * @param Forminator_Addon_Hubspot_Form_Settings $form_settings_instance HubSpot Addon Form Settings instance.
224
  */
225
+ $args = apply_filters(
226
  'forminator_addon_hubspot_create_contact_args',
227
  $args,
228
  $form_id,
235
  $contact_id = $api->add_update_contact( $args );
236
  // Add contact to contact list.
237
  $toObjectId = null;
238
+ if ( ! empty( $contact_id ) && ! is_object( $contact_id ) && (int) $contact_id > 0 ) {
239
  $toObjectId = $contact_id;
240
+
241
+ if ( ! empty( $list_id ) ) {
242
+ $api->add_to_contact_list( $contact_id, $args['email'], $list_id );
243
+ }
244
  }
245
 
246
  $create_ticket = isset( $connection_settings['create_ticket'] ) ? $connection_settings['create_ticket'] : '';
556
  *
557
  * @param $addon_meta_data
558
  * @param $key
559
+ * @param string $default
560
  *
561
  * @return string
562
  */
611
  * @since 1.0 HubSpot Addon
612
  *
613
  * @param Forminator_Form_Entry_Model $entry_model
614
+ * @param array $addon_meta_data
615
  *
616
  * @return bool
617
  */
735
  }
736
 
737
  }
738
+ }
addons/pro/hubspot/views/form-settings/create-ticket.php CHANGED
@@ -259,9 +259,7 @@ foreach ( $template_vars as $key => $val ) {
259
  id="ticket-description"
260
  class="sui-form-control ticket-text"
261
  aria-labelledby="ticket-description-label"
262
- >
263
- <?php echo esc_attr( $vars['ticket_description'] ); ?>
264
- </textarea>
265
 
266
  <select id="select-ticket-description" class="sui-variables select-field">
267
 
259
  id="ticket-description"
260
  class="sui-form-control ticket-text"
261
  aria-labelledby="ticket-description-label"
262
+ ><?php echo wp_kses_post( $vars['ticket_description'] ); ?></textarea>
 
 
263
 
264
  <select id="select-ticket-description" class="sui-variables select-field">
265
 
addons/pro/mailchimp/class-forminator-addon-mailchimp-form-hooks.php CHANGED
@@ -488,6 +488,14 @@ class Forminator_Addon_Mailchimp_Form_Hooks extends Forminator_Addon_Form_Hooks_
488
  continue;
489
  }
490
  $merge_fields[ $item->tag ] = $submitted_data[ $element_id ];
 
 
 
 
 
 
 
 
491
  }
492
  }
493
  }
488
  continue;
489
  }
490
  $merge_fields[ $item->tag ] = $submitted_data[ $element_id ];
491
+ if ( in_array( $item->type, array( 'date', 'birthday' ), true ) ) {
492
+ $time = strtotime( $submitted_data[ $element_id ] );
493
+ if ( $time ) {
494
+ $format = 'birthday' === $item->type ? 'm/d' : 'm/d/Y';
495
+
496
+ $merge_fields[ $item->tag ] = date( $format, $time ); // phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
497
+ }
498
+ }
499
  }
500
  }
501
  }
addons/pro/slack/class-forminator-addon-slack.php CHANGED
@@ -429,21 +429,20 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
429
  $template = forminator_addon_slack_dir() . 'views/settings/wait-authorize.php';
430
  $template_success = forminator_addon_slack_dir() . 'views/settings/success-authorize.php';
431
  $template_error = forminator_addon_slack_dir() . 'views/settings/error-authorize.php';
432
-
433
- $buttons = array();
434
-
435
- $is_poll = true;
436
 
437
  $template_params = array(
438
- 'token' => $this->_token,
439
  'auth_url' => $this->get_auth_url(),
440
  );
441
 
442
  $has_errors = false;
443
 
444
- if ( $this->_token ) {
445
  $buttons['close'] = array(
446
- 'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), 'sui-button-ghost forminator-addon-close' ),
447
  );
448
  $is_poll = false;
449
 
@@ -500,6 +499,12 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
500
  $client_id = '';
501
  if ( isset( $settings_values ['client_id'] ) ) {
502
  $client_id = $settings_values ['client_id'];
 
 
 
 
 
 
503
  }
504
 
505
  /**
@@ -525,6 +530,12 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
525
  $client_secret = '';
526
  if ( isset( $settings_values ['client_secret'] ) ) {
527
  $client_secret = $settings_values ['client_secret'];
 
 
 
 
 
 
528
  }
529
 
530
  /**
@@ -550,6 +561,12 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
550
  $token = '';
551
  if ( isset( $settings_values ['token'] ) ) {
552
  $token = $settings_values ['token'];
 
 
 
 
 
 
553
  }
554
 
555
  /**
@@ -564,6 +581,20 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
564
  return $token;
565
  }
566
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
567
  /**
568
  * Register a page for redirect url of Slack auth
569
  *
429
  $template = forminator_addon_slack_dir() . 'views/settings/wait-authorize.php';
430
  $template_success = forminator_addon_slack_dir() . 'views/settings/success-authorize.php';
431
  $template_error = forminator_addon_slack_dir() . 'views/settings/error-authorize.php';
432
+ $buttons = array();
433
+ $token = $this->get_client_access_token();
434
+ $is_poll = true;
 
435
 
436
  $template_params = array(
437
+ 'token' => $token,
438
  'auth_url' => $this->get_auth_url(),
439
  );
440
 
441
  $has_errors = false;
442
 
443
+ if ( $token ) {
444
  $buttons['close'] = array(
445
+ 'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), 'forminator-addon-close forminator-integration-popup__close' ),
446
  );
447
  $is_poll = false;
448
 
499
  $client_id = '';
500
  if ( isset( $settings_values ['client_id'] ) ) {
501
  $client_id = $settings_values ['client_id'];
502
+ } else {
503
+ $settings = $this->get_slack_settings();
504
+
505
+ if ( isset( $settings['client_id'] ) ) {
506
+ $client_id = $settings['client_id'];
507
+ }
508
  }
509
 
510
  /**
530
  $client_secret = '';
531
  if ( isset( $settings_values ['client_secret'] ) ) {
532
  $client_secret = $settings_values ['client_secret'];
533
+ } else {
534
+ $settings = $this->get_slack_settings();
535
+
536
+ if ( isset( $settings['client_secret'] ) ) {
537
+ $client_secret = $settings['client_secret'];
538
+ }
539
  }
540
 
541
  /**
561
  $token = '';
562
  if ( isset( $settings_values ['token'] ) ) {
563
  $token = $settings_values ['token'];
564
+ } else {
565
+ $settings = $this->get_slack_settings();
566
+
567
+ if ( isset( $settings['token'] ) ) {
568
+ $token = $settings['token'];
569
+ }
570
  }
571
 
572
  /**
581
  return $token;
582
  }
583
 
584
+ /**
585
+ * Get slack settings while app is being connected
586
+ *
587
+ * @since 1.18 Slack Addon
588
+ *
589
+ * @return array
590
+ */
591
+ public function get_slack_settings() {
592
+ $settings = get_option( 'forminator_addon_slack_settings' );
593
+ $settings = array_shift( array_slice( $settings, 0, 1 ) );
594
+
595
+ return $settings;
596
+ }
597
+
598
  /**
599
  * Register a page for redirect url of Slack auth
600
  *
addons/pro/trello/class-forminator-addon-trello-form-hooks.php CHANGED
@@ -4,7 +4,6 @@
4
  * Class Forminator_Addon_Trello_Form_Hooks
5
  *
6
  * @since 1.0 Trello Addon
7
- *
8
  */
9
  class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
10
 
@@ -152,9 +151,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
152
  * @since 1.0 Trello Addon
153
  *
154
  * @param string $connection_id
155
- * @param array $submitted_data
156
- * @param array $connection_settings
157
- * @param array $form_entry_fields
158
  *
159
  * @return array `is_sent` true means its success send data to Trello, false otherwise
160
  */
@@ -164,9 +163,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
164
 
165
  $form_id = $this->form_id;
166
  $form_settings_instance = $this->form_settings_instance;
167
- $uploads = $this->get_uploads( $form_entry_fields );
168
 
169
- //check required fields
170
  try {
171
  $api = $this->addon->get_api();
172
  $args = array();
@@ -247,8 +246,15 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
247
  }
248
 
249
  if ( isset( $connection_settings['due_date'] ) && ! empty( $connection_settings['due_date'] ) ) {
250
- $due_date = forminator_addon_replace_custom_vars( $connection_settings['due_date'], $submitted_data, $this->custom_form, $form_entry_fields, false, $entry );
251
- $args['due'] = $due_date;
 
 
 
 
 
 
 
252
  }
253
 
254
  if ( isset( $connection_settings['position'] ) ) {
@@ -329,7 +335,6 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
329
 
330
  /**
331
  * Special Replacer `{all_fields}` to markdown with Trello Flavour
332
- *
333
  */
334
  private function all_fields_to_markdown() {
335
  $form_fields = $this->form_settings_instance->get_form_fields();
@@ -685,7 +690,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
685
  *
686
  * @param $addon_meta_data
687
  * @param $key
688
- * @param string $default
689
  *
690
  * @return string
691
  */
@@ -740,7 +745,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
740
  * @since 1.0 Trello Addon
741
  *
742
  * @param Forminator_Form_Entry_Model $entry_model
743
- * @param array $addon_meta_data
744
  *
745
  * @return bool
746
  */
@@ -828,7 +833,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
828
  }
829
  }
830
 
831
- //delete mode!
832
  return true;
833
 
834
  } catch ( Forminator_Addon_Trello_Exception $e ) {
@@ -914,7 +919,6 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
914
  * @param array $addon_meta_datum
915
  * @param int $form_id
916
  * @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance.
917
- *
918
  */
919
  do_action(
920
  'forminator_addon_trello_delete_card',
@@ -929,18 +933,17 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
929
 
930
  /**
931
  * Get uploads to be added as attachments
932
- *
933
  */
934
  private function get_uploads( $fields ) {
935
- $uploads = [];
936
 
937
- foreach( $fields as $i => $val ) {
938
  if ( 0 === stripos( $val['name'], 'upload-' ) ) {
939
  if ( ! empty( $val['value'] ) ) {
940
  $file_url = $val['value']['file']['file_url'];
941
 
942
  if ( is_array( $file_url ) ) {
943
- foreach( $file_url as $url ) {
944
  $uploads[] = $url;
945
  }
946
  } else {
@@ -955,13 +958,12 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
955
 
956
  /**
957
  * Add attachments to created card
958
- *
959
  */
960
  private function add_attachments( $api, $uploads ) {
961
  $card_id = $api->get_card_id();
962
 
963
  if ( ! empty( $uploads ) ) {
964
- foreach( $uploads as $upload ) {
965
  $api->add_attachment( $card_id, $upload );
966
  }
967
  }
4
  * Class Forminator_Addon_Trello_Form_Hooks
5
  *
6
  * @since 1.0 Trello Addon
 
7
  */
8
  class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
9
 
151
  * @since 1.0 Trello Addon
152
  *
153
  * @param string $connection_id
154
+ * @param array $submitted_data
155
+ * @param array $connection_settings
156
+ * @param array $form_entry_fields
157
  *
158
  * @return array `is_sent` true means its success send data to Trello, false otherwise
159
  */
163
 
164
  $form_id = $this->form_id;
165
  $form_settings_instance = $this->form_settings_instance;
166
+ $uploads = $this->get_uploads( $form_entry_fields );
167
 
168
+ // check required fields
169
  try {
170
  $api = $this->addon->get_api();
171
  $args = array();
246
  }
247
 
248
  if ( isset( $connection_settings['due_date'] ) && ! empty( $connection_settings['due_date'] ) ) {
249
+ $due_date = forminator_addon_replace_custom_vars( $connection_settings['due_date'], $submitted_data, $this->custom_form, $form_entry_fields, false, $entry );
250
+ if ( false !== strpos( $connection_settings['due_date'], '{' ) ) {
251
+ $date_field = str_replace( array( '{', '}' ), '', $connection_settings['due_date'] );
252
+ $date_field_index = array_search( $date_field, array_column( $form_entry_fields, 'name' ) );
253
+ $date_format = Forminator_Field::get_property( 'date_format', $form_entry_fields[ $date_field_index ]['field_array'] );
254
+ $due_date = forminator_reformat_date( $due_date, $date_format, 'F j Y' );
255
+ }
256
+
257
+ $args['due'] = $due_date;
258
  }
259
 
260
  if ( isset( $connection_settings['position'] ) ) {
335
 
336
  /**
337
  * Special Replacer `{all_fields}` to markdown with Trello Flavour
 
338
  */
339
  private function all_fields_to_markdown() {
340
  $form_fields = $this->form_settings_instance->get_form_fields();
690
  *
691
  * @param $addon_meta_data
692
  * @param $key
693
+ * @param string $default
694
  *
695
  * @return string
696
  */
745
  * @since 1.0 Trello Addon
746
  *
747
  * @param Forminator_Form_Entry_Model $entry_model
748
+ * @param array $addon_meta_data
749
  *
750
  * @return bool
751
  */
833
  }
834
  }
835
 
836
+ // delete mode!
837
  return true;
838
 
839
  } catch ( Forminator_Addon_Trello_Exception $e ) {
919
  * @param array $addon_meta_datum
920
  * @param int $form_id
921
  * @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance.
 
922
  */
923
  do_action(
924
  'forminator_addon_trello_delete_card',
933
 
934
  /**
935
  * Get uploads to be added as attachments
 
936
  */
937
  private function get_uploads( $fields ) {
938
+ $uploads = array();
939
 
940
+ foreach ( $fields as $i => $val ) {
941
  if ( 0 === stripos( $val['name'], 'upload-' ) ) {
942
  if ( ! empty( $val['value'] ) ) {
943
  $file_url = $val['value']['file']['file_url'];
944
 
945
  if ( is_array( $file_url ) ) {
946
+ foreach ( $file_url as $url ) {
947
  $uploads[] = $url;
948
  }
949
  } else {
958
 
959
  /**
960
  * Add attachments to created card
 
961
  */
962
  private function add_attachments( $api, $uploads ) {
963
  $card_id = $api->get_card_id();
964
 
965
  if ( ! empty( $uploads ) ) {
966
+ foreach ( $uploads as $upload ) {
967
  $api->add_attachment( $card_id, $upload );
968
  }
969
  }
addons/pro/webhook/assets/icons/webhook.png ADDED
Binary file
addons/pro/webhook/assets/icons/webhook@2x.png ADDED
Binary file
addons/pro/webhook/assets/img/banner.png ADDED
Binary file
addons/pro/webhook/assets/img/banner@2x.png ADDED
Binary file
addons/pro/webhook/assets/img/webhook.png ADDED
Binary file
addons/pro/webhook/assets/img/webhook@2x.png ADDED
Binary file
addons/pro/webhook/class-forminator-addon-webhook-exception.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Exception
5
+ * Not Required but encouraged
6
+ */
7
+ class Forminator_Addon_Webhook_Exception extends Exception {
8
+
9
+ }
addons/pro/webhook/class-forminator-addon-webhook-form-hooks.php ADDED
@@ -0,0 +1,573 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Form_Hooks
5
+ *
6
+ */
7
+ class Forminator_Addon_Webhook_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
8
+
9
+ /**
10
+ * Addon instance are auto available form abstract
11
+ * Its added here for development purpose,
12
+ * Autocomplete will resolve addon directly to `Webhook` instance instead of the abstract
13
+ * And its public properties can be exposed
14
+ *
15
+ * @var Forminator_Addon_Webhook
16
+ */
17
+ protected $addon;
18
+
19
+ /**
20
+ * Form Settings Instance
21
+ *
22
+ * @var Forminator_Addon_Webhook_Form_Settings | null
23
+ */
24
+ protected $form_settings_instance;
25
+
26
+ /**
27
+ * Forminator_Addon_Webhook_Form_Hooks constructor.
28
+ *
29
+ * @param Forminator_Addon_Abstract $addon
30
+ * @param $form_id
31
+ *
32
+ * @throws Forminator_Addon_Exception
33
+ */
34
+ public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
35
+ parent::__construct( $addon, $form_id );
36
+ $this->_submit_form_error_message = __( 'Webhook failed to process submitted data. Please check your form and try again', 'forminator' );
37
+ }
38
+
39
+
40
+ /**
41
+ * Save status of request sent and received for each connected zap(s)
42
+ *
43
+ * @since 1.7 Add $form_entry_fields
44
+ *
45
+ * @param array $submitted_data
46
+ * @param array $form_entry_fields
47
+ *
48
+ * @return array
49
+ */
50
+ public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
51
+
52
+ $form_id = $this->form_id;
53
+ $form_settings_instance = $this->form_settings_instance;
54
+
55
+ /**
56
+ * Filterwebhook submitted form data to be processed
57
+ *
58
+ * @since 1.1
59
+ *
60
+ * @param array $submitted_data
61
+ * @param int $form_id current Form ID.
62
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Addon Form Settings instance.
63
+ */
64
+ $submitted_data = apply_filters_deprecated(
65
+ 'forminator_addon_zapier_form_submitted_data',
66
+ array( $submitted_data, $form_id, $form_settings_instance ),
67
+ '1.18.0',
68
+ 'forminator_addon_webhook_form_submitted_data'
69
+ );
70
+ $submitted_data = apply_filters(
71
+ 'forminator_addon_webhook_form_submitted_data',
72
+ $submitted_data,
73
+ $form_id,
74
+ $form_settings_instance
75
+ );
76
+
77
+ forminator_addon_maybe_log( __METHOD__, $submitted_data );
78
+
79
+ $addon_setting_values = $form_settings_instance->get_form_settings_values();
80
+ $form_settings = $form_settings_instance->get_form_settings();
81
+
82
+ $data = array();
83
+
84
+ /**
85
+ * Fires before sending data to Webhook URL(s)
86
+ *
87
+ * @since 1.1
88
+ *
89
+ * @param int $form_id current Form ID.
90
+ * @param array $submitted_data
91
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Addon Form Settings instance.
92
+ */
93
+ do_action_deprecated( 'forminator_addon_zapier_before_post_to_webhook', array( $form_id, $submitted_data, $form_settings_instance ), '1.18.0', 'forminator_addon_webhook_before_post_to_webhook' );
94
+ do_action( 'forminator_addon_webhook_before_post_to_webhook', $form_id, $submitted_data, $form_settings_instance );
95
+
96
+ foreach ( $addon_setting_values as $key => $addon_setting_value ) {
97
+ // save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data towebhook.
98
+ $data[] = array(
99
+ 'name' => 'status-' . $key,
100
+ 'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $form_settings, $form_entry_fields ),
101
+ );
102
+ }
103
+
104
+ $entry_fields = $data;
105
+ /**
106
+ * Filterwebhook entry fields to be saved to entry model
107
+ *
108
+ * @since 1.1
109
+ *
110
+ * @param array $entry_fields
111
+ * @param int $form_id current Form ID.
112
+ * @param array $submitted_data
113
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
114
+ */
115
+ $data = apply_filters_deprecated(
116
+ 'forminator_addon_zapier_entry_fields',
117
+ array( $entry_fields, $form_id, $submitted_data, $form_settings_instance ),
118
+ '1.18.0',
119
+ 'forminator_addon_webhook_entry_fields'
120
+ );
121
+ $data = apply_filters(
122
+ 'forminator_addon_webhook_entry_fields',
123
+ $data,
124
+ $form_id,
125
+ $submitted_data,
126
+ $form_settings_instance
127
+ );
128
+
129
+ return $data;
130
+
131
+ }
132
+
133
+ /**
134
+ * Get status on sending data towebhook
135
+ *
136
+ * @since 1.7 Add $form_entry_fields arg
137
+ *
138
+ * @param $connection_id
139
+ * @param $submitted_data
140
+ * @param $connection_settings
141
+ * @param $form_settings
142
+ * @param array $form_entry_fields
143
+ *
144
+ * @return array `is_sent` true means its success send data towebhook, false otherwise
145
+ */
146
+ private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $form_settings, $form_entry_fields ) {
147
+ // initialize as null.
148
+ $webhook_api = null;
149
+
150
+ $form_id = $this->form_id;
151
+ $form_settings_instance = $this->form_settings_instance;
152
+
153
+ //check required fields
154
+ try {
155
+ if ( ! isset( $connection_settings['webhook_url'] ) ) {
156
+ throw new Forminator_Addon_Webhook_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
157
+ }
158
+
159
+ $endpoint = $connection_settings['webhook_url'];
160
+ /**
161
+ * Filter Endpoint Webhook URL to send
162
+ *
163
+ * @since 1.1
164
+ *
165
+ * @param string $endpoint
166
+ * @param int $form_id current Form ID.
167
+ * @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
168
+ */
169
+ $endpoint = apply_filters_deprecated(
170
+ 'forminator_addon_zapier_endpoint',
171
+ array( $endpoint, $form_id, $connection_settings ),
172
+ '1.18.0',
173
+ 'forminator_addon_webhook_endpoint'
174
+ );
175
+ $endpoint = apply_filters(
176
+ 'forminator_addon_webhook_endpoint',
177
+ $endpoint,
178
+ $form_id,
179
+ $connection_settings
180
+ );
181
+
182
+ $webhook_api = $this->addon->get_api( $endpoint );
183
+
184
+ $args = $submitted_data;
185
+
186
+ $args['form-title'] = $form_settings['formName'];
187
+ $args['entry-time'] = current_time( 'Y-m-d H:i:s' );
188
+
189
+ /**
190
+ * Filter arguments to passed on to Webhook API
191
+ *
192
+ * @since 1.1
193
+ *
194
+ * @param array $args
195
+ * @param int $form_id Current Form id.
196
+ * @param string $connection_id ID of current connection.
197
+ * @param array $submitted_data
198
+ * @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
199
+ * @param array $form_settings Displayed Form settings.
200
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
201
+ */
202
+ $args = apply_filters_deprecated(
203
+ 'forminator_addon_zapier_post_to_webhook_args',
204
+ array( $args, $form_id, $connection_id, $submitted_data, $connection_settings, $form_settings, $form_settings_instance ),
205
+ '1.18.0',
206
+ 'forminator_addon_webhook_post_to_webhook_args'
207
+ );
208
+ $args = apply_filters(
209
+ 'forminator_addon_webhook_post_to_webhook_args',
210
+ $args,
211
+ $form_id,
212
+ $connection_id,
213
+ $submitted_data,
214
+ $connection_settings,
215
+ $form_settings,
216
+ $form_settings_instance
217
+ );
218
+
219
+ // replace '-' to '_' in keys because some integrations don't support dashes like tray.io and workato.
220
+ // don't do it for zapier for backward compatibility.
221
+ $args = $form_settings_instance::replace_dashes_in_keys( $args, $endpoint );
222
+
223
+ $webhook_api->post_( $args );
224
+
225
+ forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
226
+
227
+ return array(
228
+ 'is_sent' => true,
229
+ 'connection_name' => $connection_settings['name'],
230
+ 'description' => __( 'Successfully send data to Webhook', 'forminator' ),
231
+ 'data_sent' => $webhook_api->get_last_data_sent(),
232
+ 'data_received' => $webhook_api->get_last_data_received(),
233
+ 'url_request' => $webhook_api->get_last_url_request(),
234
+ );
235
+
236
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
237
+ forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Webhook' );
238
+
239
+ return array(
240
+ 'is_sent' => false,
241
+ 'description' => $e->getMessage(),
242
+ 'connection_name' => $connection_settings['name'],
243
+ 'data_sent' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_sent() : array() ),
244
+ 'data_received' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_received() : array() ),
245
+ 'url_request' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_url_request() : '' ),
246
+ );
247
+ }
248
+ }
249
+
250
+ /**
251
+ * It wil add new row on entry table of submission page, with couple of subentries
252
+ * subentries included are defined in @see Forminator_Addon_Webhook_Form_Hooks::get_additional_entry_item()
253
+ *
254
+ * @param Forminator_Form_Entry_Model $entry_model
255
+ * @param $addon_meta_data
256
+ *
257
+ * @return array
258
+ */
259
+ public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
260
+
261
+ $form_id = $this->form_id;
262
+ $form_settings_instance = $this->form_settings_instance;
263
+
264
+ /**
265
+ *
266
+ * Filterwebhook metadata that previously saved on db to be processed
267
+ *
268
+ * @since 1.1
269
+ *
270
+ * @param array $addon_meta_data
271
+ * @param int $form_id current Form ID.
272
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
273
+ */
274
+ $addon_meta_data = apply_filters_deprecated(
275
+ 'forminator_addon_zapier_metadata',
276
+ array( $addon_meta_data, $form_id, $form_settings_instance ),
277
+ '1.18.0',
278
+ 'forminator_addon_webhook_metadata'
279
+ );
280
+ $addon_meta_data = apply_filters(
281
+ 'forminator_addon_webhook_metadata',
282
+ $addon_meta_data,
283
+ $form_id,
284
+ $form_settings_instance
285
+ );
286
+
287
+ $addon_meta_datas = $addon_meta_data;
288
+ if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
289
+ return array();
290
+ }
291
+
292
+ $addon_meta_data = $addon_meta_data[0];
293
+
294
+ // make sure its `status`, because we only add this.
295
+ // when its `status` then its single connection (backward compat on dev).
296
+ // when its status-$MULTI_ID its multiple connection its default behavior.
297
+ if ( 'status' !== $addon_meta_data['name'] ) {
298
+ if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
299
+ return $this->on_render_entry_multi_connection( $addon_meta_datas );
300
+ }
301
+
302
+ return array();
303
+ }
304
+
305
+ $additional_entry_item = $this->get_additional_entry_item( $addon_meta_data );
306
+ if ( empty( $additional_entry_item ) ) {
307
+ return array();
308
+ }
309
+
310
+ return array( $additional_entry_item );
311
+
312
+ }
313
+
314
+ /**
315
+ * Loop through addon meta data on multiple zap(s)
316
+ *
317
+ * @param $addon_meta_datas
318
+ *
319
+ * @return array
320
+ */
321
+ private function on_render_entry_multi_connection( $addon_meta_datas ) {
322
+ $additional_entry_item = array();
323
+ foreach ( $addon_meta_datas as $addon_meta_data ) {
324
+ $additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
325
+ }
326
+
327
+ return $additional_entry_item;
328
+
329
+ }
330
+
331
+ /**
332
+ * Format additional entry item as label and value arrays
333
+ *
334
+ * - Integration Name : its defined by user when they addingwebhook integration on their form
335
+ * - Sent To Webhook : will be Yes/No value, that indicates whether sending data towebhook was successful
336
+ * - Info : Text that are generated by addon when building and sending data towebhook @see Forminator_Addon_Webhook_Form_Hooks::add_entry_fields()
337
+ * - Below subentries will be added if full log enabled, @see Forminator_Addon_Webhook::is_show_full_log() @see FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG
338
+ * - API URL : URL that wes requested when sending data towebhook
339
+ * - Data sent to Webhook : json encoded body request that was sent
340
+ * - Data received from Webhook : json encoded body response that was received
341
+ *
342
+ * @param $addon_meta_data
343
+ *
344
+ * @return array
345
+ */
346
+ private function get_additional_entry_item( $addon_meta_data ) {
347
+
348
+ if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
349
+ return array();
350
+ }
351
+ $status = $addon_meta_data['value'];
352
+ $additional_entry_item = array(
353
+ 'label' => __( 'Webhook Integration', 'forminator' ),
354
+ 'value' => '',
355
+ );
356
+
357
+ $sub_entries = array();
358
+ if ( isset( $status['connection_name'] ) ) {
359
+ $sub_entries[] = array(
360
+ 'label' => __( 'Integration Name', 'forminator' ),
361
+ 'value' => $status['connection_name'],
362
+ );
363
+ }
364
+
365
+ if ( isset( $status['is_sent'] ) ) {
366
+ $is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
367
+ $sub_entries[] = array(
368
+ 'label' => __( 'Sent To Webhook', 'forminator' ),
369
+ 'value' => $is_sent,
370
+ );
371
+ }
372
+
373
+ if ( isset( $status['description'] ) ) {
374
+ $sub_entries[] = array(
375
+ 'label' => __( 'Info', 'forminator' ),
376
+ 'value' => $status['description'],
377
+ );
378
+ }
379
+
380
+ if ( Forminator_Addon_Webhook::is_show_full_log() ) {
381
+ // too long to be added on entry data enable this with `define('FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG', true)`.
382
+ if ( isset( $status['url_request'] ) ) {
383
+ $sub_entries[] = array(
384
+ 'label' => __( 'API URL', 'forminator' ),
385
+ 'value' => $status['url_request'],
386
+ );
387
+ }
388
+
389
+ if ( isset( $status['data_sent'] ) ) {
390
+ $sub_entries[] = array(
391
+ 'label' => __( 'Data sent to Webhook', 'forminator' ),
392
+ 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
393
+ );
394
+ }
395
+
396
+ if ( isset( $status['data_received'] ) ) {
397
+ $sub_entries[] = array(
398
+ 'label' => __( 'Data received from Webhook', 'forminator' ),
399
+ 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
400
+ );
401
+ }
402
+ }
403
+
404
+ $additional_entry_item['sub_entries'] = $sub_entries;
405
+
406
+ // return single array.
407
+ return $additional_entry_item;
408
+ }
409
+
410
+ /**
411
+ * Webhook will add a column on the title/header row
412
+ * its called `Webhook Info` which can be translated on forminator lang
413
+ *
414
+ * @return array
415
+ */
416
+ public function on_export_render_title_row() {
417
+
418
+ $export_headers = array(
419
+ 'info' => __( 'Webhook Info', 'forminator' ),
420
+ );
421
+
422
+ $form_id = $this->form_id;
423
+ $form_settings_instance = $this->form_settings_instance;
424
+
425
+ /**
426
+ * Filterwebhook headers on export file
427
+ *
428
+ * @since 1.1
429
+ *
430
+ * @param array $export_headers headers to be displayed on export file.
431
+ * @param int $form_id current Form ID.
432
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
433
+ */
434
+ $export_headers = apply_filters_deprecated(
435
+ 'forminator_addon_zapier_export_headers',
436
+ array( $export_headers, $form_id, $form_settings_instance ),
437
+ '1.18.0',
438
+ 'forminator_addon_webhook_export_headers'
439
+ );
440
+ $export_headers = apply_filters(
441
+ 'forminator_addon_webhook_export_headers',
442
+ $export_headers,
443
+ $form_id,
444
+ $form_settings_instance
445
+ );
446
+
447
+ return $export_headers;
448
+ }
449
+
450
+ /**
451
+ * Webhook will add a column that give user information whether sending data towebhook successfully or not
452
+ * It will only add one column even its multiple connection, every connection will be separated by comma
453
+ *
454
+ * @param Forminator_Form_Entry_Model $entry_model
455
+ * @param $addon_meta_data
456
+ *
457
+ * @return array
458
+ */
459
+ public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
460
+
461
+ $form_id = $this->form_id;
462
+ $form_settings_instance = $this->form_settings_instance;
463
+
464
+ /**
465
+ *
466
+ * Filterwebhook metadata that previously saved on db to be processed
467
+ *
468
+ * @since 1.1
469
+ *
470
+ * @param array $addon_meta_data
471
+ * @param int $form_id current Form ID.
472
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
473
+ */
474
+ $addon_meta_data = apply_filters_deprecated(
475
+ 'forminator_addon_zapier_metadata',
476
+ array( $addon_meta_data, $form_id, $form_settings_instance ),
477
+ '1.18.0',
478
+ 'forminator_addon_webhook_metadata'
479
+ );
480
+ $addon_meta_data = apply_filters(
481
+ 'forminator_addon_webhook_metadata',
482
+ $addon_meta_data,
483
+ $form_id,
484
+ $form_settings_instance
485
+ );
486
+
487
+ $export_columns = array(
488
+ 'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
489
+ );
490
+
491
+ /**
492
+ * Filterwebhook columns to be displayed on export submissions
493
+ *
494
+ * @since 1.1
495
+ *
496
+ * @param array $export_columns column to be exported.
497
+ * @param int $form_id current Form ID.
498
+ * @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
499
+ * @param array $addon_meta_data meta data saved by addon on entry fields.
500
+ * @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
501
+ */
502
+ $export_columns = apply_filters_deprecated(
503
+ 'forminator_addon_zapier_export_columns',
504
+ array( $export_columns, $form_id, $entry_model, $addon_meta_data, $form_settings_instance ),
505
+ '1.18.0',
506
+ 'forminator_addon_webhook_export_columns'
507
+ );
508
+ $export_columns = apply_filters(
509
+ 'forminator_addon_webhook_export_columns',
510
+ $export_columns,
511
+ $form_id,
512
+ $entry_model,
513
+ $addon_meta_data,
514
+ $form_settings_instance
515
+ );
516
+
517
+ return $export_columns;
518
+ }
519
+
520
+ /**
521
+ * Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
522
+ *
523
+ * @param $addon_meta_data
524
+ * @param $key
525
+ * @param string $default
526
+ *
527
+ * @return string
528
+ */
529
+ private function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
530
+ $addon_meta_datas = $addon_meta_data;
531
+ if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
532
+ return $default;
533
+ }
534
+
535
+ $addon_meta_data = $addon_meta_data[0];
536
+
537
+ // make sure its `status`, because we only add this.
538
+ if ( 'status' !== $addon_meta_data['name'] ) {
539
+ if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
540
+ $meta_data = array();
541
+ foreach ( $addon_meta_datas as $addon_meta_data ) {
542
+ // make it like single value so it will be processed like single meta data.
543
+ $addon_meta_data['name'] = 'status';
544
+
545
+ // add it on an array for next recursive process.
546
+ $meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
547
+ }
548
+
549
+ return implode( ', ', $meta_data );
550
+ }
551
+
552
+ return $default;
553
+
554
+ }
555
+
556
+ if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
557
+ return $default;
558
+ }
559
+ $status = $addon_meta_data['value'];
560
+ if ( isset( $status[ $key ] ) ) {
561
+ $connection_name = '';
562
+ if ( 'connection_name' !== $key ) {
563
+ if ( isset( $status['connection_name'] ) ) {
564
+ $connection_name = '[' . $status['connection_name'] . '] ';
565
+ }
566
+ }
567
+
568
+ return $connection_name . $status[ $key ];
569
+ }
570
+
571
+ return $default;
572
+ }
573
+ }
addons/pro/webhook/class-forminator-addon-webhook-form-settings-exception.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Form_Settings_Exception
5
+ * Wrapper of Form Settings Webhook Exception
6
+ *
7
+ *
8
+ */
9
+ class Forminator_Addon_Webhook_Form_Settings_Exception extends Forminator_Addon_Webhook_Exception {
10
+
11
+ /**
12
+ * Holder of input exceptions
13
+ *
14
+ *
15
+ * @var array
16
+ */
17
+ protected $input_exceptions = array();
18
+
19
+ /**
20
+ * Forminator_Addon_Webhook_Form_Settings_Exception constructor.
21
+ *
22
+ * Useful if input_id is needed for later.
23
+ * If no input_id needed, use @see Forminator_Addon_Webhook_Exception
24
+ *
25
+ *
26
+ *
27
+ * @param string $message
28
+ * @param string $input_id
29
+ */
30
+ public function __construct( $message = '', $input_id = '' ) {
31
+ parent::__construct( $message, 0 );
32
+ if ( ! empty( $input_id ) ) {
33
+ $this->add_input_exception( $message, $input_id );
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Set exception message for an input
39
+ *
40
+ *
41
+ *
42
+ * @param $message
43
+ * @param $input_id
44
+ */
45
+ public function add_input_exception( $message, $input_id ) {
46
+ $this->input_exceptions[ $input_id ] = $message;
47
+ }
48
+
49
+ /**
50
+ * Get all input exceptions
51
+ *
52
+ *
53
+ * @return array
54
+ */
55
+ public function get_input_exceptions() {
56
+ return $this->input_exceptions;
57
+ }
58
+
59
+ /**
60
+ * Check if there is input_exceptions_is_available
61
+ *
62
+ *
63
+ * @return bool
64
+ */
65
+ public function input_exceptions_is_available() {
66
+ return count( $this->input_exceptions ) > 0;
67
+ }
68
+ }
addons/pro/webhook/class-forminator-addon-webhook-form-settings.php ADDED
@@ -0,0 +1,468 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-form-settings-exception.php';
4
+
5
+ /**
6
+ * Class Forminator_Addon_Webhook_Form_Settings
7
+ * Handle how form settings displayed and saved
8
+ *
9
+ *
10
+ */
11
+ class Forminator_Addon_Webhook_Form_Settings extends Forminator_Addon_Form_Settings_Abstract {
12
+
13
+ /**
14
+ * @var Forminator_Addon_Webhook
15
+ *
16
+ */
17
+ protected $addon;
18
+
19
+ /**
20
+ * Forminator_Addon_Webhook_Form_Settings constructor.
21
+ *
22
+ *
23
+ *
24
+ * @param Forminator_Addon_Abstract $addon
25
+ * @param $form_id
26
+ *
27
+ * @throws Forminator_Addon_Exception
28
+ */
29
+ public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
30
+ parent::__construct( $addon, $form_id );
31
+
32
+ $this->_update_form_settings_error_message = __(
33
+ 'The update to your settings for this form failed, check the form input and try again.',
34
+ 'forminator'
35
+ );
36
+ }
37
+
38
+ /**
39
+ * Webhook Form Settings wizard
40
+ *
41
+ *
42
+ * @return array
43
+ */
44
+ public function form_settings_wizards() {
45
+ // numerical array steps.
46
+ return array(
47
+ // 0
48
+ array(
49
+ 'callback' => array( $this, 'setup_webhook_url' ),
50
+ 'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
51
+ ),
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Setup webhook url
57
+ *
58
+ *
59
+ *
60
+ * @param $submitted_data
61
+ *
62
+ * @return array
63
+ */
64
+ public function setup_webhook_url( $submitted_data ) {
65
+ $this->addon_form_settings = $this->get_form_settings_values();
66
+
67
+ $multi_id = $this->generate_multi_id();
68
+ if ( isset( $submitted_data['multi_id'] ) ) {
69
+ $multi_id = $submitted_data['multi_id'];
70
+ }
71
+
72
+ unset( $submitted_data['multi_id'] );
73
+
74
+ $is_submit = ! empty( $submitted_data );
75
+
76
+ $current_data = array(
77
+ 'webhook_url' => '',
78
+ 'name' => '',
79
+ );
80
+
81
+ if ( isset( $submitted_data['name'] ) ) {
82
+ $submitted_data['name'] = sanitize_text_field( $submitted_data['name'] );
83
+ }
84
+ forminator_addon_maybe_log( __METHOD__, $submitted_data );
85
+
86
+ $notification = array();
87
+
88
+ foreach ( $current_data as $key => $value ) {
89
+ if ( isset( $submitted_data[ $key ] ) ) {
90
+ $current_data[ $key ] = $submitted_data[ $key ];
91
+ } elseif ( isset( $this->addon_form_settings[ $multi_id ][ $key ] ) ) {
92
+ $current_data[ $key ] = $this->addon_form_settings[ $multi_id ][ $key ];
93
+ }
94
+ }
95
+
96
+ $error_message = '';
97
+ $input_error_messages = '';
98
+
99
+ try {
100
+ if ( $is_submit ) {
101
+ $input_exceptions = new Forminator_Addon_Webhook_Form_Settings_Exception();
102
+ if ( empty( $current_data['name'] ) ) {
103
+ $input_exceptions->add_input_exception( __( 'Please create a name for this Webhook integration', 'forminator' ), 'name' );
104
+ }
105
+
106
+ $this->validate_and_send_sample( $submitted_data, $input_exceptions );
107
+ $this->addon_form_settings = array_merge(
108
+ $this->addon_form_settings,
109
+ array(
110
+ $multi_id => array(
111
+ 'webhook_url' => $submitted_data['webhook_url'],
112
+ 'name' => $submitted_data['name'],
113
+ ),
114
+ )
115
+ );
116
+
117
+ $this->save_form_settings_values( $this->addon_form_settings );
118
+ $notification = array(
119
+ 'type' => 'success',
120
+ 'text' => '<strong>' . $this->addon->get_title() . ' [' . esc_html( $submitted_data['name'] ) . ']</strong> '
121
+ . __( 'Successfully connected and sent sample data to your Webhook' ),
122
+ );
123
+ }
124
+ } catch ( Forminator_Addon_Webhook_Form_Settings_Exception $e ) {
125
+ $input_error_messages = $e->get_input_exceptions();
126
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
127
+ $error_message = '<div role="alert" class="sui-notice sui-notice-red sui-active" style="display: block; text-align: left;" aria-live="assertive">';
128
+
129
+ $error_message .= '<div class="sui-notice-content">';
130
+
131
+ $error_message .= '<div class="sui-notice-message">';
132
+
133
+ $error_message .= '<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>';
134
+
135
+ $error_message .= '<p>' . $e->getMessage() . '</p>';
136
+
137
+ $error_message .= '</div>';
138
+
139
+ $error_message .= '</div>';
140
+
141
+ $error_message .= '</div>';
142
+ }
143
+
144
+ $buttons = array();
145
+ if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
146
+ $buttons['disconnect']['markup'] = Forminator_Addon_Webhook::get_button_markup(
147
+ esc_html__( 'Deactivate', 'forminator' ),
148
+ 'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
149
+ esc_html__( 'Deactivate Webhook from this Form.', 'forminator' )
150
+ );
151
+ }
152
+
153
+ $buttons['next']['markup'] = '<div class="sui-actions-right">' .
154
+ Forminator_Addon_Webhook::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
155
+ '</div>';
156
+
157
+ $help_message = esc_html__( 'Give your webhook integration a name and add the webhook URL.', 'forminator' );
158
+
159
+ return array(
160
+ 'html' => '<div class="forminator-integration-popup__header"><h3 class="sui-box-title sui-lg" id="dialogTitle2">' . __( 'Setup Webhook', 'forminator' ) . '</h3>
161
+ <p class="sui-description">' . $help_message . '</p>
162
+ ' . $error_message . '</div>
163
+ <form enctype="multipart/form-data">
164
+ <div class="sui-form-field ' . ( isset( $input_error_messages['name'] ) ? 'sui-form-field-error' : '' ) . '">
165
+ <label class="sui-label">' . esc_html__( 'Friendly Name', 'forminator' ) . '</label>
166
+ <div class="sui-control-with-icon">
167
+ <input type="text"
168
+ name="name"
169
+ placeholder="' . esc_attr__( 'Enter a friendly name E.g. Zapier to Gmail', 'forminator' ) . '"
170
+ value="' . esc_attr( $current_data['name'] ) . '"
171
+ class="sui-form-control"
172
+ />
173
+ <i class="sui-icon-web-globe-world" aria-hidden="true"></i>
174
+ </div>
175
+ ' . ( isset( $input_error_messages['name'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['name'] ) . '</span>' : '' ) . '
176
+ </div>
177
+ <div class="sui-form-field ' . ( isset( $input_error_messages['webhook_url'] ) ? 'sui-form-field-error' : '' ) . '">
178
+ <label class="sui-label">' . esc_html__( 'Webhook URL', 'forminator' ) . '</label>
179
+ <div class="sui-control-with-icon">
180
+ <input
181
+ type="text"
182
+ name="webhook_url"
183
+ placeholder="' . esc_attr__( 'Enter your webhook URL', 'forminator' ) . '"
184
+ value="' . esc_attr( $current_data['webhook_url'] ) . '"
185
+ class="sui-form-control" />
186
+ <i class="sui-icon-link" aria-hidden="true"></i>
187
+ </div>
188
+ ' . ( isset( $input_error_messages['webhook_url'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['webhook_url'] ) . '</span>' : '' ) . '
189
+ ' . ( forminator_is_show_addons_documentation_link() ?
190
+ '<div class="sui-description">' . sprintf(
191
+ /* translators: 1: article anchor start, 2: article anchor end. */
192
+ esc_html__( 'Check %1$sour documentation%2$s for more information on using webhook URLs for your preferred automation tools.', 'forminator' ),
193
+ '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
194
+ '</a>'
195
+ ) . '</div>' : '' ) .
196
+ '</div>
197
+ <input type="hidden" name="multi_id" value="' . esc_attr( $multi_id ) . '" />
198
+ </form>',
199
+ 'redirect' => false,
200
+ 'is_close' => ( $is_submit && empty( $error_message ) && empty( $input_error_messages ) ),
201
+ 'buttons' => $buttons,
202
+ 'has_errors' => ( ! empty( $error_message ) || ! empty( $input_error_messages ) ),
203
+ 'notification' => $notification,
204
+ );
205
+
206
+ }
207
+
208
+ /**
209
+ * Sending test sample towebhook URL
210
+ * Data sent will be used onwebhook to map fields on their zap action
211
+ *
212
+ *
213
+ *
214
+ * @param $submitted_data
215
+ * @param Forminator_Addon_Webhook_Form_Settings_Exception $current_input_exception
216
+ *
217
+ * @throws Forminator_Addon_Webhook_Form_Settings_Exception
218
+ * @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
219
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
220
+ */
221
+ private function validate_and_send_sample( $submitted_data, Forminator_Addon_Webhook_Form_Settings_Exception $current_input_exception ) {
222
+ $form_id = $this->form_id;
223
+ if ( ! isset( $submitted_data['webhook_url'] ) ) {
224
+ $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
225
+ throw $current_input_exception;
226
+ }
227
+
228
+ // must not be in silent mode.
229
+ if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
230
+ $current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url' );
231
+ throw $current_input_exception;
232
+ }
233
+
234
+ $endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
235
+ if ( false === $endpoint ) {
236
+ $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
237
+ throw $current_input_exception;
238
+ }
239
+
240
+ if ( $current_input_exception->input_exceptions_is_available() ) {
241
+ throw $current_input_exception;
242
+ }
243
+
244
+ $connection_settings = $submitted_data;
245
+ /**
246
+ * Filter Endpoint Webhook URL to send
247
+ *
248
+ * @since 1.1
249
+ *
250
+ * @param string $endpoint
251
+ * @param int $form_id current Form ID.
252
+ * @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
253
+ */
254
+ $endpoint = apply_filters_deprecated(
255
+ 'forminator_addon_zapier_endpoint',
256
+ array( $endpoint, $form_id, $connection_settings ),
257
+ '1.18.0',
258
+ 'forminator_addon_webhook_endpoint'
259
+ );
260
+ $endpoint = apply_filters(
261
+ 'forminator_addon_webhook_endpoint',
262
+ $endpoint,
263
+ $form_id,
264
+ $connection_settings
265
+ );
266
+
267
+ forminator_addon_maybe_log( __METHOD__, $endpoint );
268
+ $api = $this->addon->get_api( $endpoint );
269
+
270
+ // build form sample data.
271
+ $sample_data = $this->build_form_sample_data();
272
+ $sample_data = self::replace_dashes_in_keys( $sample_data, $endpoint );
273
+ $sample_data['is_test'] = true;
274
+
275
+ /**
276
+ * Filter sample data to send to Webhook URL
277
+ *
278
+ * It fires when user saved Webhook connection on Form Settings Page.
279
+ * Sample data contains `is_test` key with value `true`,
280
+ * this key indicating that it wont process trigger on Webhook.
281
+ *
282
+ * @since 1.1
283
+ *
284
+ * @param array $sample_data
285
+ * @param int $form_id current Form ID.
286
+ * @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
287
+ */
288
+ $sample_data = apply_filters_deprecated(
289
+ 'forminator_addon_zapier_sample_data',
290
+ array( $sample_data, $form_id, $submitted_data ),
291
+ '1.18.0',
292
+ 'forminator_addon_webhook_sample_data'
293
+ );
294
+ $sample_data = apply_filters(
295
+ 'forminator_addon_webhook_sample_data',
296
+ $sample_data,
297
+ $form_id,
298
+ $submitted_data
299
+ );
300
+
301
+ $api->post_( $sample_data );
302
+ }
303
+
304
+ /**
305
+ * Build seample data form current fields
306
+ *
307
+ *
308
+ *
309
+ * @return array
310
+ */
311
+ private function build_form_sample_data() {
312
+ $form_fields = $this->form_fields;
313
+
314
+ $sample_data = array();
315
+ foreach ( $form_fields as $form_field ) {
316
+ $sample_data[ $form_field['element_id'] ] = $form_field['field_label'];
317
+
318
+ if ( 'upload' === $form_field['type'] ) {
319
+
320
+ $sample_file_path = '/fake/path';
321
+ $upload_dir = wp_get_upload_dir();
322
+ if ( isset( $upload_dir['basedir'] ) ) {
323
+ $sample_file_path = $upload_dir['basedir'];
324
+ }
325
+
326
+ $sample_data[ $form_field['element_id'] ] = array(
327
+ 'name' => $form_field['field_label'],
328
+ 'type' => 'image/png',
329
+ 'size' => 0,
330
+ 'file_url' => get_home_url(),
331
+ 'file_path' => $sample_file_path,
332
+ );
333
+ }
334
+ }
335
+
336
+ //send form title, date
337
+ $sample_data['form-title'] = $this->form_settings['formName'];
338
+ $sample_data['entry-time'] = current_time( 'Y-m-d H:i:s' );
339
+
340
+ return $sample_data;
341
+ }
342
+
343
+ /**
344
+ * Check if setup webhook url is completed
345
+ *
346
+ *
347
+ *
348
+ * @param $submitted_data
349
+ *
350
+ * @return bool
351
+ */
352
+ public function setup_webhook_url_is_completed( $submitted_data ) {
353
+
354
+ $multi_id = '';
355
+ if ( isset( $submitted_data['multi_id'] ) ) {
356
+ $multi_id = $submitted_data['multi_id'];
357
+ }
358
+
359
+ if ( empty( $multi_id ) ) {
360
+ return false;
361
+ }
362
+
363
+ $name = $this->get_multi_id_form_settings_value( $multi_id, 'name', '' );
364
+ $name = trim( $name );
365
+ if ( empty( $name ) ) {
366
+ return false;
367
+ }
368
+ $webhook_url = $this->get_multi_id_form_settings_value( $multi_id, 'webhook_url', '' );
369
+ $webhook_url = trim( $webhook_url );
370
+ if ( empty( $webhook_url ) ) {
371
+ return false;
372
+ }
373
+
374
+ return true;
375
+ }
376
+
377
+ /**
378
+ * Find one active connection on current form
379
+ *
380
+ *
381
+ *
382
+ * @return bool|array false on no connection, or settings on available
383
+ */
384
+ public function find_one_active_connection() {
385
+ $addon_form_settings = $this->get_form_settings_values();
386
+
387
+ // backward compat old version.
388
+ if ( isset( $addon_form_settings['webhook_url'] ) ) {
389
+ // convert to multi id type.
390
+ $new_id = $this->generate_multi_id();
391
+ $addon_form_settings['name'] = $new_id;
392
+ $this->save_form_settings_values( array( $new_id => $addon_form_settings ) );
393
+
394
+ return $this->find_one_active_connection();
395
+ }
396
+
397
+ foreach ( $addon_form_settings as $multi_id => $addon_form_setting ) {
398
+ if ( true === $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
399
+ return $addon_form_setting;
400
+ }
401
+ }
402
+
403
+ return false;
404
+ }
405
+
406
+ /**
407
+ * Generate multi id for multiple connection
408
+ *
409
+ *
410
+ * @since 1.2 change method to non static
411
+ * @return string
412
+ */
413
+ public function generate_multi_id() {
414
+ return uniqid( 'webhook_', true );
415
+ }
416
+
417
+
418
+ /**
419
+ * Override how multi connection displayed
420
+ *
421
+ *
422
+ * @return array
423
+ */
424
+ public function get_multi_ids() {
425
+ $multi_ids = array();
426
+ foreach ( $this->get_form_settings_values() as $key => $value ) {
427
+ $multi_ids[] = array(
428
+ 'id' => $key,
429
+ // use name that was added by user on creating connection.
430
+ 'label' => isset( $value['name'] ) ? $value['name'] : $key,
431
+ );
432
+ }
433
+
434
+ return $multi_ids;
435
+ }
436
+
437
+ /**
438
+ * Disconnect a connection from current form
439
+ *
440
+ *
441
+ *
442
+ * @param array $submitted_data
443
+ */
444
+ public function disconnect_form( $submitted_data ) {
445
+ // only execute if multi_id provided on submitted data.
446
+ if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
447
+ $addon_form_settings = $this->get_form_settings_values();
448
+ unset( $addon_form_settings[ $submitted_data['multi_id'] ] );
449
+ $this->save_form_settings_values( $addon_form_settings );
450
+ }
451
+ }
452
+
453
+ /**
454
+ * Check if multi_id form settings values completed
455
+ *
456
+ * @param int $multi_id ID.
457
+ * @return bool
458
+ */
459
+ public function is_multi_form_settings_complete( $multi_id ) {
460
+ $data = array( 'multi_id' => $multi_id );
461
+
462
+ if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
463
+ return false;
464
+ }
465
+
466
+ return true;
467
+ }
468
+ }
addons/pro/webhook/class-forminator-addon-webhook-poll-hooks.php ADDED
@@ -0,0 +1,411 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Poll_Hooks
5
+ *
6
+ * @since 1.6.1
7
+ *
8
+ */
9
+ class Forminator_Addon_Webhook_Poll_Hooks extends Forminator_Addon_Poll_Hooks_Abstract {
10
+
11
+ /**
12
+ * Addon instance are auto available form abstract
13
+ * Its added here for development purpose,
14
+ * Auto-complete will resolve addon directly to `Webhook` instance instead of the abstract
15
+ * And its public properties can be exposed
16
+ *
17
+ * @since 1.6.1
18
+ * @var Forminator_Addon_Webhook
19
+ */
20
+ protected $addon;
21
+
22
+ /**
23
+ * Poll Settings Instance
24
+ *
25
+ * @since 1.6.1
26
+ * @var Forminator_Addon_Webhook_Poll_Settings | null
27
+ */
28
+ protected $poll_settings_instance;
29
+
30
+ /**
31
+ * Forminator_Addon_Webhook_Poll_Hooks constructor.
32
+ *
33
+ * @since 1.6.1
34
+ *
35
+ * @param Forminator_Addon_Abstract $addon
36
+ * @param $poll_id
37
+ *
38
+ * @throws Forminator_Addon_Exception
39
+ */
40
+ public function __construct( Forminator_Addon_Abstract $addon, $poll_id ) {
41
+ parent::__construct( $addon, $poll_id );
42
+ $this->_submit_poll_error_message = __( 'Webhook failed to process submitted data. Please check your form and try again', 'forminator' );
43
+ }
44
+
45
+ /**
46
+ * Save status of request sent and received for each connected zap(s)
47
+ *
48
+ * @since 1.6.1
49
+ *
50
+ * @param array $submitted_data
51
+ * @param array $current_entry_fields
52
+ *
53
+ * @return array
54
+ */
55
+ public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
56
+
57
+ $poll_id = $this->poll_id;
58
+ $poll_settings_instance = $this->poll_settings_instance;
59
+
60
+ /**
61
+ * Filterwebhook submitted form data to be processed
62
+ *
63
+ * @since 1.6.1
64
+ *
65
+ * @param array $submitted_data
66
+ * @param int $poll_id current Form ID.
67
+ * @param Forminator_Addon_Webhook_Form_Settings $poll_settings_instance Webhook Addon Form Settings instance.
68
+ */
69
+ $submitted_data = apply_filters_deprecated(
70
+ 'forminator_addon_zapier_poll_submitted_data',
71
+ array( $submitted_data, $poll_id, $poll_settings_instance ),
72
+ '1.18.0',
73
+ 'forminator_addon_webhook_poll_submitted_data'
74
+ );
75
+ $submitted_data = apply_filters(
76
+ 'forminator_addon_webhook_poll_submitted_data',
77
+ $submitted_data,
78
+ $poll_id,
79
+ $poll_settings_instance
80
+ );
81
+
82
+ forminator_addon_maybe_log( __METHOD__, $submitted_data );
83
+
84
+ $addon_setting_values = $poll_settings_instance->get_poll_settings_values();
85
+ $poll_settings = $poll_settings_instance->get_poll_settings();
86
+
87
+ $data = array();
88
+
89
+ /**
90
+ * Fires before sending data to Webhook URL(s)
91
+ *
92
+ * @since 1.6.1
93
+ *
94
+ * @param int $poll_id current Poll ID.
95
+ * @param array $submitted_data
96
+ * @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Addon Poll Settings instance.
97
+ */
98
+ do_action_deprecated( 'forminator_addon_zapier_poll_before_post_to_webhook', array( $poll_id, $submitted_data, $poll_settings_instance ), '1.18.0', 'forminator_addon_webhook_poll_before_post_to_webhook' );
99
+ do_action( 'forminator_addon_webhook_poll_before_post_to_webhook', $poll_id, $submitted_data, $poll_settings_instance );
100
+
101
+ foreach ( $addon_setting_values as $key => $addon_setting_value ) {
102
+ // save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data towebhook.
103
+ $data[] = array(
104
+ 'name' => 'status-' . $key,
105
+ 'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $poll_settings ),
106
+ );
107
+ }
108
+
109
+ $entry_fields = $data;
110
+ /**
111
+ * Filterwebhook entry fields to be saved to entry model
112
+ *
113
+ * @since 1.6.1
114
+ *
115
+ * @param array $entry_fields
116
+ * @param int $poll_id current Poll ID.
117
+ * @param array $submitted_data
118
+ * @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
119
+ */
120
+ $data = apply_filters_deprecated(
121
+ 'forminator_addon_zapier_poll_entry_fields',
122
+ array( $entry_fields, $poll_id, $submitted_data, $poll_settings_instance ),
123
+ '1.18.0',
124
+ 'forminator_addon_webhook_poll_entry_fields'
125
+ );
126
+ $data = apply_filters(
127
+ 'forminator_addon_webhook_poll_entry_fields',
128
+ $data,
129
+ $poll_id,
130
+ $submitted_data,
131
+ $poll_settings_instance
132
+ );
133
+
134
+ return $data;
135
+
136
+ }
137
+
138
+ /**
139
+ * Get status on sending data towebhook
140
+ *
141
+ * @since 1.6.1
142
+ *
143
+ * @param $connection_id
144
+ * @param $submitted_data
145
+ * @param $connection_settings
146
+ * @param $poll_settings
147
+ *
148
+ * @return array `is_sent` true means its success send data towebhook, false otherwise
149
+ */
150
+ private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $poll_settings ) {
151
+ // initialize as null.
152
+ $webhook_api = null;
153
+
154
+ $poll_id = $this->poll_id;
155
+ $poll_settings_instance = $this->poll_settings_instance;
156
+
157
+ //check required fields
158
+ try {
159
+ if ( ! isset( $connection_settings['webhook_url'] ) ) {
160
+ throw new Forminator_Addon_Webhook_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
161
+ }
162
+
163
+ $endpoint = $connection_settings['webhook_url'];
164
+ /**
165
+ * Filter Endpoint Webhook URL to send
166
+ *
167
+ * @since 1.6.1
168
+ *
169
+ * @param string $endpoint
170
+ * @param int $poll_id current Form ID.
171
+ * @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
172
+ */
173
+ $endpoint = apply_filters_deprecated(
174
+ 'forminator_addon_zapier_poll_endpoint',
175
+ array( $endpoint, $poll_id, $connection_settings ),
176
+ '1.18.0',
177
+ 'forminator_addon_webhook_poll_endpoint'
178
+ );
179
+ $endpoint = apply_filters(
180
+ 'forminator_addon_webhook_poll_endpoint',
181
+ $endpoint,
182
+ $poll_id,
183
+ $connection_settings
184
+ );
185
+
186
+ $webhook_api = $this->addon->get_api( $endpoint );
187
+
188
+ $args = array();
189
+ $args['poll-name'] = forminator_get_name_from_model( $this->poll );
190
+
191
+ $answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
192
+ $extra_field = isset( $submitted_data[ $this->poll_id . '-extra' ] ) ? $submitted_data[ $this->poll_id . '-extra' ] : '';
193
+ $fields_labels = $this->poll->pluck_fields_array( 'title', 'element_id', '1' );
194
+
195
+ $answer = isset( $fields_labels[ $answer_data ] ) ? $fields_labels[ $answer_data ] : $answer_data;
196
+ $extra = $extra_field;
197
+
198
+ $args['vote'] = $answer;
199
+ $args['vote-extra'] = $extra;
200
+ $args['results'] = array();
201
+
202
+ $fields_array = $this->poll->get_fields_as_array();
203
+ $map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
204
+
205
+ // append new answer.
206
+ if ( ! $this->poll->is_prevent_store() ) {
207
+ $answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
208
+
209
+ $entries = 0;
210
+ // exists on map entries.
211
+ if ( in_array( $answer_data, array_keys( $map_entries ), true ) ) {
212
+ $entries = $map_entries[ $answer_data ];
213
+ }
214
+
215
+ $entries ++;
216
+ $map_entries[ $answer_data ] = $entries;
217
+
218
+ }
219
+
220
+ $fields = $this->poll->get_fields();
221
+
222
+ if ( ! is_null( $fields ) ) {
223
+ foreach ( $fields as $field ) {
224
+ $label = addslashes( $field->title );
225
+
226
+ $slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
227
+ $entries = 0;
228
+ if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
229
+ $entries = $map_entries[ $slug ];
230
+ }
231
+ $args['results'][ $slug ] = array(
232
+ 'label' => $label,
233
+ 'votes' => $entries,
234
+ );
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Filter arguments to passed on to Webhook API
240
+ *
241
+ * @since 1.6.1
242
+ *
243
+ * @param array $args
244
+ * @param int $poll_id Current Poll id.
245
+ * @param string $connection_id ID of current connection.
246
+ * @param array $submitted_data
247
+ * @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
248
+ * @param array $poll_settings Displayed Poll settings.
249
+ * @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
250
+ */
251
+ $args = apply_filters_deprecated(
252
+ 'forminator_addon_zapier_poll_post_to_webhook_args',
253
+ array( $args, $poll_id, $connection_id, $submitted_data, $connection_settings, $poll_settings, $poll_settings_instance ),
254
+ '1.18.0',
255
+ 'forminator_addon_webhook_poll_post_to_webhook_args'
256
+ );
257
+ $args = apply_filters(
258
+ 'forminator_addon_webhook_poll_post_to_webhook_args',
259
+ $args,
260
+ $poll_id,
261
+ $connection_id,
262
+ $submitted_data,
263
+ $connection_settings,
264
+ $poll_settings,
265
+ $poll_settings_instance
266
+ );
267
+
268
+ // replace '-' to '_' in keys because some integrations don't support dashes like tray.io and workato.
269
+ // don't do it for zapier for backward compatibility.
270
+ $args = $poll_settings_instance::replace_dashes_in_keys( $args, $endpoint );
271
+
272
+ $webhook_api->post_( $args );
273
+
274
+ forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
275
+
276
+ return array(
277
+ 'is_sent' => true,
278
+ 'connection_name' => $connection_settings['name'],
279
+ 'description' => __( 'Successfully send data to Webhook', 'forminator' ),
280
+ 'data_sent' => $webhook_api->get_last_data_sent(),
281
+ 'data_received' => $webhook_api->get_last_data_received(),
282
+ 'url_request' => $webhook_api->get_last_url_request(),
283
+ );
284
+
285
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
286
+ forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Webhook' );
287
+
288
+ return array(
289
+ 'is_sent' => false,
290
+ 'description' => $e->getMessage(),
291
+ 'connection_name' => $connection_settings['name'],
292
+ 'data_sent' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_sent() : array() ),
293
+ 'data_received' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_received() : array() ),
294
+ 'url_request' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_url_request() : '' ),
295
+ );
296
+ }
297
+ }
298
+
299
+ /**
300
+ * Webhook will add a column on the title/header row
301
+ * its called `Webhook Info` which can be translated on forminator lang
302
+ *
303
+ * @since 1.6.1
304
+ * @return array
305
+ */
306
+ public function on_export_render_title_row() {
307
+
308
+ $export_headers = array(
309
+ 'info' => __( 'Webhook Info', 'forminator' ),
310
+ );
311
+
312
+ $poll_id = $this->poll_id;
313
+ $poll_settings_instance = $this->poll_settings_instance;
314
+
315
+ /**
316
+ * Filterwebhook headers on export file
317
+ *
318
+ * @since 1.6.1
319
+ *
320
+ * @param array $export_headers headers to be displayed on export file.
321
+ * @param int $poll_id current Form ID.
322
+ * @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
323
+ */
324
+ $export_headers = apply_filters_deprecated(
325
+ 'forminator_addon_zapier_poll_export_headers',
326
+ array( $export_headers, $poll_id, $poll_settings_instance ),
327
+ '1.18.0',
328
+ 'forminator_addon_webhook_poll_export_headers'
329
+ );
330
+ $export_headers = apply_filters(
331
+ 'forminator_addon_webhook_poll_export_headers',
332
+ $export_headers,
333
+ $poll_id,
334
+ $poll_settings_instance
335
+ );
336
+
337
+ return $export_headers;
338
+ }
339
+
340
+ /**
341
+ * Webhook will add a column that give user information whether sending data towebhook successfully or not
342
+ * It will only add one column even its multiple connection, every connection will be separated by comma
343
+ *
344
+ * @since 1.6.1
345
+ *
346
+ * @param Forminator_Form_Entry_Model $entry_model
347
+ * @param $addon_meta_data
348
+ *
349
+ * @return array
350
+ */
351
+ public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
352
+
353
+ $poll_id = $this->poll_id;
354
+ $poll_settings_instance = $this->poll_settings_instance;
355
+
356
+ /**
357
+ *
358
+ * Filterwebhook metadata that previously saved on db to be processed
359
+ *
360
+ * @since 1.1
361
+ *
362
+ * @param array $addon_meta_data
363
+ * @param int $poll_id current Poll ID.
364
+ * @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
365
+ */
366
+ $addon_meta_data = apply_filters_deprecated(
367
+ 'forminator_addon_zapier_poll_metadata',
368
+ array( $addon_meta_data, $poll_id, $poll_settings_instance ),
369
+ '1.18.0',
370
+ 'forminator_addon_webhook_poll_metadata'
371
+ );
372
+ $addon_meta_data = apply_filters(
373
+ 'forminator_addon_webhook_poll_metadata',
374
+ $addon_meta_data,
375
+ $poll_id,
376
+ $poll_settings_instance
377
+ );
378
+
379
+ $export_columns = array(
380
+ 'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
381
+ );
382
+
383
+ /**
384
+ * Filterwebhook columns to be displayed on export submissions
385
+ *
386
+ * @since 1.6.1
387
+ *
388
+ * @param array $export_columns column to be exported.
389
+ * @param int $poll_id current Poll ID.
390
+ * @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
391
+ * @param array $addon_meta_data meta data saved by addon on entry fields.
392
+ * @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
393
+ */
394
+ $export_columns = apply_filters_deprecated(
395
+ 'forminator_addon_zapier_poll_export_columns',
396
+ array( $export_columns, $poll_id, $entry_model, $addon_meta_data, $poll_settings_instance ),
397
+ '1.18.0',
398
+ 'forminator_addon_webhook_poll_export_columns'
399
+ );
400
+ $export_columns = apply_filters(
401
+ 'forminator_addon_webhook_poll_export_columns',
402
+ $export_columns,
403
+ $poll_id,
404
+ $entry_model,
405
+ $addon_meta_data,
406
+ $poll_settings_instance
407
+ );
408
+
409
+ return $export_columns;
410
+ }
411
+ }
addons/pro/webhook/class-forminator-addon-webhook-poll-settings-exception.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Poll_Settings_Exception
5
+ * Wrapper of Poll Settings Webhook Exception
6
+ *
7
+ * @since 1.6.1
8
+ */
9
+ class Forminator_Addon_Webhook_Poll_Settings_Exception extends Forminator_Addon_Webhook_Exception {
10
+
11
+ /**
12
+ * Holder of input exceptions
13
+ *
14
+ * @since 1.6.1
15
+ * @var array
16
+ */
17
+ protected $input_exceptions = array();
18
+
19
+ /**
20
+ * Forminator_Addon_Webhook_Poll_Settings_Exception constructor.
21
+ *
22
+ * Useful if input_id is needed for later.
23
+ * If no input_id needed, use @see Forminator_Addon_Webhook_Exception
24
+ *
25
+ * @since 1.6.1
26
+ *
27
+ * @param string $message
28
+ * @param string $input_id
29
+ */
30
+ public function __construct( $message = '', $input_id = '' ) {
31
+ parent::__construct( $message, 0 );
32
+ if ( ! empty( $input_id ) ) {
33
+ $this->add_input_exception( $message, $input_id );
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Set exception message for an input
39
+ *
40
+ * @since 1.6.1
41
+ *
42
+ * @param $message
43
+ * @param $input_id
44
+ */
45
+ public function add_input_exception( $message, $input_id ) {
46
+ $this->input_exceptions[ $input_id ] = $message;
47
+ }
48
+
49
+ /**
50
+ * Get all input exceptions
51
+ *
52
+ * @since 1.6.1
53
+ * @return array
54
+ */
55
+ public function get_input_exceptions() {
56
+ return $this->input_exceptions;
57
+ }
58
+
59
+ /**
60
+ * Check if there is input_exceptions_is_available
61
+ *
62
+ * @since 1.6.1
63
+ * @return bool
64
+ */
65
+ public function input_exceptions_is_available() {
66
+ return count( $this->input_exceptions ) > 0;
67
+ }
68
+ }
addons/pro/webhook/class-forminator-addon-webhook-poll-settings.php ADDED
@@ -0,0 +1,386 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-poll-settings-exception.php';
4
+
5
+ /**
6
+ * Class Forminator_Addon_Webhook_Poll_Settings
7
+ * Handle how poll settings displayed and saved
8
+ *
9
+ * @since 1.6.1
10
+ */
11
+ class Forminator_Addon_Webhook_Poll_Settings extends Forminator_Addon_Poll_Settings_Abstract {
12
+
13
+ /**
14
+ * @var Forminator_Addon_Webhook
15
+ *
16
+ */
17
+ protected $addon;
18
+
19
+ /**
20
+ * Forminator_Addon_Webhook_Form_Settings constructor.
21
+ *
22
+ *
23
+ *
24
+ * @param Forminator_Addon_Abstract $addon
25
+ * @param $form_id
26
+ *
27
+ * @throws Forminator_Addon_Exception
28
+ */
29
+ public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
30
+ parent::__construct( $addon, $form_id );
31
+
32
+ $this->_update_poll_settings_error_message = __(
33
+ 'The update to your settings for this poll failed, check the form input and try again.',
34
+ 'forminator'
35
+ );
36
+ }
37
+
38
+ /**
39
+ * Webhook Poll Settings wizard
40
+ *
41
+ * @since 1.6.1
42
+ * @return array
43
+ */
44
+ public function poll_settings_wizards() {
45
+ // numerical array steps.
46
+ return array(
47
+ // 0
48
+ array(
49
+ 'callback' => array( $this, 'setup_webhook_url' ),
50
+ 'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
51
+ ),
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Setup webhook url
57
+ *
58
+ *
59
+ *
60
+ * @param $submitted_data
61
+ *
62
+ * @return array
63
+ */
64
+ public function setup_webhook_url( $submitted_data ) {
65
+
66
+ $template = forminator_addon_webhook_dir() . 'views/poll-settings/setup-webhook.php';
67
+
68
+ if ( ! isset( $submitted_data['multi_id'] ) ) {
69
+ return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
70
+ }
71
+
72
+ $multi_id = $submitted_data['multi_id'];
73
+ unset( $submitted_data['multi_id'] );
74
+
75
+ $template_params = array(
76
+ 'name' => $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' ),
77
+ 'webhook_url' => $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' ),
78
+ 'multi_id' => $multi_id,
79
+ );
80
+
81
+ $is_submit = ! empty( $submitted_data );
82
+ $has_errors = false;
83
+ $is_close = false;
84
+ $notification = array();
85
+
86
+ if ( $is_submit ) {
87
+ $name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
88
+ $template_params['name'] = $name;
89
+
90
+ $webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
91
+ $template_params['webhook_url'] = $webhook_url;
92
+
93
+ try {
94
+ $input_exceptions = new Forminator_Addon_Webhook_Poll_Settings_Exception();
95
+
96
+ if ( empty( $name ) ) {
97
+ $input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
98
+ }
99
+
100
+ $this->validate_and_send_sample( $submitted_data, $input_exceptions );
101
+
102
+ if ( $input_exceptions->input_exceptions_is_available() ) {
103
+ throw $input_exceptions;
104
+ }
105
+
106
+ $time_added = $this->get_multi_id_poll_settings_value( $multi_id, 'time_added', time() );
107
+ $this->save_multi_id_poll_setting_values(
108
+ $multi_id,
109
+ array(
110
+ 'name' => $name,
111
+ 'webhook_url' => $webhook_url,
112
+ 'time_added' => $time_added,
113
+ )
114
+ );
115
+
116
+ $notification = array(
117
+ 'type' => 'success',
118
+ 'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your Webhook', 'forminator' ),
119
+ );
120
+ $is_close = true;
121
+
122
+ } catch ( Forminator_Addon_Webhook_Poll_Settings_Exception $e ) {
123
+ $template_params = array_merge( $template_params, $e->get_input_exceptions() );
124
+ $has_errors = true;
125
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
126
+ $template_params['error_message'] = $e->getMessage();
127
+ $has_errors = true;
128
+ }
129
+ }
130
+
131
+ $buttons = array();
132
+ if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
133
+ $buttons['disconnect']['markup'] = Forminator_Addon_Webhook::get_button_markup(
134
+ esc_html__( 'Deactivate', 'forminator' ),
135
+ 'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
136
+ esc_html__( 'Deactivate Webhook from this Poll.', 'forminator' )
137
+ );
138
+ }
139
+
140
+ $buttons['next']['markup'] = '<div class="sui-actions-right">' .
141
+ Forminator_Addon_Webhook::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
142
+ '</div>';
143
+
144
+ return array(
145
+ 'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
146
+ 'buttons' => $buttons,
147
+ 'redirect' => false,
148
+ 'has_errors' => $has_errors,
149
+ 'has_back' => false,
150
+ 'is_close' => $is_close,
151
+ 'notification' => $notification,
152
+ );
153
+
154
+ }
155
+
156
+
157
+ /**
158
+ * Sending test sample towebhook URL
159
+ * Data sent will be used onwebhook to map fields on their zap action
160
+ *
161
+ *
162
+ *
163
+ * @param $submitted_data
164
+ * @param Forminator_Addon_Webhook_Poll_Settings_Exception $current_input_exception
165
+ *
166
+ * @throws Forminator_Addon_Webhook_Poll_Settings_Exception
167
+ * @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
168
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
169
+ */
170
+ private function validate_and_send_sample( $submitted_data, Forminator_Addon_Webhook_Poll_Settings_Exception $current_input_exception ) {
171
+ $poll_id = $this->poll_id;
172
+ if ( ! isset( $submitted_data['webhook_url'] ) ) {
173
+ $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
174
+ throw $current_input_exception;
175
+ }
176
+
177
+ // must not be in silent mode.
178
+ if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
179
+ $current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
180
+ throw $current_input_exception;
181
+ }
182
+
183
+ $endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
184
+ if ( false === $endpoint ) {
185
+ $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
186
+ throw $current_input_exception;
187
+ }
188
+
189
+ if ( $current_input_exception->input_exceptions_is_available() ) {
190
+ throw $current_input_exception;
191
+ }
192
+
193
+ $connection_settings = $submitted_data;
194
+ /**
195
+ * Filter Endpoint Webhook URL to send
196
+ *
197
+ * @since 1.6.1
198
+ *
199
+ * @param string $endpoint
200
+ * @param int $poll_id current Form ID.
201
+ * @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
202
+ */
203
+ $endpoint = apply_filters_deprecated(
204
+ 'forminator_addon_zapier_poll_endpoint',
205
+ array( $endpoint, $poll_id, $connection_settings ),
206
+ '1.18.0',
207
+ 'forminator_addon_webhook_poll_endpoint'
208
+ );
209
+ $endpoint = apply_filters(
210
+ 'forminator_addon_webhook_poll_endpoint',
211
+ $endpoint,
212
+ $poll_id,
213
+ $connection_settings
214
+ );
215
+
216
+ forminator_addon_maybe_log( __METHOD__, $endpoint );
217
+ $api = $this->addon->get_api( $endpoint );
218
+
219
+ // build form sample data.
220
+ $sample_data = $this->build_form_sample_data();
221
+ $sample_data = self::replace_dashes_in_keys( $sample_data, $endpoint );
222
+ $sample_data['is_test'] = true;
223
+
224
+ /**
225
+ * Filter sample data to send to Webhook URL
226
+ *
227
+ * It fires when user saved Webhook connection on Form Settings Page.
228
+ * Sample data contains `is_test` key with value `true`,
229
+ * this key indicating that it wont process trigger on Webhook.
230
+ *
231
+ * @since 1.6.1
232
+ *
233
+ * @param array $sample_data
234
+ * @param int $poll_id current Form ID.
235
+ * @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
236
+ */
237
+ $sample_data = apply_filters_deprecated(
238
+ 'forminator_addon_zapier_poll_sample_data',
239
+ array( $sample_data, $poll_id, $submitted_data ),
240
+ '1.18.0',
241
+ 'forminator_addon_webhook_poll_sample_data'
242
+ );
243
+ $sample_data = apply_filters(
244
+ 'forminator_addon_webhook_poll_sample_data',
245
+ $sample_data,
246
+ $poll_id,
247
+ $submitted_data
248
+ );
249
+
250
+ $api->post_( $sample_data );
251
+ }
252
+
253
+ /**
254
+ * Build sample data form current fields
255
+ *
256
+ * @since 1.6.1
257
+ *
258
+ * @return array
259
+ */
260
+ private function build_form_sample_data() {
261
+ $sample = array();
262
+
263
+ $sample['poll-name'] = forminator_get_name_from_model( $this->poll );
264
+ $sample['vote'] = 'Vote';
265
+ $sample['vote-extra'] = 'Vote Extra';
266
+ $sample['results'] = array();
267
+
268
+ $fields_array = $this->poll->get_fields_as_array();
269
+ $map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
270
+ $fields = $this->poll->get_fields();
271
+
272
+ foreach ( $fields as $field ) {
273
+ $label = addslashes( $field->title );
274
+
275
+ $slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
276
+ $entries = 0;
277
+ if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
278
+ $entries = $map_entries[ $slug ];
279
+ }
280
+ $sample['results'][ $slug ] = array(
281
+ 'label' => $label,
282
+ 'votes' => $entries,
283
+ );
284
+ }
285
+
286
+ return $sample;
287
+ }
288
+
289
+ /**
290
+ * Check if setup webhook url is completed
291
+ *
292
+ * @since 1.6.1
293
+ *
294
+ * @param $submitted_data
295
+ *
296
+ * @return bool
297
+ */
298
+ public function setup_webhook_url_is_completed( $submitted_data ) {
299
+ $multi_id = '';
300
+ if ( isset( $submitted_data['multi_id'] ) ) {
301
+ $multi_id = $submitted_data['multi_id'];
302
+ }
303
+
304
+ if ( empty( $multi_id ) ) {
305
+ return false;
306
+ }
307
+
308
+ $name = $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' );
309
+ $name = trim( $name );
310
+ if ( empty( $name ) ) {
311
+ return false;
312
+ }
313
+ $webhook_url = $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' );
314
+ $webhook_url = trim( $webhook_url );
315
+ if ( empty( $webhook_url ) ) {
316
+ return false;
317
+ }
318
+
319
+ return true;
320
+ }
321
+
322
+ /**
323
+ * Generate multi id for multiple connection
324
+ *
325
+ * @since 1.6.1
326
+ * @return string
327
+ */
328
+ public function generate_multi_id() {
329
+ return uniqid( 'webhook_', true );
330
+ }
331
+
332
+
333
+ /**
334
+ * Override how multi connection displayed
335
+ *
336
+ * @since 1.6.1
337
+ * @return array
338
+ */
339
+ public function get_multi_ids() {
340
+ $multi_ids = array();
341
+ foreach ( $this->get_poll_settings_values() as $key => $value ) {
342
+ $multi_ids[] = array(
343
+ 'id' => $key,
344
+ // use name that was added by user on creating connection.
345
+ 'label' => isset( $value['name'] ) ? $value['name'] : $key,
346
+ );
347
+ }
348
+
349
+ return $multi_ids;
350
+ }
351
+
352
+ /**
353
+ * Disconnect a connection from current poll
354
+ *
355
+ * @since 1.6.1
356
+ *
357
+ * @param array $submitted_data
358
+ */
359
+ public function disconnect_form( $submitted_data ) {
360
+ // only execute if multi_id provided on submitted data.
361
+ if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
362
+ $addon_poll_settings = $this->get_poll_settings_values();
363
+ unset( $addon_poll_settings[ $submitted_data['multi_id'] ] );
364
+ $this->save_poll_settings_values( $addon_poll_settings );
365
+ }
366
+ }
367
+
368
+ /**
369
+ * Check if multi_id poll settings values completed
370
+ *
371
+ * @since 1.6.1
372
+ *
373
+ * @param $multi_id
374
+ *
375
+ * @return bool
376
+ */
377
+ public function is_multi_poll_settings_complete( $multi_id ) {
378
+ $data = array( 'multi_id' => $multi_id );
379
+
380
+ if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
381
+ return false;
382
+ }
383
+
384
+ return true;
385
+ }
386
+ }
addons/pro/webhook/class-forminator-addon-webhook-quiz-hooks.php ADDED
@@ -0,0 +1,619 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Quiz_Hooks
5
+ *
6
+ * @since 1.6.2
7
+ */
8
+ class Forminator_Addon_Webhook_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
9
+
10
+ /**
11
+ * Addon instance are auto available form abstract
12
+ * Its added here for development purpose,
13
+ * Auto-complete will resolve addon directly to `Webhook` instance instead of the abstract
14
+ * And its public properties can be exposed
15
+ *
16
+ * @since 1.6.2
17
+ * @var Forminator_Addon_Webhook
18
+ */
19
+ protected $addon;
20
+
21
+ /**
22
+ * Quiz Settings Instance
23
+ *
24
+ * @since 1.6.2
25
+ * @var Forminator_Addon_Webhook_Quiz_Settings | null
26
+ */
27
+ protected $quiz_settings_instance;
28
+
29
+ /**
30
+ * Forminator_Addon_Webhook_Quiz_Hooks constructor.
31
+ *
32
+ * @since 1.6.2
33
+ *
34
+ * @param Forminator_Addon_Abstract $addon
35
+ * @param $quiz_id
36
+ *
37
+ * @throws Forminator_Addon_Exception
38
+ */
39
+ public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
40
+ parent::__construct( $addon, $quiz_id );
41
+ $this->_submit_quiz_error_message = __( 'Webhook failed to process submitted data. Please check your form and try again', 'forminator' );
42
+ }
43
+
44
+ /**
45
+ * Save status of request sent and received for each connected zap(s)
46
+ *
47
+ * @since 1.6.2
48
+ *
49
+ * @param array $submitted_data
50
+ * @param array $current_entry_fields
51
+ *
52
+ * @return array
53
+ */
54
+ public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
55
+
56
+ $quiz_id = $this->quiz_id;
57
+ $quiz_settings_instance = $this->quiz_settings_instance;
58
+
59
+ /**
60
+ * Filterwebhook submitted form data to be processed
61
+ *
62
+ * @since 1.6.2
63
+ *
64
+ * @param array $submitted_data
65
+ * @param int $quiz_id current Form ID.
66
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Addon Quiz Settings instance.
67
+ */
68
+ $submitted_data = apply_filters_deprecated(
69
+ 'forminator_addon_zapier_quiz_submitted_data',
70
+ array( $submitted_data, $quiz_id, $quiz_settings_instance ),
71
+ '1.18.0',
72
+ 'forminator_addon_webhook_quiz_submitted_data'
73
+ );
74
+ $submitted_data = apply_filters(
75
+ 'forminator_addon_webhook_quiz_submitted_data',
76
+ $submitted_data,
77
+ $quiz_id,
78
+ $quiz_settings_instance
79
+ );
80
+
81
+ forminator_addon_maybe_log( __METHOD__, $submitted_data );
82
+
83
+ $addon_setting_values = $quiz_settings_instance->get_quiz_settings_values();
84
+ $quiz_settings = $quiz_settings_instance->get_quiz_settings();
85
+
86
+ $data = array();
87
+
88
+ /**
89
+ * Fires before sending data to Webhook URL(s)
90
+ *
91
+ * @since 1.6.2
92
+ *
93
+ * @param int $quiz_id current Quiz ID.
94
+ * @param array $submitted_data
95
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Addon Quiz Settings instance.
96
+ */
97
+ do_action_deprecated( 'forminator_addon_zapier_quiz_before_post_to_webhook', array( $quiz_id, $submitted_data, $quiz_settings_instance ), '1.18.0', 'forminator_addon_webhook_quiz_before_post_to_webhook' );
98
+ do_action( 'forminator_addon_webhook_quiz_before_post_to_webhook', $quiz_id, $submitted_data, $quiz_settings_instance );
99
+
100
+ foreach ( $addon_setting_values as $key => $addon_setting_value ) {
101
+ // save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data towebhook.
102
+ $data[] = array(
103
+ 'name' => 'status-' . $key,
104
+ 'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $quiz_settings, $current_entry_fields ),
105
+ );
106
+ }
107
+
108
+ $entry_fields = $data;
109
+ /**
110
+ * Filterwebhook entry fields to be saved to entry model
111
+ *
112
+ * @since 1.6.2
113
+ *
114
+ * @param array $entry_fields
115
+ * @param int $quiz_id current Quiz ID.
116
+ * @param array $submitted_data
117
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
118
+ */
119
+ $data = apply_filters_deprecated(
120
+ 'forminator_addon_zapier_quiz_entry_fields',
121
+ array( $entry_fields, $quiz_id, $submitted_data, $quiz_settings_instance ),
122
+ '1.18.0',
123
+ 'forminator_addon_webhook_quiz_entry_fields'
124
+ );
125
+ $data = apply_filters(
126
+ 'forminator_addon_webhook_quiz_entry_fields',
127
+ $data,
128
+ $quiz_id,
129
+ $submitted_data,
130
+ $quiz_settings_instance
131
+ );
132
+
133
+ return $data;
134
+
135
+ }
136
+
137
+ /**
138
+ * Get status on sending data towebhook
139
+ *
140
+ * @since 1.6.2
141
+ *
142
+ * @param $connection_id
143
+ * @param $submitted_data
144
+ * @param $connection_settings
145
+ * @param $quiz_settings
146
+ * @param $current_entry_fields
147
+ *
148
+ * @return array `is_sent` true means its success send data towebhook, false otherwise
149
+ */
150
+ private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $quiz_settings, $current_entry_fields ) {
151
+ // initialize as null.
152
+ $webhook_api = null;
153
+
154
+ $quiz_id = $this->quiz_id;
155
+ $quiz_settings_instance = $this->quiz_settings_instance;
156
+
157
+ // check required fields.
158
+ try {
159
+ if ( ! isset( $connection_settings['webhook_url'] ) ) {
160
+ throw new Forminator_Addon_Webhook_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
161
+ }
162
+
163
+ $endpoint = $connection_settings['webhook_url'];
164
+ /**
165
+ * Filter Endpoint Webhook URL to send
166
+ *
167
+ * @since 1.6.2
168
+ *
169
+ * @param string $endpoint
170
+ * @param int $quiz_id current Form ID.
171
+ * @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
172
+ */
173
+ $endpoint = apply_filters_deprecated(
174
+ 'forminator_addon_zapier_quiz_endpoint',
175
+ array( $endpoint, $quiz_id, $connection_settings ),
176
+ '1.18.0',
177
+ 'forminator_addon_webhook_quiz_endpoint'
178
+ );
179
+ $endpoint = apply_filters(
180
+ 'forminator_addon_webhook_quiz_endpoint',
181
+ $endpoint,
182
+ $quiz_id,
183
+ $connection_settings
184
+ );
185
+
186
+ $webhook_api = $this->addon->get_api( $endpoint );
187
+
188
+ $args = $this->build_post_data( $current_entry_fields, $submitted_data );
189
+ $args = $quiz_settings_instance::replace_dashes_in_keys( $args, $endpoint );
190
+
191
+ /**
192
+ * Filter arguments to passed on to Webhook API
193
+ *
194
+ * @since 1.6.2
195
+ *
196
+ * @param array $args
197
+ * @param int $quiz_id Current Quiz id.
198
+ * @param string $connection_id ID of current connection.
199
+ * @param array $submitted_data
200
+ * @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
201
+ * @param array $quiz_settings Displayed Quiz settings.
202
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
203
+ */
204
+ $args = apply_filters_deprecated(
205
+ 'forminator_addon_zapier_quiz_post_to_webhook_args',
206
+ array( $args, $quiz_id, $connection_id, $submitted_data, $connection_settings, $quiz_settings, $quiz_settings_instance ),
207
+ '1.18.0',
208
+ 'forminator_addon_webhook_quiz_post_to_webhook_args'
209
+ );
210
+ $args = apply_filters(
211
+ 'forminator_addon_webhook_quiz_post_to_webhook_args',
212
+ $args,
213
+ $quiz_id,
214
+ $connection_id,
215
+ $submitted_data,
216
+ $connection_settings,
217
+ $quiz_settings,
218
+ $quiz_settings_instance
219
+ );
220
+
221
+ // replace '-' to '_' in keys because some integrations don't support dashes like tray.io and workato.
222
+ // don't do it for zapier for backward compatibility.
223
+ $args = $quiz_settings_instance::replace_dashes_in_keys( $args, $endpoint );
224
+
225
+ $webhook_api->post_( $args );
226
+
227
+ forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
228
+
229
+ return array(
230
+ 'is_sent' => true,
231
+ 'connection_name' => $connection_settings['name'],
232
+ 'description' => __( 'Successfully send data to Webhook', 'forminator' ),
233
+ 'data_sent' => $webhook_api->get_last_data_sent(),
234
+ 'data_received' => $webhook_api->get_last_data_received(),
235
+ 'url_request' => $webhook_api->get_last_url_request(),
236
+ );
237
+
238
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
239
+ forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Webhook' );
240
+
241
+ return array(
242
+ 'is_sent' => false,
243
+ 'description' => $e->getMessage(),
244
+ 'connection_name' => $connection_settings['name'],
245
+ 'data_sent' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_sent() : array() ),
246
+ 'data_received' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_received() : array() ),
247
+ 'url_request' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_url_request() : '' ),
248
+ );
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Build sample data form current fields
254
+ *
255
+ * @since 1.6.2
256
+ *
257
+ * @param array $quiz_entry_fields
258
+ * @param array $submitted_data
259
+ *
260
+ * @return array
261
+ */
262
+ private function build_post_data( $quiz_entry_fields, $submitted_data ) {
263
+ $sample = array();
264
+
265
+ $sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
266
+
267
+ $answers = array();
268
+ $correct_answers = 0;
269
+ $total_answers = 0;
270
+ $nowrong_result = '';
271
+ $questions = $this->quiz->questions;
272
+
273
+ if ( is_array( $quiz_entry_fields ) && isset( $quiz_entry_fields[0] ) ) {
274
+ $quiz_entry = $quiz_entry_fields[0];
275
+ if ( isset( $quiz_entry['name'] ) && isset( $quiz_entry['value'] ) && 'entry' === $quiz_entry['name'] ) {
276
+ if ( is_array( $quiz_entry['value'] ) ) {
277
+
278
+ // KNOWLEDGE.
279
+ if ( 'knowledge' === $this->quiz->quiz_type ) {
280
+ foreach ( $quiz_entry['value'] as $key => $data ) {
281
+ $question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
282
+ // bit cleanup.
283
+ $question_id = str_replace( 'question-', '', $question_id );
284
+
285
+ $question = isset( $data['question'] ) ? $data['question'] : '';
286
+ $answer = isset( $data['answers'] ) ? $data['answers'] : '';
287
+ $is_correct = isset( $data['isCorrect'] ) ? $data['isCorrect'] : false;
288
+
289
+ $answers[ $question_id ] = array(
290
+ 'question' => $question,
291
+ 'answer' => $answer,
292
+ 'is_correct' => $is_correct,
293
+ );
294
+ if ( $is_correct ) {
295
+ $correct_answers ++;
296
+ }
297
+ $total_answers ++;
298
+ }
299
+ } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
300
+ if ( isset( $quiz_entry['value'][0] )
301
+ && is_array( $quiz_entry['value'][0] )
302
+ && isset( $quiz_entry['value'][0]['value'] )
303
+ && is_array( $quiz_entry['value'][0]['value'] ) ) {
304
+
305
+ $quiz_entry = $quiz_entry['value'][0]['value'];
306
+
307
+ $nowrong_result = ( isset( $quiz_entry['result'] ) && isset( $quiz_entry['result']['title'] ) ) ? $quiz_entry['result']['title'] : '';
308
+
309
+ $entry_questions = ( isset( $quiz_entry['answers'] ) && is_array( $quiz_entry['answers'] ) ) ? $quiz_entry['answers'] : array();
310
+
311
+ foreach ( $entry_questions as $key => $entry_question ) {
312
+ $question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
313
+ // bit cleanup.
314
+ $question_id = str_replace( 'question-', '', $question_id );
315
+
316
+ $question = isset( $entry_question['question'] ) ? $entry_question['question'] : '';
317
+ $answer = isset( $entry_question['answer'] ) ? $entry_question['answer'] : '';
318
+
319
+ $answers[ $question_id ] = array(
320
+ 'question' => $question,
321
+ 'answer' => $answer,
322
+ );
323
+ }
324
+ }
325
+ }
326
+ }
327
+ }
328
+ }
329
+
330
+ $sample['answers'] = $answers;
331
+ $result = array();
332
+
333
+ if ( 'knowledge' === $this->quiz->quiz_type ) {
334
+ $result['correct'] = $correct_answers;
335
+ $result['answers'] = $total_answers;
336
+
337
+ } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
338
+ $result['result'] = $nowrong_result;
339
+ }
340
+
341
+ $sample['result'] = $result;
342
+
343
+ $quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
344
+
345
+ // Use the following code block only when Leads is active.
346
+ if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
347
+ $addons_fields = $this->quiz_settings_instance->get_form_fields();
348
+ $quiz_submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
349
+
350
+ if ( ! empty( $quiz_submitted_data ) ) {
351
+ foreach ( $quiz_submitted_data as $s => $quiz_submitted ) {
352
+ $sample[ $s ] = $quiz_submitted;
353
+ }
354
+ }
355
+ }
356
+
357
+ return $sample;
358
+ }
359
+
360
+ /**
361
+ * Webhook will add a column on the title/header row
362
+ * its called `Webhook Info` which can be translated on forminator lang
363
+ *
364
+ * @since 1.6.2
365
+ * @return array
366
+ */
367
+ public function on_export_render_title_row() {
368
+
369
+ $export_headers = array(
370
+ 'info' => __( 'Webhook Info', 'forminator' ),
371
+ );
372
+
373
+ $quiz_id = $this->quiz_id;
374
+ $quiz_settings_instance = $this->quiz_settings_instance;
375
+
376
+ /**
377
+ * Filterwebhook headers on export file
378
+ *
379
+ * @since 1.6.2
380
+ *
381
+ * @param array $export_headers headers to be displayed on export file.
382
+ * @param int $quiz_id current Form ID.
383
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
384
+ */
385
+ $export_headers = apply_filters_deprecated(
386
+ 'forminator_addon_zapier_quiz_export_headers',
387
+ array( $export_headers, $quiz_id, $quiz_settings_instance ),
388
+ '1.18.0',
389
+ 'forminator_addon_webhook_quiz_export_headers'
390
+ );
391
+ $export_headers = apply_filters(
392
+ 'forminator_addon_webhook_quiz_export_headers',
393
+ $export_headers,
394
+ $quiz_id,
395
+ $quiz_settings_instance
396
+ );
397
+
398
+ return $export_headers;
399
+ }
400
+
401
+ /**
402
+ * Webhook will add a column that give user information whether sending data towebhook successfully or not
403
+ * It will only add one column even its multiple connection, every connection will be separated by comma
404
+ *
405
+ * @since 1.6.2
406
+ *
407
+ * @param Forminator_Form_Entry_Model $entry_model
408
+ * @param $addon_meta_data
409
+ *
410
+ * @return array
411
+ */
412
+ public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
413
+
414
+ $quiz_id = $this->quiz_id;
415
+ $quiz_settings_instance = $this->quiz_settings_instance;
416
+
417
+ /**
418
+ *
419
+ * Filterwebhook metadata that previously saved on db to be processed
420
+ *
421
+ * @since 1.1
422
+ *
423
+ * @param array $addon_meta_data
424
+ * @param int $quiz_id current Quiz ID.
425
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
426
+ */
427
+ $addon_meta_data = apply_filters_deprecated(
428
+ 'forminator_addon_zapier_quiz_metadata',
429
+ array( $addon_meta_data, $quiz_id, $quiz_settings_instance ),
430
+ '1.18.0',
431
+ 'forminator_addon_webhook_quiz_metadata'
432
+ );
433
+ $addon_meta_data = apply_filters(
434
+ 'forminator_addon_webhook_quiz_metadata',
435
+ $addon_meta_data,
436
+ $quiz_id,
437
+ $quiz_settings_instance
438
+ );
439
+
440
+ $export_columns = array(
441
+ 'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
442
+ );
443
+
444
+ /**
445
+ * Filterwebhook columns to be displayed on export submissions
446
+ *
447
+ * @since 1.6.2
448
+ *
449
+ * @param array $export_columns column to be exported.
450
+ * @param int $quiz_id current Quiz ID.
451
+ * @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
452
+ * @param array $addon_meta_data meta data saved by addon on entry fields.
453
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
454
+ */
455
+ $export_columns = apply_filters_deprecated(
456
+ 'forminator_addon_zapier_quiz_export_columns',
457
+ array( $export_columns, $quiz_id, $entry_model, $addon_meta_data, $quiz_settings_instance ),
458
+ '1.18.0',
459
+ 'forminator_addon_webhook_quiz_export_columns'
460
+ );
461
+ $export_columns = apply_filters(
462
+ 'forminator_addon_webhook_quiz_export_columns',
463
+ $export_columns,
464
+ $quiz_id,
465
+ $entry_model,
466
+ $addon_meta_data,
467
+ $quiz_settings_instance
468
+ );
469
+
470
+ return $export_columns;
471
+ }
472
+
473
+ /**
474
+ * It wil add new row on entry table of submission page, with couple of subentries
475
+ * subentries included are defined in @see Forminator_Addon_Webhook_Quiz_Hooks::get_additional_entry_item()
476
+ *
477
+ * @since 1.6.1
478
+ *
479
+ * @param Forminator_Form_Entry_Model $entry_model
480
+ * @param $addon_meta_data
481
+ *
482
+ * @return array
483
+ */
484
+ public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
485
+
486
+ $quiz_id = $this->quiz_id;
487
+ $quiz_settings_instance = $this->quiz_settings_instance;
488
+
489
+ /**
490
+ *
491
+ * Filter Webhook metadata that previously saved on db to be processed
492
+ *
493
+ * @since 1.6.2
494
+ *
495
+ * @param array $addon_meta_data
496
+ * @param int $quiz_id current Quiz ID.
497
+ * @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Addon Quiz Settings instance.
498
+ */
499
+ $addon_meta_data = apply_filters_deprecated(
500
+ 'forminator_addon_quiz_zapier_metadata',
501
+ array( $addon_meta_data, $quiz_id, $quiz_settings_instance ),
502
+ '1.18.0',
503
+ 'forminator_addon_quiz_webhook_metadata'
504
+ );
505
+ $addon_meta_data = apply_filters(
506
+ 'forminator_addon_quiz_webhook_metadata',
507
+ $addon_meta_data,
508
+ $quiz_id,
509
+ $quiz_settings_instance
510
+ );
511
+
512
+ $addon_meta_datas = $addon_meta_data;
513
+ if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
514
+ return array();
515
+ }
516
+
517
+ return $this->on_render_entry_multi_connection( $addon_meta_datas );
518
+
519
+ }
520
+
521
+ /**
522
+ * Loop through addon meta data on multiple Webhook setup(s)
523
+ *
524
+ * @since 1.6.1
525
+ *
526
+ * @param $addon_meta_datas
527
+ *
528
+ * @return array
529
+ */
530
+ private function on_render_entry_multi_connection( $addon_meta_datas ) {
531
+ $additional_entry_item = array();
532
+ foreach ( $addon_meta_datas as $addon_meta_data ) {
533
+ $additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
534
+ }
535
+
536
+ return $additional_entry_item;
537
+
538
+ }
539
+
540
+ /**
541
+ * Format additional entry item as label and value arrays
542
+ *
543
+ * - Integration Name : its defined by user when they adding Webhook integration on their quiz
544
+ * - Sent To Webhook : will be Yes/No value, that indicates whether sending data to Webhook API was successful
545
+ * - Info : Text that are generated by addon when building and sending data to Webhook @see Forminator_Addon_Webhook_Quiz_Hooks::add_entry_fields()
546
+ * - Below subentries will be added if full log enabled, @see Forminator_Addon_Webhook::is_show_full_log() @see FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG
547
+ * - API URL : URL that wes requested when sending data to Webhook
548
+ * - Data sent to Webhook : encoded body request that was sent
549
+ * - Data received from Webhook : json encoded body response that was received
550
+ *
551
+ * @param $addon_meta_data
552
+ *
553
+ * @since 1.6.1
554
+ * @return array
555
+ */
556
+ private function get_additional_entry_item( $addon_meta_data ) {
557
+
558
+ if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
559
+ return array();
560
+ }
561
+ $status = $addon_meta_data['value'];
562
+ $additional_entry_item = array(
563
+ 'label' => __( 'Webhook Integration', 'forminator' ),
564
+ 'value' => '',
565
+ );
566
+
567
+ $sub_entries = array();
568
+ if ( isset( $status['connection_name'] ) ) {
569
+ $sub_entries[] = array(
570
+ 'label' => __( 'Integration Name', 'forminator' ),
571
+ 'value' => $status['connection_name'],
572
+ );
573
+ }
574
+
575
+ if ( isset( $status['is_sent'] ) ) {
576
+ $is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
577
+ $sub_entries[] = array(
578
+ 'label' => __( 'Sent To Webhook', 'forminator' ),
579
+ 'value' => $is_sent,
580
+ );
581
+ }
582
+
583
+ if ( isset( $status['description'] ) ) {
584
+ $sub_entries[] = array(
585
+ 'label' => __( 'Info', 'forminator' ),
586
+ 'value' => $status['description'],
587
+ );
588
+ }
589
+
590
+ if ( Forminator_Addon_Webhook::is_show_full_log() ) {
591
+ // too long to be added on entry data enable this with `define('FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG', true)`.
592
+ if ( isset( $status['url_request'] ) ) {
593
+ $sub_entries[] = array(
594
+ 'label' => __( 'API URL', 'forminator' ),
595
+ 'value' => $status['url_request'],
596
+ );
597
+ }
598
+
599
+ if ( isset( $status['data_sent'] ) ) {
600
+ $sub_entries[] = array(
601
+ 'label' => __( 'Data sent to Webhook', 'forminator' ),
602
+ 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
603
+ );
604
+ }
605
+
606
+ if ( isset( $status['data_received'] ) ) {
607
+ $sub_entries[] = array(
608
+ 'label' => __( 'Data received from Webhook', 'forminator' ),
609
+ 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
610
+ );
611
+ }
612
+ }
613
+
614
+ $additional_entry_item['sub_entries'] = $sub_entries;
615
+
616
+ // return single array.
617
+ return $additional_entry_item;
618
+ }
619
+ }
addons/pro/webhook/class-forminator-addon-webhook-quiz-settings-exception.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Quiz_Settings_Exception
5
+ * Wrapper of Quiz Settings Webhook Exception
6
+ *
7
+ * @since 1.6.2
8
+ */
9
+ class Forminator_Addon_Webhook_Quiz_Settings_Exception extends Forminator_Addon_Webhook_Exception {
10
+
11
+ /**
12
+ * Holder of input exceptions
13
+ *
14
+ * @since 1.6.2
15
+ * @var array
16
+ */
17
+ protected $input_exceptions = array();
18
+
19
+ /**
20
+ * Forminator_Addon_Webhook_Quiz_Settings_Exception constructor.
21
+ *
22
+ * Useful if input_id is needed for later.
23
+ * If no input_id needed, use @see Forminator_Addon_Webhook_Exception
24
+ *
25
+ * @since 1.6.2
26
+ *
27
+ * @param string $message
28
+ * @param string $input_id
29
+ */
30
+ public function __construct( $message = '', $input_id = '' ) {
31
+ parent::__construct( $message, 0 );
32
+ if ( ! empty( $input_id ) ) {
33
+ $this->add_input_exception( $message, $input_id );
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Set exception message for an input
39
+ *
40
+ * @since 1.6.2
41
+ *
42
+ * @param $message
43
+ * @param $input_id
44
+ */
45
+ public function add_input_exception( $message, $input_id ) {
46
+ $this->input_exceptions[ $input_id ] = $message;
47
+ }
48
+
49
+ /**
50
+ * Get all input exceptions
51
+ *
52
+ * @since 1.6.2
53
+ * @return array
54
+ */
55
+ public function get_input_exceptions() {
56
+ return $this->input_exceptions;
57
+ }
58
+
59
+ /**
60
+ * Check if there is input_exceptions_is_available
61
+ *
62
+ * @since 1.6.2
63
+ * @return bool
64
+ */
65
+ public function input_exceptions_is_available() {
66
+ return count( $this->input_exceptions ) > 0;
67
+ }
68
+ }
addons/pro/webhook/class-forminator-addon-webhook-quiz-settings.php ADDED
@@ -0,0 +1,434 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-quiz-settings-exception.php';
4
+
5
+ /**
6
+ * Class Forminator_Addon_Webhook_Quiz_Settings
7
+ * Handle how quiz settings displayed and saved
8
+ *
9
+ * @since 1.6.2
10
+ */
11
+ class Forminator_Addon_Webhook_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
12
+
13
+ /**
14
+ * @var Forminator_Addon_Webhook
15
+ *
16
+ */
17
+ protected $addon;
18
+
19
+ /**
20
+ * Forminator_Addon_Webhook_Form_Settings constructor.
21
+ *
22
+ *
23
+ *
24
+ * @param Forminator_Addon_Abstract $addon
25
+ * @param $form_id
26
+ *
27
+ * @throws Forminator_Addon_Exception
28
+ */
29
+ public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
30
+ parent::__construct( $addon, $form_id );
31
+
32
+ $this->_update_quiz_settings_error_message = __(
33
+ 'The update to your settings for this quiz failed, check the form input and try again.',
34
+ 'forminator'
35
+ );
36
+ }
37
+
38
+ /**
39
+ * Webhook Quiz Settings wizard
40
+ *
41
+ * @since 1.6.2
42
+ * @return array
43
+ */
44
+ public function quiz_settings_wizards() {
45
+ // numerical array steps.
46
+ return array(
47
+ // 0
48
+ array(
49
+ 'callback' => array( $this, 'setup_webhook_url' ),
50
+ 'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
51
+ ),
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Setup webhook url
57
+ *
58
+ *
59
+ *
60
+ * @param $submitted_data
61
+ *
62
+ * @return array
63
+ */
64
+ public function setup_webhook_url( $submitted_data ) {
65
+
66
+ $template = forminator_addon_webhook_dir() . 'views/quiz-settings/setup-webhook.php';
67
+
68
+ if ( ! isset( $submitted_data['multi_id'] ) ) {
69
+ return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
70
+ }
71
+
72
+ $multi_id = $submitted_data['multi_id'];
73
+ unset( $submitted_data['multi_id'] );
74
+
75
+ $template_params = array(
76
+ 'name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' ),
77
+ 'webhook_url' => $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' ),
78
+ 'multi_id' => $multi_id,
79
+ );
80
+
81
+ $is_submit = ! empty( $submitted_data );
82
+ $has_errors = false;
83
+ $is_close = false;
84
+ $notification = array();
85
+
86
+ if ( $is_submit ) {
87
+ $name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
88
+ $template_params['name'] = $name;
89
+
90
+ $webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
91
+ $template_params['webhook_url'] = $webhook_url;
92
+
93
+ try {
94
+ $input_exceptions = new Forminator_Addon_Webhook_Quiz_Settings_Exception();
95
+
96
+ if ( empty( $name ) ) {
97
+ $input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
98
+ }
99
+
100
+ $this->validate_and_send_sample( $submitted_data, $input_exceptions );
101
+
102
+ if ( $input_exceptions->input_exceptions_is_available() ) {
103
+ throw $input_exceptions;
104
+ }
105
+
106
+ $time_added = $this->get_multi_id_quiz_settings_value( $multi_id, 'time_added', time() );
107
+ $this->save_multi_id_quiz_setting_values(
108
+ $multi_id,
109
+ array(
110
+ 'name' => $name,
111
+ 'webhook_url' => $webhook_url,
112
+ 'time_added' => $time_added,
113
+ )
114
+ );
115
+
116
+ $notification = array(
117
+ 'type' => 'success',
118
+ 'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your Webhook', 'forminator' ),
119
+ );
120
+ $is_close = true;
121
+
122
+ } catch ( Forminator_Addon_Webhook_Quiz_Settings_Exception $e ) {
123
+ $template_params = array_merge( $template_params, $e->get_input_exceptions() );
124
+ $has_errors = true;
125
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
126
+ $template_params['error_message'] = $e->getMessage();
127
+ $has_errors = true;
128
+ }
129
+ }
130
+
131
+ $buttons = array();
132
+ if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
133
+ $buttons['disconnect']['markup'] = Forminator_Addon_Webhook::get_button_markup(
134
+ esc_html__( 'Deactivate', 'forminator' ),
135
+ 'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
136
+ esc_html__( 'Deactivate Webhook from this Quiz.', 'forminator' )
137
+ );
138
+ }
139
+
140
+ $buttons['next']['markup'] = '<div class="sui-actions-right">' .
141
+ Forminator_Addon_Webhook::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
142
+ '</div>';
143
+
144
+ return array(
145
+ 'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
146
+ 'buttons' => $buttons,
147
+ 'redirect' => false,
148
+ 'has_errors' => $has_errors,
149
+ 'has_back' => false,
150
+ 'is_close' => $is_close,
151
+ 'notification' => $notification,
152
+ );
153
+
154
+ }
155
+
156
+
157
+ /**
158
+ * Sending test sample towebhook URL
159
+ * Data sent will be used onwebhook to map fields on their zap action
160
+ *
161
+ *
162
+ *
163
+ * @param $submitted_data
164
+ * @param Forminator_Addon_Webhook_Quiz_Settings_Exception $current_input_exception
165
+ *
166
+ * @throws Forminator_Addon_Webhook_Quiz_Settings_Exception
167
+ * @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
168
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
169
+ */
170
+ private function validate_and_send_sample( $submitted_data, Forminator_Addon_Webhook_Quiz_Settings_Exception $current_input_exception ) {
171
+ $quiz_id = $this->quiz_id;
172
+ if ( ! isset( $submitted_data['webhook_url'] ) ) {
173
+ $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
174
+ throw $current_input_exception;
175
+ }
176
+
177
+ // must not be in silent mode.
178
+ if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
179
+ $current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
180
+ throw $current_input_exception;
181
+ }
182
+
183
+ $endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
184
+ if ( false === $endpoint ) {
185
+ $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
186
+ throw $current_input_exception;
187
+ }
188
+
189
+ if ( $current_input_exception->input_exceptions_is_available() ) {
190
+ throw $current_input_exception;
191
+ }
192
+
193
+ $connection_settings = $submitted_data;
194
+ /**
195
+ * Filter Endpoint Webhook URL to send
196
+ *
197
+ * @since 1.6.2
198
+ *
199
+ * @param string $endpoint
200
+ * @param int $quiz_id current Form ID.
201
+ * @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
202
+ */
203
+ $endpoint = apply_filters_deprecated(
204
+ 'forminator_addon_zapier_quiz_endpoint',
205
+ array( $endpoint, $quiz_id, $connection_settings ),
206
+ '1.18.0',
207
+ 'forminator_addon_webhook_quiz_endpoint'
208
+ );
209
+ $endpoint = apply_filters(
210
+ 'forminator_addon_webhook_quiz_endpoint',
211
+ $endpoint,
212
+ $quiz_id,
213
+ $connection_settings
214
+ );
215
+
216
+ forminator_addon_maybe_log( __METHOD__, $endpoint );
217
+ $api = $this->addon->get_api( $endpoint );
218
+
219
+ // build form sample data.
220
+ $sample_data = $this->build_form_sample_data();
221
+ $sample_data = self::replace_dashes_in_keys( $sample_data, $endpoint );
222
+ $sample_data['is_test'] = true;
223
+
224
+ /**
225
+ * Filter sample data to send to Webhook URL
226
+ *
227
+ * It fires when user saved Webhook connection on Form Settings Page.
228
+ * Sample data contains `is_test` key with value `true`,
229
+ * this key indicating that it wont process trigger on Webhook.
230
+ *
231
+ * @since 1.6.2
232
+ *
233
+ * @param array $sample_data
234
+ * @param int $quiz_id current Form ID.
235
+ * @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
236
+ */
237
+ $sample_data = apply_filters_deprecated(
238
+ 'forminator_addon_zapier_quiz_sample_data',
239
+ array( $sample_data, $quiz_id, $submitted_data ),
240
+ '1.18.0',
241
+ 'forminator_addon_webhook_quiz_sample_data'
242
+ );
243
+ $sample_data = apply_filters(
244
+ 'forminator_addon_webhook_quiz_sample_data',
245
+ $sample_data,
246
+ $quiz_id,
247
+ $submitted_data
248
+ );
249
+
250
+ $api->post_( $sample_data );
251
+ }
252
+
253
+ /**
254
+ * Build sample data form current fields
255
+ *
256
+ * @since 1.6.2
257
+ *
258
+ * @return array
259
+ */
260
+ private function build_form_sample_data() {
261
+ $sample = array();
262
+
263
+ $sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
264
+ $answers = array();
265
+
266
+ $num_correct = 0;
267
+
268
+ $questions = $this->quiz->questions;
269
+
270
+ foreach ( $questions as $question ) {
271
+ $question_title = isset( $question['title'] ) ? $question['title'] : '';
272
+ $question_id = isset( $question['slug'] ) ? $question['slug'] : uniqid();
273
+
274
+ // bit cleanup.
275
+ $question_id = str_replace( 'question-', '', $question_id );
276
+ $answer_title = 'Sample Answer';
277
+
278
+ $answer = array(
279
+ 'question' => $question_title,
280
+ 'answer' => $answer_title,
281
+ );
282
+
283
+ if ( 'knowledge' === $this->quiz->quiz_type ) {
284
+ $answer['is_correct'] = wp_rand( 0, 1 ) ? true : false;
285
+
286
+ if ( $answer['is_correct'] ) {
287
+ $num_correct ++;
288
+ }
289
+ }
290
+
291
+ $answers[ $question_id ] = $answer;
292
+ }
293
+
294
+ $sample['answers'] = $answers;
295
+ $result = array();
296
+
297
+ if ( 'knowledge' === $this->quiz->quiz_type ) {
298
+ $result['correct'] = $num_correct;
299
+ $result['answers'] = count( $answers );
300
+
301
+ } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
302
+ $results = $this->quiz->results;
303
+ $random_result_key = array_rand( $results );
304
+ $result_title = ( ( isset( $results[ $random_result_key ] ) && isset( $results[ $random_result_key ]['title'] ) ) ? $results[ $random_result_key ]['title'] : '' );
305
+ $result['result'] = $result_title;
306
+ }
307
+
308
+ $sample['result'] = $result;
309
+
310
+ $form_fields = isset( $this->form_fields ) ? $this->form_fields : array();
311
+ if ( ! empty( $form_fields ) ) {
312
+ foreach ( $form_fields as $form_field ) {
313
+ $sample[ $form_field['element_id'] ] = $form_field['field_label'];
314
+
315
+ if ( 'upload' === $form_field['type'] ) {
316
+
317
+ $sample_file_path = '/fake/path';
318
+ $upload_dir = wp_get_upload_dir();
319
+ if ( isset( $upload_dir['basedir'] ) ) {
320
+ $sample_file_path = $upload_dir['basedir'];
321
+ }
322
+
323
+ $sample[ $form_field['element_id'] ] = array(
324
+ 'name' => $form_field['field_label'],
325
+ 'type' => 'image/png',
326
+ 'size' => 0,
327
+ 'file_url' => get_home_url(),
328
+ 'file_path' => $sample_file_path,
329
+ );
330
+ }
331
+ }
332
+ }
333
+
334
+ return $sample;
335
+ }
336
+
337
+ /**
338
+ * Check if setup webhook url is completed
339
+ *
340
+ * @since 1.6.2
341
+ *
342
+ * @param $submitted_data
343
+ *
344
+ * @return bool
345
+ */
346
+ public function setup_webhook_url_is_completed( $submitted_data ) {
347
+ $multi_id = '';
348
+ if ( isset( $submitted_data['multi_id'] ) ) {
349
+ $multi_id = $submitted_data['multi_id'];
350
+ }
351
+
352
+ if ( empty( $multi_id ) ) {
353
+ return false;
354
+ }
355
+
356
+ $name = $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' );
357
+ $name = trim( $name );
358
+ if ( empty( $name ) ) {
359
+ return false;
360
+ }
361
+ $webhook_url = $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' );
362
+ $webhook_url = trim( $webhook_url );
363
+ if ( empty( $webhook_url ) ) {
364
+ return false;
365
+ }
366
+
367
+ return true;
368
+ }
369
+
370
+ /**
371
+ * Generate multi id for multiple connection
372
+ *
373
+ * @since 1.6.2
374
+ * @return string
375
+ */
376
+ public function generate_multi_id() {
377
+ return uniqid( 'webhook_', true );
378
+ }
379
+
380
+
381
+ /**
382
+ * Override how multi connection displayed
383
+ *
384
+ * @since 1.6.2
385
+ * @return array
386
+ */
387
+ public function get_multi_ids() {
388
+ $multi_ids = array();
389
+ foreach ( $this->get_quiz_settings_values() as $key => $value ) {
390
+ $multi_ids[] = array(
391
+ 'id' => $key,
392
+ // use name that was added by user on creating connection.
393
+ 'label' => isset( $value['name'] ) ? $value['name'] : $key,
394
+ );
395
+ }
396
+
397
+ return $multi_ids;
398
+ }
399
+
400
+ /**
401
+ * Disconnect a connection from current quiz
402
+ *
403
+ * @since 1.6.2
404
+ *
405
+ * @param array $submitted_data
406
+ */
407
+ public function disconnect_form( $submitted_data ) {
408
+ // only execute if multi_id provided on submitted data.
409
+ if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
410
+ $addon_quiz_settings = $this->get_quiz_settings_values();
411
+ unset( $addon_quiz_settings[ $submitted_data['multi_id'] ] );
412
+ $this->save_quiz_settings_values( $addon_quiz_settings );
413
+ }
414
+ }
415
+
416
+ /**
417
+ * Check if multi_id quiz settings values completed
418
+ *
419
+ * @since 1.6.2
420
+ *
421
+ * @param $multi_id
422
+ *
423
+ * @return bool
424
+ */
425
+ public function is_multi_quiz_settings_complete( $multi_id ) {
426
+ $data = array( 'multi_id' => $multi_id );
427
+
428
+ if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
429
+ return false;
430
+ }
431
+
432
+ return true;
433
+ }
434
+ }
addons/pro/webhook/class-forminator-addon-webhook.php ADDED
@@ -0,0 +1,437 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-exception.php';
4
+ require_once dirname( __FILE__ ) . '/lib/class-forminator-addon-webhook-wp-api.php';
5
+
6
+ /**
7
+ * Class Forminator_Addon_Webhook
8
+ * Webhook Addon Main Class
9
+ *
10
+ *
11
+ */
12
+ final class Forminator_Addon_Webhook extends Forminator_Addon_Abstract {
13
+
14
+ /**
15
+ * @var self|null
16
+ */
17
+ private static $_instance = null;
18
+
19
+ protected $_slug = 'webhook';
20
+ protected $_version = FORMINATOR_ADDON_WEBHOOK_VERSION;
21
+ protected $_min_forminator_version = '1.1';
22
+ protected $_short_title = 'Webhook';
23
+ protected $_title = 'Webhook';
24
+ protected $_url = 'https://wpmudev.com';
25
+ protected $_full_path = __FILE__;
26
+ protected $_documentation = 'https://wpmudev.com/docs/wpmu-dev-plugins/forminator/#zapier';
27
+
28
+ protected $_form_settings = 'Forminator_Addon_Webhook_Form_Settings';
29
+ protected $_form_hooks = 'Forminator_Addon_Webhook_Form_Hooks';
30
+
31
+ protected $_poll_settings = 'Forminator_Addon_Webhook_Poll_Settings';
32
+ protected $_poll_hooks = 'Forminator_Addon_Webhook_Poll_Hooks';
33
+
34
+ protected $_quiz_settings = 'Forminator_Addon_Webhook_Quiz_Settings';
35
+ protected $_quiz_hooks = 'Forminator_Addon_Webhook_Quiz_Hooks';
36
+ protected $_position = 0;
37
+
38
+ /**
39
+ * Forminator_Addon_Webhook constructor.
40
+ *
41
+ *
42
+ */
43
+ public function __construct() {
44
+ // late init to allow translation.
45
+ $this->_description = __( 'Get awesome by your form.', 'forminator' );
46
+ $doc_description = forminator_is_show_addons_documentation_link() ?
47
+ sprintf(
48
+ /* translators: 1: article anchor start, 2: article anchor end. */
49
+ __( ' Check this %1$sarticle%2$s for tips and tricks on using webhooks integration and creating automated workflows.', 'forminator' ),
50
+ '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
51
+ '</a>'
52
+ ) : '';
53
+ $this->_promotion = sprintf(
54
+ /* translators: 1: Zapier link 2. Closing a tag 3. Integrately link 4. Tray.io link 5. Make.com link 6. Workato link 7. Additional text */
55
+ __( 'Connect Forminator with automation tools through webhook. You can use this to send submissions to automation apps like %1$sZapier%2$s, %3$sIntegrately%2$s, %4$sTray.io%2$s, %5$sMake%2$s, %6$sWorkato%2$s, and other automation tools that support webhooks. %7$s Happy automation!', 'forminator' ),
56
+ '<a href="https://zapier.com/" target="_blank">',
57
+ '</a>',
58
+ '<a href="https://integrately.com/" target="_blank">',
59
+ '<a href="https://tray.io/" target="_blank">',
60
+ '<a href="https://www.make.com/" target="_blank">',
61
+ '<a href="https://www.workato.com/" target="_blank">',
62
+ $doc_description
63
+ );
64
+
65
+ $this->_activation_error_message = __( 'Sorry but we failed to activate Webhook Integration, don\'t hesitate to contact us', 'forminator' );
66
+ $this->_deactivation_error_message = __( 'Sorry but we failed to deactivate Webhook Integration, please try again', 'forminator' );
67
+
68
+ $this->_update_settings_error_message = __(
69
+ 'Sorry, we failed to update settings, please check your form and try again',
70
+ 'forminator'
71
+ );
72
+
73
+ $this->_icon = forminator_addon_webhook_assets_url() . 'icons/webhook.png';
74
+ $this->_icon_x2 = forminator_addon_webhook_assets_url() . 'icons/webhook@2x.png';
75
+ $this->_image = forminator_addon_webhook_assets_url() . 'img/webhook.png';
76
+ $this->_image_x2 = forminator_addon_webhook_assets_url() . 'img/webhook@2x.png';
77
+ $this->_banner = forminator_addon_webhook_assets_url() . 'img/banner.png';
78
+ $this->_banner_x2 = forminator_addon_webhook_assets_url() . 'img/banner@2x.png';
79
+ }
80
+
81
+ /**
82
+ * Get Instance
83
+ *
84
+ *
85
+ * @return self|null
86
+ */
87
+ public static function get_instance() {
88
+ if ( is_null( self::$_instance ) ) {
89
+ self::$_instance = new self();
90
+ }
91
+
92
+ return self::$_instance;
93
+ }
94
+
95
+ /**
96
+ * Setting apier Addon
97
+ *
98
+ *
99
+ * @return array
100
+ */
101
+ public function settings_wizards() {
102
+ return array(
103
+ array(
104
+ 'callback' => array( $this, 'setup_connect' ),
105
+ 'is_completed' => array( $this, 'is_connected' ),
106
+ ),
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Activate Webhook
112
+ *
113
+ *
114
+ *
115
+ * @param $submitted_data
116
+ * @param int $form_id
117
+ *
118
+ * @return array
119
+ */
120
+ public function setup_connect( $submitted_data, $form_id = 0 ) {
121
+ $settings_values = $this->get_settings_values();
122
+
123
+ $template = forminator_addon_webhook_dir() . 'views/settings/setup-connect.php';
124
+ $template_success = forminator_addon_webhook_dir() . 'views/settings/setup-connect-success.php';
125
+
126
+ $template_params = array(
127
+ 'is_connected' => $this->is_connected(),
128
+ 'error_message' => '',
129
+ );
130
+
131
+ $has_errors = false;
132
+ $show_success = false;
133
+ $is_submit = ! empty( $submitted_data );
134
+
135
+ foreach ( $template_params as $key => $value ) {
136
+ if ( isset( $submitted_data[ $key ] ) ) {
137
+ $template_params[ $key ] = $submitted_data[ $key ];
138
+ } elseif ( isset( $settings_values[ $key ] ) ) {
139
+ $template_params[ $key ] = $settings_values[ $key ];
140
+ }
141
+ }
142
+
143
+ if ( $is_submit ) {
144
+ $connect = isset( $submitted_data['connect'] ) ? $submitted_data['connect'] : '';
145
+
146
+ try {
147
+ if ( empty( $connect ) ) {
148
+ throw new Forminator_Addon_Webhook_Exception( __( 'Please Connect Webhook', 'forminator' ) );
149
+ }
150
+
151
+ if ( ! forminator_addon_is_active( $this->_slug ) ) {
152
+ $activated = Forminator_Addon_Loader::get_instance()->activate_addon( $this->_slug );
153
+ if ( ! $activated ) {
154
+ throw new Forminator_Addon_Webhook_Exception( Forminator_Addon_Loader::get_instance()->get_last_error_message() );
155
+ }
156
+ }
157
+ // no form_id its on global settings.
158
+ if ( empty( $form_id ) ) {
159
+ $show_success = true;
160
+ }
161
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
162
+ $template_params['error_message'] = $e->getMessage();
163
+ $has_errors = true;
164
+ }
165
+ }
166
+
167
+ if ( $show_success ) {
168
+ $template = $template_success;
169
+ }
170
+
171
+ $buttons = array();
172
+
173
+ if ( $show_success ) {
174
+ $buttons['close'] = array(
175
+ 'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), 'sui-button-ghost forminator-addon-close forminator-integration-popup__close' ),
176
+ );
177
+ } else {
178
+ if ( $this->is_connected() ) {
179
+ $buttons['disconnect'] = array(
180
+ 'markup' => self::get_button_markup( esc_html__( 'Disconnect', 'forminator' ), 'sui-button-ghost forminator-addon-disconnect forminator-integration-popup__close' ),
181
+ );
182
+ } else {
183
+ $buttons['submit'] = array(
184
+ 'markup' => self::get_button_markup( esc_html__( 'Activate', 'forminator' ), 'forminator-addon-connect forminator-integration-popup__close' ),
185
+ );
186
+ }
187
+ }
188
+
189
+ return array(
190
+ 'html' => self::get_template( $template, $template_params ),
191
+ 'buttons' => $buttons,
192
+ 'redirect' => false,
193
+ 'has_errors' => $has_errors,
194
+ );
195
+ }
196
+
197
+ /**
198
+ * Override on is_connected
199
+ *
200
+ *
201
+ * @since 1.1 Disable auto activate
202
+ *
203
+ * @return bool
204
+ */
205
+ public function is_connected() {
206
+ try {
207
+ // check if its active.
208
+ if ( ! $this->is_active() ) {
209
+ throw new Forminator_Addon_Webhook_Exception( __( 'Webhook is not active', 'forminator' ) );
210
+ }
211
+ $is_connected = true;
212
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
213
+ $is_connected = false;
214
+ }
215
+
216
+ /**
217
+ * Filter connected status ofwebhook
218
+ *
219
+ * @since 1.1
220
+ *
221
+ * @param bool $is_connected
222
+ */
223
+ $is_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_connected', array( $is_connected ), '1.18.0', 'forminator_addon_webhook_is_connected' );
224
+ $is_connected = apply_filters( 'forminator_addon_webhook_is_connected', $is_connected );
225
+
226
+ return $is_connected;
227
+ }
228
+
229
+ /**
230
+ * Check ifwebhook is connected with current form
231
+ *
232
+ * @since 1.0 Webhook Addon
233
+ *
234
+ * @param $form_id
235
+ *
236
+ * @return bool
237
+ */
238
+ public function is_form_connected( $form_id ) {
239
+ try {
240
+ $form_settings_instance = null;
241
+ if ( ! $this->is_connected() ) {
242
+ throw new Forminator_Addon_Webhook_Exception( __( 'Webhook is not connected', 'forminator' ) );
243
+ }
244
+
245
+ $form_settings_instance = $this->get_addon_settings( $form_id, 'form' );
246
+ if ( ! $form_settings_instance instanceof Forminator_Addon_Webhook_Form_Settings ) {
247
+ throw new Forminator_Addon_Webhook_Exception( __( 'Invalid Form Settings of Webhook', 'forminator' ) );
248
+ }
249
+
250
+ // Mark as active when there is at least one active connection.
251
+ if ( false === $form_settings_instance->find_one_active_connection() ) {
252
+ throw new Forminator_Addon_Webhook_Exception( __( 'No active Webhook connection found in this form', 'forminator' ) );
253
+ }
254
+
255
+ $is_form_connected = true;
256
+
257
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
258
+ $is_form_connected = false;
259
+ forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
260
+ }
261
+
262
+ /**
263
+ * Filter connected status ofwebhook with the form
264
+ *
265
+ * @since 1.1
266
+ *
267
+ * @param bool $is_form_connected
268
+ * @param int $form_id Current Form ID.
269
+ * @param Forminator_Addon_Webhook_Form_Settings|null $form_settings_instance Instance of form settings, or null when unavailable.
270
+ *
271
+ */
272
+ $is_form_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_form_connected', array( $is_form_connected, $form_id, $form_settings_instance ), '1.18.0', 'forminator_addon_webhook_is_form_connected' );
273
+ $is_form_connected = apply_filters( 'forminator_addon_webhook_is_form_connected', $is_form_connected, $form_id, $form_settings_instance );
274
+
275
+ return $is_form_connected;
276
+ }
277
+
278
+ /**
279
+ * Get Webhook API
280
+ *
281
+ *
282
+ *
283
+ * @param string $endpoint
284
+ *
285
+ * @return Forminator_Addon_Webhook_Wp_Api|null
286
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
287
+ */
288
+ public function get_api( $endpoint ) {
289
+ return Forminator_Addon_Webhook_Wp_Api::get_instance( $endpoint );
290
+ }
291
+
292
+ /**
293
+ * Flag show full log on entries
294
+ *
295
+ *
296
+ * @return bool
297
+ */
298
+ public static function is_show_full_log() {
299
+ if ( defined( 'FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG' ) && FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG ) {
300
+ return true;
301
+ }
302
+
303
+ return false;
304
+ }
305
+
306
+ /**
307
+ * Allow multiple connection on one form
308
+ *
309
+ *
310
+ * @return bool
311
+ */
312
+ public function is_allow_multi_on_form() {
313
+ return true;
314
+ }
315
+
316
+ /**
317
+ * Flag for check if and addon connected to a poll(poll settings such as list id completed)
318
+ *
319
+ * Please apply necessary WordPress hook on the inheritance class
320
+ *
321
+ * @since 1.6.1
322
+ *
323
+ * @param $poll_id
324
+ *
325
+ * @return boolean
326
+ */
327
+ public function is_poll_connected( $poll_id ) {
328
+ try {
329
+ $poll_settings_instance = null;
330
+ if ( ! $this->is_connected() ) {
331
+ throw new Forminator_Addon_Webhook_Exception( 'Webhook is not connected' );
332
+ }
333
+
334
+ $poll_settings_instance = $this->get_addon_settings( $poll_id, 'poll' );
335
+ if ( ! $poll_settings_instance instanceof Forminator_Addon_Webhook_Poll_Settings ) {
336
+ throw new Forminator_Addon_Webhook_Exception( 'Webhook Poll Settings of Trello' );
337
+ }
338
+
339
+ // Mark as active when there is at least one active connection.
340
+ if ( false === $poll_settings_instance->find_one_active_connection() ) {
341
+ throw new Forminator_Addon_Webhook_Exception( 'No active Poll connection found in this poll' );
342
+ }
343
+
344
+ $is_poll_connected = true;
345
+
346
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
347
+
348
+ $is_poll_connected = false;
349
+ }
350
+
351
+ /**
352
+ * Filter connected status Webhook with the poll
353
+ *
354
+ * @since 1.6.1
355
+ *
356
+ * @param bool $is_poll_connected
357
+ * @param int $poll_id Current Poll ID.
358
+ * @param Forminator_Addon_Trello_Poll_Settings|null $poll_settings_instance Instance of poll settings, or null when unavailable.
359
+ *
360
+ */
361
+ $is_poll_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_poll_connected', array( $is_poll_connected, $poll_id, $poll_settings_instance ), '1.18.0', 'forminator_addon_webhook_is_poll_connected' );
362
+ $is_poll_connected = apply_filters( 'forminator_addon_webhook_is_poll_connected', $is_poll_connected, $poll_id, $poll_settings_instance );
363
+
364
+ return $is_poll_connected;
365
+ }
366
+
367
+ /**
368
+ * Allow multiple connection on one poll
369
+ *
370
+ * @since 1.6.1
371
+ * @return bool
372
+ */
373
+ public function is_allow_multi_on_poll() {
374
+ return true;
375
+ }
376
+
377
+ /**
378
+ * Flag for check if and addon connected to a quiz(quiz settings such as list id completed)
379
+ *
380
+ * Please apply necessary WordPress hook on the inheritance class
381
+ *
382
+ * @since 1.6.2
383
+ *
384
+ * @param $quiz_id
385
+ *
386
+ * @return boolean
387
+ */
388
+ public function is_quiz_connected( $quiz_id ) {
389
+ try {
390
+ $quiz_settings_instance = null;
391
+ if ( ! $this->is_connected() ) {
392
+ throw new Forminator_Addon_Webhook_Exception( 'Webhook is not connected' );
393
+ }
394
+
395
+ $quiz_settings_instance = $this->get_addon_settings( $quiz_id, 'quiz' );
396
+ if ( ! $quiz_settings_instance instanceof Forminator_Addon_Webhook_Quiz_Settings ) {
397
+ throw new Forminator_Addon_Webhook_Exception( 'Webhook Quiz Settings of Trello' );
398
+ }
399
+
400
+ // Mark as active when there is at least one active connection.
401
+ if ( false === $quiz_settings_instance->find_one_active_connection() ) {
402
+ throw new Forminator_Addon_Webhook_Exception( 'No active Webhook connection found in this quiz' );
403
+ }
404
+
405
+ $is_quiz_connected = true;
406
+
407
+ } catch ( Forminator_Addon_Webhook_Exception $e ) {
408
+
409
+ $is_quiz_connected = false;
410
+ }
411
+
412
+ /**
413
+ * Filter connected status Webhook with the quiz
414
+ *
415
+ * @since 1.6.2
416
+ *
417
+ * @param bool $is_quiz_connected
418
+ * @param int $quiz_id Current Quiz ID.
419
+ * @param Forminator_Addon_Trello_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable.
420
+ *
421
+ */
422
+ $is_quiz_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_quiz_connected', array( $is_quiz_connected, $quiz_id, $quiz_settings_instance ), '1.18.0', 'forminator_addon_webhook_is_quiz_connected' );
423
+ $is_quiz_connected = apply_filters( 'forminator_addon_webhook_is_quiz_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
424
+
425
+ return $is_quiz_connected;
426
+ }
427
+
428
+ /**
429
+ * Allow multiple connection on one quiz
430
+ *
431
+ * @since 1.6.2
432
+ * @return bool
433
+ */
434
+ public function is_allow_multi_on_quiz() {
435
+ return true;
436
+ }
437
+ }
addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-exception.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Wp_Api_Exception
5
+ * Exception holder forwebhook wp api
6
+ *
7
+ *
8
+ */
9
+ class Forminator_Addon_Webhook_Wp_Api_Exception extends Forminator_Addon_Webhook_Exception {
10
+ }
addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-not-found-exception.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
5
+ * Exception holder forwebhook wp api on 404 not found error status
6
+ *
7
+ *
8
+ */
9
+ class Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception extends Forminator_Addon_Webhook_Wp_Api_Exception {
10
+ }
addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api.php ADDED
@@ -0,0 +1,316 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-wp-api-exception.php';
4
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-wp-api-not-found-exception.php';
5
+
6
+ /**
7
+ * Class Forminator_Addon_Webhook_Wp_Api
8
+ */
9
+ class Forminator_Addon_Webhook_Wp_Api {
10
+
11
+ /**
12
+ * Instances ofwebhook api
13
+ * key is md5(_endpoint)
14
+ *
15
+ * @var array
16
+ */
17
+ private static $_instances = array();
18
+
19
+ /**
20
+ * Webhook endpoint of static webhook
21
+ *
22
+ * @var string
23
+ */
24
+ private $_endpoint = '';
25
+
26
+ /**
27
+ * Last data sent towebhook
28
+ *
29
+ *
30
+ * @var array
31
+ */
32
+ private $_last_data_sent = array();
33
+
34
+ /**
35
+ * Last data received fromwebhook
36
+ *
37
+ *
38
+ * @var array
39
+ */
40
+ private $_last_data_received = array();
41
+
42
+ /**
43
+ * Last URL requested
44
+ *
45
+ *
46
+ * @var string
47
+ */
48
+ private $_last_url_request = '';
49
+
50
+ /**
51
+ * Forminator_Addon_Webhook_Wp_Api constructor.
52
+ *
53
+ *
54
+ *
55
+ * @param $_endpoint
56
+ *
57
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
58
+ */
59
+ public function __construct( $_endpoint ) {
60
+ global $wpdb;
61
+ $wpdb->last_error;
62
+ //prerequisites
63
+ if ( ! $_endpoint ) {
64
+ throw new Forminator_Addon_Webhook_Wp_Api_Exception( __( 'Missing required Static Webhook URL', 'forminator' ) );
65
+ }
66
+
67
+ $this->_endpoint = $_endpoint;
68
+ }
69
+
70
+ /**
71
+ * Get singleton
72
+ *
73
+ *
74
+ *
75
+ * @param string $_endpoint
76
+ *
77
+ * @return Forminator_Addon_Webhook_Wp_Api|null
78
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
79
+ */
80
+ public static function get_instance( $_endpoint ) {
81
+ if ( ! isset( self::$_instances[ md5( $_endpoint ) ] ) ) {
82
+ self::$_instances[ md5( $_endpoint ) ] = new self( $_endpoint );
83
+ }
84
+
85
+ return self::$_instances[ md5( $_endpoint ) ];
86
+ }
87
+
88
+ /**
89
+ * Add custom user agent on request
90
+ *
91
+ *
92
+ *
93
+ * @param $user_agent
94
+ *
95
+ * @return string
96
+ */
97
+ public function filter_user_agent( $user_agent ) {
98
+ $user_agent .= ' ForminatorWebhook/' . FORMINATOR_ADDON_WEBHOOK_VERSION;
99
+
100
+ /**
101
+ * Filter user agent to be used bywebhook api
102
+ *
103
+ * @since 1.1
104
+ *
105
+ * @param string $user_agent current user agent.
106
+ */
107
+ $user_agent = apply_filters_deprecated( 'forminator_addon_zapier_api_user_agent', array( $user_agent ), '1.18.0', 'forminator_addon_webhook_api_user_agent' );
108
+ $user_agent = apply_filters( 'forminator_addon_webhook_api_user_agent', $user_agent );
109
+
110
+ return $user_agent;
111
+ }
112
+
113
+ /**
114
+ * HTTP Request
115
+ *
116
+ *
117
+ *
118
+ * @param string $verb
119
+ * @param $path
120
+ * @param array $args
121
+ *
122
+ * @return array|mixed|object
123
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
124
+ * @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
125
+ */
126
+ private function request( $verb, $path, $args = array() ) {
127
+ // Adding extra user agent for wp remote request.
128
+ add_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
129
+
130
+ $url = trailingslashit( $this->_endpoint ) . $path;
131
+ $verb = ! empty( $verb ) ? $verb : 'GET';
132
+
133
+ /**
134
+ * Filterwebhook url to be used on sending api request
135
+ *
136
+ * @since 1.1
137
+ *
138
+ * @param string $url full url with scheme.
139
+ * @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
140
+ * @param string $path requested path resource.
141
+ * @param array $args argument sent to this function.
142
+ */
143
+ $url = apply_filters_deprecated( 'forminator_addon_zapier_api_url', array( $url, $verb, $path, $args ), '1.18.0', 'forminator_addon_webhook_api_url' );
144
+ $url = apply_filters( 'forminator_addon_webhook_api_url', $url, $verb, $path, $args );
145
+
146
+ $this->_last_url_request = $url;
147
+
148
+ $headers = array(
149
+ 'Accept' => 'application/json',
150
+ 'Content-Type' => 'application/json',
151
+ );
152
+
153
+ /**
154
+ * Filterwebhook headers to sent on api request
155
+ *
156
+ * @since 1.1
157
+ *
158
+ * @param array $headers
159
+ * @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
160
+ * @param string $path requested path resource.
161
+ * @param array $args argument sent to this function.
162
+ */
163
+ $headers = apply_filters_deprecated( 'forminator_addon_zapier_api_request_headers', array( $headers, $verb, $path, $args ), '1.18.0', 'forminator_addon_webhook_api_request_headers' );
164
+ $headers = apply_filters( 'forminator_addon_webhook_api_request_headers', $headers, $verb, $path, $args );
165
+
166
+ $_args = array(
167
+ 'method' => $verb,
168
+ 'headers' => $headers,
169
+ );
170
+
171
+ // X-Hook-Test handler.
172
+ if ( isset( $args['is_test'] ) ) {
173
+ if ( true === $args['is_test'] ) {
174
+ // Add `X-Hook-Test` header to avoid execute task onwebhook.
175
+ $_args['headers']['X-Hook-Test'] = 'true';
176
+ }
177
+ // always unset when exist.
178
+ unset( $args['is_test'] );
179
+ }
180
+
181
+ $request_data = $args;
182
+ /**
183
+ * Filterwebhook request data to be used on sending api request
184
+ *
185
+ * @since 1.1
186
+ *
187
+ * @param array $request_data it will be `http_build_query`-ed when `GET` or `wp_json_encode`-ed otherwise.
188
+ * @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
189
+ * @param string $path requested path resource.
190
+ */
191
+ $args = apply_filters_deprecated( 'forminator_addon_zapier_api_request_data', array( $request_data, $verb, $path ), '1.18.0', 'forminator_addon_webhook_api_request_data' );
192
+ $args = apply_filters( 'forminator_addon_webhook_api_request_data', $args, $verb, $path );
193
+
194
+ if ( 'GET' === $verb ) {
195
+ $url .= ( '?' . http_build_query( $args ) );
196
+ } else {
197
+ $_args['body'] = wp_json_encode( $args );
198
+ }
199
+
200
+ $this->_last_data_sent = $args;
201
+
202
+ $res = wp_remote_request( $url, $_args );
203
+ $wp_response = $res;
204
+
205
+ remove_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
206
+
207
+ if ( is_wp_error( $res ) || ! $res ) {
208
+ forminator_addon_maybe_log( __METHOD__, $res );
209
+ throw new Forminator_Addon_Webhook_Wp_Api_Exception(
210
+ __( 'Failed to process request, make sure your Webhook URL is correct and your server has internet connection.', 'forminator' )
211
+ );
212
+ }
213
+
214
+ if ( isset( $res['response']['code'] ) ) {
215
+ $status_code = $res['response']['code'];
216
+ $msg = '';
217
+ if ( $status_code >= 400 ) {
218
+ if ( isset( $res['response']['message'] ) ) {
219
+ $msg = $res['response']['message'];
220
+ }
221
+
222
+ if ( strpos( $url, 'trayapp.io' ) ) {
223
+ throw new Forminator_Addon_Webhook_Wp_Api_Exception( esc_html__( 'Failed to process request : Enable Tray.io workflow first', 'forminator' ) );
224
+ }
225
+
226
+ if ( 404 === $status_code ) {
227
+ /* translators: ... */
228
+ throw new Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
229
+ }
230
+ /* translators: ... */
231
+ throw new Forminator_Addon_Webhook_Wp_Api_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
232
+ }
233
+ }
234
+
235
+ $body = wp_remote_retrieve_body( $res );
236
+
237
+ // probably silent mode.
238
+ if ( ! empty( $body ) ) {
239
+ $res = json_decode( $body );
240
+ }
241
+
242
+ $response = $res;
243
+ /**
244
+ * Filterwebhook api response returned to addon
245
+ *
246
+ * @since 1.1
247
+ *
248
+ * @param mixed $response original wp remote request response or decoded body if available.
249
+ * @param string $body original content of http response's body.
250
+ * @param array|WP_Error $wp_response original wp remote request response.
251
+ */
252
+ $res = apply_filters_deprecated( 'forminator_addon_zapier_api_response', array( $response, $body, $wp_response ), '1.18.0', 'forminator_addon_webhook_api_response' );
253
+ $res = apply_filters( 'forminator_addon_webhook_api_response', $res, $body, $wp_response );
254
+
255
+ $this->_last_data_received = $res;
256
+
257
+ forminator_addon_maybe_log( $res );
258
+
259
+ return $res;
260
+ }
261
+
262
+
263
+ /**
264
+ * Send data to static webhookwebhook URL
265
+ *
266
+ *
267
+ *
268
+ * @param $args
269
+ * add `is_test` => true to add `X-Hook-Test: true`
270
+ *
271
+ * @return array|mixed|object
272
+ * @throws Forminator_Addon_Webhook_Wp_Api_Exception
273
+ * @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
274
+ */
275
+ public function post_( $args ) {
276
+
277
+ return $this->request(
278
+ 'POST',
279
+ '',
280
+ $args
281
+ );
282
+ }
283
+
284
+ /**
285
+ * Get last data sent
286
+ *
287
+ *
288
+ *
289
+ * @return array
290
+ */
291
+ public function get_last_data_sent() {
292
+ return $this->_last_data_sent;
293
+ }
294
+
295
+ /**
296
+ * Get last data received
297
+ *
298
+ *
299
+ *
300
+ * @return array
301
+ */
302
+ public function get_last_data_received() {
303
+ return $this->_last_data_received;
304
+ }
305
+
306
+ /**
307
+ * Get last data received
308
+ *
309
+ *
310
+ *
311
+ * @return string
312
+ */
313
+ public function get_last_url_request() {
314
+ return $this->_last_url_request;
315
+ }
316
+ }
addons/pro/webhook/views/poll-settings/setup-webhook.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // defaults.
3
+ $vars = array(
4
+ 'error_message' => '',
5
+ 'name' => '',
6
+ 'name_error' => '',
7
+ 'multi_id' => '',
8
+ 'webhook_url' => '',
9
+ 'webhook_url_error' => '',
10
+ );
11
+ /** @var array $template_vars */
12
+ foreach ( $template_vars as $key => $val ) {
13
+ $vars[ $key ] = $val;
14
+ }
15
+ ?>
16
+
17
+ <div class="forminator-integration-popup__header">
18
+
19
+ <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
20
+ <?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
21
+ </h3>
22
+
23
+ <p id="forminator-integration-popup__description" class="sui-description">
24
+ <?php esc_html_e( 'Give your webhook integration a name and add the webhook URL.', 'forminator' ); ?>
25
+ </p>
26
+
27
+ <?php if ( ! empty( $vars['error_message'] ) ) : ?>
28
+ <div
29
+ role="alert"
30
+ class="sui-notice sui-notice-red sui-active"
31
+ style="display: block; text-align: left;"
32
+ aria-live="assertive"
33
+ >
34
+
35
+ <div class="sui-notice-content">
36
+
37
+ <div class="sui-notice-message">
38
+
39
+ <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
40
+
41
+ <p><?php echo esc_html( $vars['error_message'] ); ?></p>
42
+
43
+ </div>
44
+
45
+ </div>
46
+
47
+ </div>
48
+ <?php endif; ?>
49
+
50
+ </div>
51
+
52
+ <form enctype="multipart/form-data">
53
+
54
+ <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
55
+ <label class="sui-label"><?php esc_html_e( 'Friendly Name', 'forminator' ); ?></label>
56
+ <div class="sui-control-with-icon">
57
+ <input type="text"
58
+ name="name"
59
+ placeholder="<?php esc_attr_e( 'Enter a friendly name E.g. Zapier to Gmail', 'forminator' ); ?>"
60
+ value="<?php echo esc_attr( $vars['name'] ); ?>"
61
+ class="sui-form-control"
62
+ />
63
+ <i class="sui-icon-web-globe-world" aria-hidden="true"></i>
64
+ </div>
65
+ <?php if ( ! empty( $vars['name_error'] ) ) : ?>
66
+ <span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
67
+ <?php endif; ?>
68
+ </div>
69
+
70
+ <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
71
+ <label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
72
+ <div class="sui-control-with-icon">
73
+ <input
74
+ type="text"
75
+ name="webhook_url"
76
+ placeholder="<?php esc_attr_e( 'Enter your webhook URL', 'forminator' ); ?>"
77
+ value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
78
+ class="sui-form-control"/>
79
+ <i class="sui-icon-link" aria-hidden="true"></i>
80
+ </div>
81
+ <?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
82
+ <span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
83
+ <?php endif; ?>
84
+
85
+ <?php if ( forminator_is_show_addons_documentation_link() ) : ?>
86
+ <div class="sui-description">
87
+ <?php
88
+ printf(
89
+ /* translators: 1: article anchor start, 2: article anchor end. */
90
+ esc_html__( 'Check %1$sour documentation%2$s for more information on using webhook URLs for your preferred automation tools.', 'forminator' ),
91
+ '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
92
+ '</a>'
93
+ );
94
+ ?>
95
+ </div>
96
+ <?php endif; ?>
97
+ </div>
98
+
99
+ <input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
100
+
101
+ </form>
addons/pro/webhook/views/quiz-settings/setup-webhook.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // defaults.
3
+ $vars = array(
4
+ 'error_message' => '',
5
+ 'name' => '',
6
+ 'name_error' => '',
7
+ 'multi_id' => '',
8
+ 'webhook_url' => '',
9
+ 'webhook_url_error' => '',
10
+ );
11
+ /** @var array $template_vars */
12
+ foreach ( $template_vars as $key => $val ) {
13
+ $vars[ $key ] = $val;
14
+ }
15
+ ?>
16
+
17
+ <div class="forminator-integration-popup__header">
18
+
19
+ <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
20
+ <?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
21
+ </h3>
22
+
23
+ <p id="forminator-integration-popup__description" class="sui-description">
24
+ <?php esc_html_e( 'Give your webhook integration a name and add the webhook URL.', 'forminator' ); ?>
25
+ </p>
26
+
27
+ <?php if ( ! empty( $vars['error_message'] ) ) : ?>
28
+ <div
29
+ role="alert"
30
+ class="sui-notice sui-notice-red sui-active"
31
+ style="display: block; text-align: left;"
32
+ aria-live="assertive"
33
+ >
34
+
35
+ <div class="sui-notice-content">
36
+
37
+ <div class="sui-notice-message">
38
+
39
+ <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
40
+
41
+ <p><?php echo esc_html( $vars['error_message'] ); ?></p>
42
+
43
+ </div>
44
+
45
+ </div>
46
+
47
+ </div>
48
+ <?php endif; ?>
49
+
50
+ </div>
51
+
52
+ <form enctype="multipart/form-data">
53
+
54
+ <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
55
+ <label class="sui-label"><?php esc_html_e( 'Friendly Name', 'forminator' ); ?></label>
56
+ <div class="sui-control-with-icon">
57
+ <input type="text"
58
+ name="name"
59
+ placeholder="<?php esc_attr_e( 'Enter a friendly name E.g. Zapier to Gmail', 'forminator' ); ?>"
60
+ value="<?php echo esc_attr( $vars['name'] ); ?>"
61
+ class="sui-form-control"
62
+ />
63
+ <i class="sui-icon-web-globe-world" aria-hidden="true"></i>
64
+ </div>
65
+ <?php if ( ! empty( $vars['name_error'] ) ) : ?>
66
+ <span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
67
+ <?php endif; ?>
68
+ </div>
69
+
70
+ <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
71
+ <label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
72
+ <div class="sui-control-with-icon">
73
+ <input
74
+ type="text"
75
+ name="webhook_url"
76
+ placeholder="<?php esc_attr_e( 'Enter your webhook URL', 'forminator' ); ?>"
77
+ value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
78
+ class="sui-form-control"/>
79
+ <i class="sui-icon-link" aria-hidden="true"></i>
80
+ </div>
81
+ <?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
82
+ <span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
83
+ <?php endif; ?>
84
+
85
+ <?php if ( forminator_is_show_addons_documentation_link() ) : ?>
86
+ <div class="sui-description">
87
+ <?php
88
+ printf(
89
+ /* translators: 1: article anchor start, 2: article anchor end. */
90
+ esc_html__( 'Check %1$sour documentation%2$s for more information on using webhook URLs for your preferred automation tools.', 'forminator' ),
91
+ '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
92
+ '</a>'
93
+ );
94
+ ?>
95
+ </div>
96
+ <?php endif; ?>
97
+ </div>
98
+
99
+ <input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
100
+
101
+ </form>
addons/pro/webhook/views/settings/setup-connect-success.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="forminator-integration-popup__header">
2
+
3
+ <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
4
+ <?php
5
+ /* translators: Integration name */
6
+ echo esc_html( sprintf( __( '%1$s Added', 'forminator' ), 'Webhook' ) );
7
+ ?>
8
+ </h3>
9
+
10
+ </div>
11
+
12
+ <p id="forminator-integration-popup__description" class="sui-description" style="text-align: center;">
13
+ <?php esc_html_e( 'You can now go to your forms and assign them to this integration', 'forminator' ); ?>
14
+ </p>
addons/pro/webhook/views/settings/setup-connect.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Defaults.
3
+ $vars = array(
4
+ 'error_message' => '',
5
+ 'is_connected' => false,
6
+ );
7
+
8
+ $activate_description = __( 'Activate Webhook to start using it with your forms, quizzes, and polls.', 'forminator' );
9
+
10
+ /** @var array $template_vars */
11
+ foreach ( $template_vars as $key => $val ) {
12
+ $vars[ $key ] = $val;
13
+ } ?>
14
+
15
+ <div class="forminator-integration-popup__header">
16
+
17
+ <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
18
+ <?php
19
+ /* translators: ... */
20
+ echo esc_html( sprintf( __( 'Activate %1$s', 'forminator' ), 'Webhook' ) );
21
+ ?>
22
+ </h3>
23
+
24
+ <?php if ( ! empty( $vars['is_connected'] ) || ! empty( $vars['error_message'] ) ) : ?>
25
+ <p id="forminator-integration-popup__description" class="sui-description">
26
+ <?php echo esc_html( $activate_description ); ?>
27
+ </p>
28
+ <?php endif; ?>
29
+
30
+ </div>
31
+
32
+ <?php if ( empty( $vars['is_connected'] ) && empty( $vars['error_message'] ) ) : ?>
33
+ <p id="forminator-integration-popup__description" class="sui-description" style="margin: 0; text-align: center;">
34
+ <?php echo esc_html( $activate_description ); ?>
35
+ </p>
36
+ <?php endif; ?>
37
+
38
+ <?php if ( ! empty( $vars['is_connected'] ) ) : ?>
39
+ <div
40
+ role="alert"
41
+ class="sui-notice sui-notice-green sui-active"
42
+ style="display: block; text-align: left;"
43
+ aria-live="assertive"
44
+ >
45
+
46
+ <div class="sui-notice-content">
47
+
48
+ <div class="sui-notice-message">
49
+
50
+ <span class="sui-notice-icon sui-icon-check-tick" aria-hidden="true"></span>
51
+
52
+ <p><?php esc_html_e( 'Webhook is already active.', 'forminator' ); ?></p>
53
+
54
+ </div>
55
+
56
+ </div>
57
+
58
+ </div>
59
+ <?php endif; ?>
60
+
61
+ <?php if ( ! empty( $vars['error_message'] ) ) : ?>
62
+ <div
63
+ role="alert"
64
+ class="sui-notice sui-notice-red sui-active"
65
+ style="display: block; text-align: left;"
66
+ aria-live="assertive"
67
+ >
68
+
69
+ <div class="sui-notice-content">
70
+
71
+ <div class="sui-notice-message">
72
+
73
+ <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
74
+
75
+ <p><?php echo esc_html( $vars['error_message'] ); ?></p>
76
+
77
+ </div>
78
+
79
+ </div>
80
+
81
+ </div>
82
+ <?php endif; ?>
83
+
84
+ <form>
85
+ <input type="hidden" value="1" name="connect">
86
+ </form>
addons/pro/webhook/webhook.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Addon Name: Webhook
5
+ * Version: 1.0
6
+ * Plugin URI: https://wpmudev.com/
7
+ * Description: Integrate Forminator Custom Forms with Webhook to execute various action you like
8
+ * Author: WPMU DEV
9
+ * Author URI: http://wpmudev.com
10
+ */
11
+ define( 'FORMINATOR_ADDON_WEBHOOK_VERSION', '1.0' );
12
+
13
+ function forminator_addon_webhook_url() {
14
+ return trailingslashit( forminator_plugin_url() . 'addons/pro/webhook' );
15
+ }
16
+
17
+ function forminator_addon_webhook_assets_url() {
18
+ return trailingslashit( forminator_addon_webhook_url() . 'assets' );
19
+ }
20
+
21
+ function forminator_addon_webhook_dir() {
22
+ return trailingslashit( dirname( __FILE__ ) );
23
+ }
24
+
25
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook.php';
26
+
27
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-form-settings.php';
28
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-form-hooks.php';
29
+
30
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-poll-settings.php';
31
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-poll-hooks.php';
32
+
33
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-quiz-settings.php';
34
+ require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-quiz-hooks.php';
35
+
36
+ // Direct Load.
37
+ Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Webhook' );
addons/pro/zapier/assets/icons/zapier.png DELETED
Binary file
addons/pro/zapier/assets/icons/zapier@2x.png DELETED
Binary file
addons/pro/zapier/assets/img/banner.png DELETED
Binary file
addons/pro/zapier/assets/img/banner@2x.png DELETED
Binary file
addons/pro/zapier/assets/img/zapier.png DELETED
Binary file
addons/pro/zapier/assets/img/zapier@2x.png DELETED
Binary file
addons/pro/zapier/class-forminator-addon-zapier-exception.php CHANGED
@@ -1,10 +1,9 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Exception
5
- * Not Required but encouraged
6
- *
7
- * @since 1.0 Zapier Addon
8
  */
9
  class Forminator_Addon_Zapier_Exception extends Exception {
10
 
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Exception extends Exception {
9
 
addons/pro/zapier/class-forminator-addon-zapier-form-hooks.php CHANGED
@@ -1,538 +1,10 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Form_Hooks
5
- *
6
- * @since 1.0 Zapier Addon
7
- *
8
  */
9
  class Forminator_Addon_Zapier_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
10
 
11
- /**
12
- * Addon instance are auto available form abstract
13
- * Its added here for development purpose,
14
- * Autocomplete will resolve addon directly to `Zapier` instance instead of the abstract
15
- * And its public properties can be exposed
16
- *
17
- * @since 1.0 Zapier Addon
18
- * @var Forminator_Addon_Zapier
19
- */
20
- protected $addon;
21
-
22
- /**
23
- * Form Settings Instance
24
- *
25
- * @since 1.0 Zapier Addon
26
- * @var Forminator_Addon_Zapier_Form_Settings | null
27
- */
28
- protected $form_settings_instance;
29
-
30
- /**
31
- * Forminator_Addon_Zapier_Form_Hooks constructor.
32
- *
33
- * @since 1.0 Zapier Addon
34
- *
35
- * @param Forminator_Addon_Abstract $addon
36
- * @param $form_id
37
- *
38
- * @throws Forminator_Addon_Exception
39
- */
40
- public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
41
- parent::__construct( $addon, $form_id );
42
- $this->_submit_form_error_message = __( 'Zapier failed to process submitted data. Please check your form and try again', 'forminator' );
43
- }
44
-
45
-
46
- /**
47
- * Save status of request sent and received for each connected zap(s)
48
- *
49
- * @since 1.0 Zapier Addon
50
- * @since 1.7 Add $form_entry_fields
51
- *
52
- * @param array $submitted_data
53
- * @param array $form_entry_fields
54
- *
55
- * @return array
56
- */
57
- public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
58
-
59
- $form_id = $this->form_id;
60
- $form_settings_instance = $this->form_settings_instance;
61
-
62
- /**
63
- * Filter zapier submitted form data to be processed
64
- *
65
- * @since 1.1
66
- *
67
- * @param array $submitted_data
68
- * @param int $form_id current Form ID.
69
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Addon Form Settings instance.
70
- */
71
- $submitted_data = apply_filters(
72
- 'forminator_addon_zapier_form_submitted_data',
73
- $submitted_data,
74
- $form_id,
75
- $form_settings_instance
76
- );
77
-
78
- forminator_addon_maybe_log( __METHOD__, $submitted_data );
79
-
80
- $addon_setting_values = $this->form_settings_instance->get_form_settings_values();
81
- $form_settings = $this->form_settings_instance->get_form_settings();
82
-
83
- $data = array();
84
-
85
- /**
86
- * Fires before sending data to Webhook URL(s)
87
- *
88
- * @since 1.1
89
- *
90
- * @param int $form_id current Form ID.
91
- * @param array $submitted_data
92
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Addon Form Settings instance.
93
- */
94
- do_action( 'forminator_addon_zapier_before_post_to_webhook', $form_id, $submitted_data, $form_settings_instance );
95
-
96
- foreach ( $addon_setting_values as $key => $addon_setting_value ) {
97
- // save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to zapier.
98
- $data[] = array(
99
- 'name' => 'status-' . $key,
100
- 'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $form_settings, $form_entry_fields ),
101
- );
102
- }
103
-
104
- $entry_fields = $data;
105
- /**
106
- * Filter zapier entry fields to be saved to entry model
107
- *
108
- * @since 1.1
109
- *
110
- * @param array $entry_fields
111
- * @param int $form_id current Form ID.
112
- * @param array $submitted_data
113
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
114
- */
115
- $data = apply_filters(
116
- 'forminator_addon_zapier_entry_fields',
117
- $entry_fields,
118
- $form_id,
119
- $submitted_data,
120
- $form_settings_instance
121
- );
122
-
123
- return $data;
124
-
125
- }
126
-
127
- /**
128
- * Get status on sending data to zapier
129
- *
130
- * @since 1.0 Zapier Addon
131
- * @since 1.7 Add $form_entry_fields arg
132
- *
133
- * @param $connection_id
134
- * @param $submitted_data
135
- * @param $connection_settings
136
- * @param $form_settings
137
- * @param array $form_entry_fields
138
- *
139
- * @return array `is_sent` true means its success send data to zapier, false otherwise
140
- */
141
- private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $form_settings, $form_entry_fields ) {
142
- // initialize as null.
143
- $zapier_api = null;
144
-
145
- $form_id = $this->form_id;
146
- $form_settings_instance = $this->form_settings_instance;
147
-
148
- //check required fields
149
- try {
150
- if ( ! isset( $connection_settings['webhook_url'] ) ) {
151
- throw new Forminator_Addon_Zapier_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
152
- }
153
-
154
- $endpoint = $connection_settings['webhook_url'];
155
- /**
156
- * Filter Endpoint Webhook URL to send
157
- *
158
- * @since 1.1
159
- *
160
- * @param string $endpoint
161
- * @param int $form_id current Form ID.
162
- * @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
163
- */
164
- $endpoint = apply_filters(
165
- 'forminator_addon_zapier_endpoint',
166
- $endpoint,
167
- $form_id,
168
- $connection_settings
169
- );
170
-
171
- $zapier_api = $this->addon->get_api( $endpoint );
172
-
173
- $args = $submitted_data;
174
-
175
- $args['form-title'] = $form_settings['formName'];
176
- $args['entry-time'] = current_time( 'Y-m-d H:i:s' );
177
-
178
- /**
179
- * Filter arguments to passed on to Zapier Webhook API
180
- *
181
- * @since 1.1
182
- *
183
- * @param array $args
184
- * @param int $form_id Current Form id.
185
- * @param string $connection_id ID of current connection.
186
- * @param array $submitted_data
187
- * @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
188
- * @param array $form_settings Displayed Form settings.
189
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
190
- */
191
- $args = apply_filters(
192
- 'forminator_addon_zapier_post_to_webhook_args',
193
- $args,
194
- $form_id,
195
- $connection_id,
196
- $submitted_data,
197
- $connection_settings,
198
- $form_settings,
199
- $form_settings_instance
200
- );
201
-
202
- $zapier_api->post_( $args );
203
-
204
- forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
205
-
206
- return array(
207
- 'is_sent' => true,
208
- 'connection_name' => $connection_settings['name'],
209
- 'description' => __( 'Successfully send data to Zapier', 'forminator' ),
210
- 'data_sent' => $zapier_api->get_last_data_sent(),
211
- 'data_received' => $zapier_api->get_last_data_received(),
212
- 'url_request' => $zapier_api->get_last_url_request(),
213
- );
214
-
215
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
216
- forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Zapier' );
217
-
218
- return array(
219
- 'is_sent' => false,
220
- 'description' => $e->getMessage(),
221
- 'connection_name' => $connection_settings['name'],
222
- 'data_sent' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_sent() : array() ),
223
- 'data_received' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_received() : array() ),
224
- 'url_request' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_url_request() : '' ),
225
- );
226
- }
227
- }
228
-
229
- /**
230
- * It wil add new row on entry table of submission page, with couple of subentries
231
- * subentries included are defined in @see Forminator_Addon_Zapier_Form_Hooks::get_additional_entry_item()
232
- *
233
- * @since 1.0 Zapier Addon
234
- *
235
- * @param Forminator_Form_Entry_Model $entry_model
236
- * @param $addon_meta_data
237
- *
238
- * @return array
239
- */
240
- public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
241
-
242
- $form_id = $this->form_id;
243
- $form_settings_instance = $this->form_settings_instance;
244
-
245
- /**
246
- *
247
- * Filter zapier metadata that previously saved on db to be processed
248
- *
249
- * @since 1.1
250
- *
251
- * @param array $addon_meta_data
252
- * @param int $form_id current Form ID.
253
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
254
- */
255
- $addon_meta_data = apply_filters(
256
- 'forminator_addon_zapier_metadata',
257
- $addon_meta_data,
258
- $form_id,
259
- $form_settings_instance
260
- );
261
-
262
- $addon_meta_datas = $addon_meta_data;
263
- if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
264
- return array();
265
- }
266
-
267
- $addon_meta_data = $addon_meta_data[0];
268
-
269
- // make sure its `status`, because we only add this.
270
- // when its `status` then its single connection (backward compat on dev).
271
- // when its status-$MULTI_ID its multiple connection its default behavior.
272
- if ( 'status' !== $addon_meta_data['name'] ) {
273
- if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
274
- return $this->on_render_entry_multi_connection( $addon_meta_datas );
275
- }
276
-
277
- return array();
278
- }
279
-
280
- $additional_entry_item = $this->get_additional_entry_item( $addon_meta_data );
281
- if ( empty( $additional_entry_item ) ) {
282
- return array();
283
- }
284
-
285
- return array( $additional_entry_item );
286
-
287
- }
288
-
289
- /**
290
- * Loop through addon meta data on multiple zap(s)
291
- *
292
- * @since 1.0 Zapier Addon
293
- *
294
- * @param $addon_meta_datas
295
- *
296
- * @return array
297
- */
298
- private function on_render_entry_multi_connection( $addon_meta_datas ) {
299
- $additional_entry_item = array();
300
- foreach ( $addon_meta_datas as $addon_meta_data ) {
301
- $additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
302
- }
303
-
304
- return $additional_entry_item;
305
-
306
- }
307
-
308
- /**
309
- * Format additional entry item as label and value arrays
310
- *
311
- * - Integration Name : its defined by user when they adding zapier integration on their form
312
- * - Sent To Zapier : will be Yes/No value, that indicates whether sending data to zapier was successful
313
- * - Info : Text that are generated by addon when building and sending data to zapier @see Forminator_Addon_Zapier_Form_Hooks::add_entry_fields()
314
- * - Below subentries will be added if full log enabled, @see Forminator_Addon_Zapier::is_show_full_log() @see FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG
315
- * - API URL : URL that wes requested when sending data to zapier
316
- * - Data sent to Zapier : json encoded body request that was sent
317
- * - Data received from Zapier : json encoded body response that was received
318
- *
319
- * @param $addon_meta_data
320
- *
321
- * @since 1.0 Zapier Addon
322
- * @return array
323
- */
324
- private function get_additional_entry_item( $addon_meta_data ) {
325
-
326
- if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
327
- return array();
328
- }
329
- $status = $addon_meta_data['value'];
330
- $additional_entry_item = array(
331
- 'label' => __( 'Zapier Integration', 'forminator' ),
332
- 'value' => '',
333
- );
334
-
335
- $sub_entries = array();
336
- if ( isset( $status['connection_name'] ) ) {
337
- $sub_entries[] = array(
338
- 'label' => __( 'Integration Name', 'forminator' ),
339
- 'value' => $status['connection_name'],
340
- );
341
- }
342
-
343
- if ( isset( $status['is_sent'] ) ) {
344
- $is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
345
- $sub_entries[] = array(
346
- 'label' => __( 'Sent To Zapier', 'forminator' ),
347
- 'value' => $is_sent,
348
- );
349
- }
350
-
351
- if ( isset( $status['description'] ) ) {
352
- $sub_entries[] = array(
353
- 'label' => __( 'Info', 'forminator' ),
354
- 'value' => $status['description'],
355
- );
356
- }
357
-
358
- if ( Forminator_Addon_Zapier::is_show_full_log() ) {
359
- // too long to be added on entry data enable this with `define('FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG', true)`.
360
- if ( isset( $status['url_request'] ) ) {
361
- $sub_entries[] = array(
362
- 'label' => __( 'API URL', 'forminator' ),
363
- 'value' => $status['url_request'],
364
- );
365
- }
366
-
367
- if ( isset( $status['data_sent'] ) ) {
368
- $sub_entries[] = array(
369
- 'label' => __( 'Data sent to Zapier', 'forminator' ),
370
- 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
371
- );
372
- }
373
-
374
- if ( isset( $status['data_received'] ) ) {
375
- $sub_entries[] = array(
376
- 'label' => __( 'Data received from Zapier', 'forminator' ),
377
- 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
378
- );
379
- }
380
- }
381
-
382
- $additional_entry_item['sub_entries'] = $sub_entries;
383
-
384
- // return single array.
385
- return $additional_entry_item;
386
- }
387
-
388
- /**
389
- * Zapier will add a column on the title/header row
390
- * its called `Zapier Info` which can be translated on forminator lang
391
- *
392
- * @since 1.0 Zapier Addon
393
- * @return array
394
- */
395
- public function on_export_render_title_row() {
396
-
397
- $export_headers = array(
398
- 'info' => __( 'Zapier Info', 'forminator' ),
399
- );
400
-
401
- $form_id = $this->form_id;
402
- $form_settings_instance = $this->form_settings_instance;
403
-
404
- /**
405
- * Filter zapier headers on export file
406
- *
407
- * @since 1.1
408
- *
409
- * @param array $export_headers headers to be displayed on export file.
410
- * @param int $form_id current Form ID.
411
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
412
- */
413
- $export_headers = apply_filters(
414
- 'forminator_addon_zapier_export_headers',
415
- $export_headers,
416
- $form_id,
417
- $form_settings_instance
418
- );
419
-
420
- return $export_headers;
421
- }
422
-
423
- /**
424
- * Zapier will add a column that give user information whether sending data to zapier successfully or not
425
- * It will only add one column even its multiple connection, every connection will be separated by comma
426
- *
427
- * @since 1.0 Zapier Addon
428
- *
429
- * @param Forminator_Form_Entry_Model $entry_model
430
- * @param $addon_meta_data
431
- *
432
- * @return array
433
- */
434
- public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
435
-
436
- $form_id = $this->form_id;
437
- $form_settings_instance = $this->form_settings_instance;
438
-
439
- /**
440
- *
441
- * Filter zapier metadata that previously saved on db to be processed
442
- *
443
- * @since 1.1
444
- *
445
- * @param array $addon_meta_data
446
- * @param int $form_id current Form ID.
447
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
448
- */
449
- $addon_meta_data = apply_filters(
450
- 'forminator_addon_zapier_metadata',
451
- $addon_meta_data,
452
- $form_id,
453
- $form_settings_instance
454
- );
455
-
456
- $export_columns = array(
457
- 'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
458
- );
459
-
460
- /**
461
- * Filter zapier columns to be displayed on export submissions
462
- *
463
- * @since 1.1
464
- *
465
- * @param array $export_columns column to be exported.
466
- * @param int $form_id current Form ID.
467
- * @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
468
- * @param array $addon_meta_data meta data saved by addon on entry fields.
469
- * @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
470
- */
471
- $export_columns = apply_filters(
472
- 'forminator_addon_zapier_export_columns',
473
- $export_columns,
474
- $form_id,
475
- $entry_model,
476
- $addon_meta_data,
477
- $form_settings_instance
478
- );
479
-
480
- return $export_columns;
481
- }
482
-
483
- /**
484
- * Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
485
- *
486
- * @since 1.0 Zapier Addon
487
- *
488
- * @param $addon_meta_data
489
- * @param $key
490
- * @param string $default
491
- *
492
- * @return string
493
- */
494
- private function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
495
- $addon_meta_datas = $addon_meta_data;
496
- if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
497
- return $default;
498
- }
499
-
500
- $addon_meta_data = $addon_meta_data[0];
501
-
502
- // make sure its `status`, because we only add this.
503
- if ( 'status' !== $addon_meta_data['name'] ) {
504
- if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
505
- $meta_data = array();
506
- foreach ( $addon_meta_datas as $addon_meta_data ) {
507
- // make it like single value so it will be processed like single meta data.
508
- $addon_meta_data['name'] = 'status';
509
-
510
- // add it on an array for next recursive process.
511
- $meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
512
- }
513
-
514
- return implode( ', ', $meta_data );
515
- }
516
-
517
- return $default;
518
-
519
- }
520
-
521
- if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
522
- return $default;
523
- }
524
- $status = $addon_meta_data['value'];
525
- if ( isset( $status[ $key ] ) ) {
526
- $connection_name = '';
527
- if ( 'connection_name' !== $key ) {
528
- if ( isset( $status['connection_name'] ) ) {
529
- $connection_name = '[' . $status['connection_name'] . '] ';
530
- }
531
- }
532
-
533
- return $connection_name . $status[ $key ];
534
- }
535
-
536
- return $default;
537
- }
538
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier-form-settings-exception.php CHANGED
@@ -1,68 +1,10 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Form_Settings_Exception
5
- * Wrapper of Form Settings Zapier Exception
6
- *
7
- * @since 1.0 Zapier Addon
8
  */
9
  class Forminator_Addon_Zapier_Form_Settings_Exception extends Forminator_Addon_Zapier_Exception {
10
 
11
- /**
12
- * Holder of input exceptions
13
- *
14
- * @since 1.0 Zapier Addon
15
- * @var array
16
- */
17
- protected $input_exceptions = array();
18
-
19
- /**
20
- * Forminator_Addon_Zapier_Form_Settings_Exception constructor.
21
- *
22
- * Useful if input_id is needed for later.
23
- * If no input_id needed, use @see Forminator_Addon_Zapier_Exception
24
- *
25
- * @since 1.0 Zapier Addon
26
- *
27
- * @param string $message
28
- * @param string $input_id
29
- */
30
- public function __construct( $message = '', $input_id = '' ) {
31
- parent::__construct( $message, 0 );
32
- if ( ! empty( $input_id ) ) {
33
- $this->add_input_exception( $message, $input_id );
34
- }
35
- }
36
-
37
- /**
38
- * Set exception message for an input
39
- *
40
- * @since 1.0 Zapier Addon
41
- *
42
- * @param $message
43
- * @param $input_id
44
- */
45
- public function add_input_exception( $message, $input_id ) {
46
- $this->input_exceptions[ $input_id ] = $message;
47
- }
48
-
49
- /**
50
- * Get all input exceptions
51
- *
52
- * @since 1.0 Zapier Addon
53
- * @return array
54
- */
55
- public function get_input_exceptions() {
56
- return $this->input_exceptions;
57
- }
58
-
59
- /**
60
- * Check if there is input_exceptions_is_available
61
- *
62
- * @since 1.0 Zapier Addon
63
- * @return bool
64
- */
65
- public function input_exceptions_is_available() {
66
- return count( $this->input_exceptions ) > 0;
67
- }
68
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Form_Settings_Exception extends Forminator_Addon_Zapier_Exception {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier-form-settings.php CHANGED
@@ -1,487 +1,10 @@
1
  <?php
2
 
3
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-form-settings-exception.php';
4
-
5
  /**
6
- * Class Forminator_Addon_Zapier_Form_Settings
7
- * Handle how form settings displayed and saved
8
- *
9
- * @since 1.0 Zapier Addon
10
  */
11
  class Forminator_Addon_Zapier_Form_Settings extends Forminator_Addon_Form_Settings_Abstract {
12
 
13
- /**
14
- * @var Forminator_Addon_Zapier
15
- * @since 1.0 Zapier Addon
16
- */
17
- protected $addon;
18
-
19
- /**
20
- * Create Zap URL
21
- *
22
- * @since 1.0 Zapier Addon
23
- * @var string
24
- */
25
- private $new_zap_url = 'https://zapier.com/app/editor/';
26
-
27
- /**
28
- * Forminator_Addon_Zapier_Form_Settings constructor.
29
- *
30
- * @since 1.0 Zapier Addon
31
- *
32
- * @param Forminator_Addon_Abstract $addon
33
- * @param $form_id
34
- *
35
- * @throws Forminator_Addon_Exception
36
- */
37
- public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
38
- parent::__construct( $addon, $form_id );
39
-
40
- $this->_update_form_settings_error_message = __(
41
- 'The update to your settings for this form failed, check the form input and try again.',
42
- 'forminator'
43
- );
44
- }
45
-
46
- /**
47
- * Zapier Form Settings wizard
48
- *
49
- * @since 1.0 Zapier Addon
50
- * @return array
51
- */
52
- public function form_settings_wizards() {
53
- // numerical array steps.
54
- return array(
55
- // 0
56
- array(
57
- 'callback' => array( $this, 'setup_webhook_url' ),
58
- 'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
59
- ),
60
- );
61
- }
62
-
63
- /**
64
- * Setup webhook url
65
- *
66
- * @since 1.0 Zapier Addon
67
- *
68
- * @param $submitted_data
69
- *
70
- * @return array
71
- */
72
- public function setup_webhook_url( $submitted_data ) {
73
- $this->addon_form_settings = $this->get_form_settings_values();
74
-
75
- $multi_id = $this->generate_multi_id();
76
- if ( isset( $submitted_data['multi_id'] ) ) {
77
- $multi_id = $submitted_data['multi_id'];
78
- }
79
-
80
- unset( $submitted_data['multi_id'] );
81
-
82
- $is_submit = ! empty( $submitted_data );
83
-
84
- $current_data = array(
85
- 'webhook_url' => '',
86
- 'name' => '',
87
- );
88
-
89
- if ( isset( $submitted_data['name'] ) ) {
90
- $submitted_data['name'] = sanitize_text_field( $submitted_data['name'] );
91
- }
92
- forminator_addon_maybe_log( __METHOD__, $submitted_data );
93
-
94
- $notification = array();
95
-
96
- foreach ( $current_data as $key => $value ) {
97
- if ( isset( $submitted_data[ $key ] ) ) {
98
- $current_data[ $key ] = $submitted_data[ $key ];
99
- } elseif ( isset( $this->addon_form_settings[ $multi_id ][ $key ] ) ) {
100
- $current_data[ $key ] = $this->addon_form_settings[ $multi_id ][ $key ];
101
- }
102
- }
103
-
104
- $error_message = '';
105
- $input_error_messages = '';
106
-
107
- try {
108
- if ( $is_submit ) {
109
- $input_exceptions = new Forminator_Addon_Zapier_Form_Settings_Exception();
110
- if ( empty( $current_data['name'] ) ) {
111
- $input_exceptions->add_input_exception( __( 'Please create a name for this Zapier integration', 'forminator' ), 'name' );
112
- }
113
-
114
- $this->validate_and_send_sample( $submitted_data, $input_exceptions );
115
- $this->addon_form_settings = array_merge(
116
- $this->addon_form_settings,
117
- array(
118
- $multi_id => array(
119
- 'webhook_url' => $submitted_data['webhook_url'],
120
- 'name' => $submitted_data['name'],
121
- ),
122
- )
123
- );
124
-
125
- $this->save_form_settings_values( $this->addon_form_settings );
126
- $notification = array(
127
- 'type' => 'success',
128
- 'text' => '<strong>' . $this->addon->get_title() . ' [' . esc_html( $submitted_data['name'] ) . ']</strong> '
129
- . __( 'Successfully connected and sent sample data to your ZAP' ),
130
- );
131
- }
132
- } catch ( Forminator_Addon_Zapier_Form_Settings_Exception $e ) {
133
- $input_error_messages = $e->get_input_exceptions();
134
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
135
- $error_message = '<div role="alert" class="sui-notice sui-notice-red sui-active" style="display: block; text-align: left;" aria-live="assertive">';
136
-
137
- $error_message .= '<div class="sui-notice-content">';
138
-
139
- $error_message .= '<div class="sui-notice-message">';
140
-
141
- $error_message .= '<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>';
142
-
143
- $error_message .= '<p>' . $e->getMessage() . '</p>';
144
-
145
- $error_message .= '</div>';
146
-
147
- $error_message .= '</div>';
148
-
149
- $error_message .= '</div>';
150
- }
151
-
152
- $buttons = array();
153
- if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
154
- $buttons['disconnect']['markup'] = Forminator_Addon_Zapier::get_button_markup(
155
- esc_html__( 'Deactivate', 'forminator' ),
156
- 'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
157
- esc_html__( 'Deactivate Zapier from this Form.', 'forminator' )
158
- );
159
- }
160
-
161
- $buttons['next']['markup'] = '<div class="sui-actions-right">' .
162
- Forminator_Addon_Zapier::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
163
- '</div>';
164
-
165
- $help_message = esc_html__( 'Put your ZAP Webhook URL below.', 'forminator' );
166
-
167
- $notice_message = sprintf(
168
- /* translators: ... */
169
- __( 'Please go %1$shere%2$s if you do not have any ZAP created. Remember to choose %3$s as Trigger App.', 'forminator' ),
170
- '<a href="' . $this->new_zap_url . '" target="_blank">',
171
- '</a>',
172
- '<strong>Webhooks by Zapier</strong>'
173
- );
174
-
175
- return array(
176
- 'html' => '<div class="forminator-integration-popup__header"><h3 class="sui-box-title sui-lg" id="dialogTitle2">' . __( 'Setup Webhook', 'forminator' ) . '</h3>
177
- <p class="sui-description">' . $help_message . '</p>
178
- ' . $error_message . '</div>
179
- <form enctype="multipart/form-data">
180
- <div class="sui-form-field ' . ( isset( $input_error_messages['name'] ) ? 'sui-form-field-error' : '' ) . '">
181
- <label class="sui-label">' . esc_html__( 'Zapier Integration Name', 'forminator' ) . '</label>
182
- <div class="sui-control-with-icon">
183
- <input type="text"
184
- name="name"
185
- placeholder="' . esc_attr__( 'Friendly Name', 'forminator' ) . '"
186
- value="' . esc_attr( $current_data['name'] ) . '"
187
- class="sui-form-control"
188
- />
189
- <i class="sui-icon-web-globe-world" aria-hidden="true"></i>
190
- </div>
191
- ' . ( isset( $input_error_messages['name'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['name'] ) . '</span>' : '' ) . '
192
- </div>
193
- <div class="sui-form-field ' . ( isset( $input_error_messages['webhook_url'] ) ? 'sui-form-field-error' : '' ) . '">
194
- <label class="sui-label">' . esc_html__( 'Webhook URL', 'forminator' ) . '</label>
195
- <div class="sui-control-with-icon">
196
- <input
197
- type="text"
198
- name="webhook_url"
199
- placeholder="' . esc_attr__( 'Webhook URL', 'forminator' ) . '"
200
- value="' . esc_attr( $current_data['webhook_url'] ) . '"
201
- class="sui-form-control" />
202
- <i class="sui-icon-link" aria-hidden="true"></i>
203
- </div>
204
- ' . ( isset( $input_error_messages['webhook_url'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['webhook_url'] ) . '</span>' : '' ) . '
205
- </div>
206
- <input type="hidden" name="multi_id" value="' . esc_attr( $multi_id ) . '" />
207
- </form>
208
- <div role="alert" class="sui-notice sui-notice-red sui-active" style="display: block; text-align: left;" aria-live="assertive">
209
-
210
- <div class="sui-notice-content">
211
-
212
- <div class="sui-notice-message">
213
-
214
- <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
215
-
216
- <p>' . $notice_message . '</p>
217
-
218
- </div>
219
-
220
- </div>
221
-
222
- </div>',
223
- 'redirect' => false,
224
- 'is_close' => ( $is_submit && empty( $error_message ) && empty( $input_error_messages ) ),
225
- 'buttons' => $buttons,
226
- 'has_errors' => ( ! empty( $error_message ) || ! empty( $input_error_messages ) ),
227
- 'notification' => $notification,
228
- );
229
-
230
- }
231
-
232
-
233
- /**
234
- * Sending test sample to zapier webhook URL
235
- * Data sent will be used on zapier to map fields on their zap action
236
- *
237
- * @since 1.0 Zapier Addon
238
- *
239
- * @param $submitted_data
240
- * @param Forminator_Addon_Zapier_Form_Settings_Exception $current_input_exception
241
- *
242
- * @throws Forminator_Addon_Zapier_Form_Settings_Exception
243
- * @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
244
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
245
- */
246
- private function validate_and_send_sample( $submitted_data, Forminator_Addon_Zapier_Form_Settings_Exception $current_input_exception ) {
247
- $form_id = $this->form_id;
248
- if ( ! isset( $submitted_data['webhook_url'] ) ) {
249
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
250
- throw $current_input_exception;
251
- }
252
-
253
- // must be this prefix.
254
- if ( stripos( $submitted_data['webhook_url'], 'https://hooks.zapier.com/' ) !== 0 ) {
255
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
256
- throw $current_input_exception;
257
- }
258
-
259
- // must not be in silent mode.
260
- if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
261
- $current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url' );
262
- throw $current_input_exception;
263
- }
264
-
265
- $endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
266
- if ( false === $endpoint ) {
267
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
268
- throw $current_input_exception;
269
- }
270
-
271
- if ( $current_input_exception->input_exceptions_is_available() ) {
272
- throw $current_input_exception;
273
- }
274
-
275
- $connection_settings = $submitted_data;
276
- /**
277
- * Filter Endpoint Webhook URL to send
278
- *
279
- * @since 1.1
280
- *
281
- * @param string $endpoint
282
- * @param int $form_id current Form ID.
283
- * @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
284
- */
285
- $endpoint = apply_filters(
286
- 'forminator_addon_zapier_endpoint',
287
- $endpoint,
288
- $form_id,
289
- $connection_settings
290
- );
291
-
292
- forminator_addon_maybe_log( __METHOD__, $endpoint );
293
- $api = $this->addon->get_api( $endpoint );
294
-
295
- // build form sample data.
296
- $sample_data = $this->build_form_sample_data();
297
- $sample_data['is_test'] = true;
298
-
299
- /**
300
- * Filter sample data to send to Zapier Webhook URL
301
- *
302
- * It fires when user saved Zapier connection on Form Settings Page.
303
- * Sample data contains `is_test` key with value `true`,
304
- * this key indicating that it wont process trigger on Zapier.
305
- *
306
- * @since 1.1
307
- *
308
- * @param array $sample_data
309
- * @param int $form_id current Form ID.
310
- * @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
311
- */
312
- $sample_data = apply_filters(
313
- 'forminator_addon_zapier_sample_data',
314
- $sample_data,
315
- $form_id,
316
- $submitted_data
317
- );
318
-
319
- $api->post_( $sample_data );
320
- }
321
-
322
- /**
323
- * Build seample data form current fields
324
- *
325
- * @since 1.0 Zapier Addon
326
- *
327
- * @return array
328
- */
329
- private function build_form_sample_data() {
330
- $form_fields = $this->form_fields;
331
-
332
- $sample_data = array();
333
- foreach ( $form_fields as $form_field ) {
334
- $sample_data[ $form_field['element_id'] ] = $form_field['field_label'];
335
-
336
- if ( 'upload' === $form_field['type'] ) {
337
-
338
- $sample_file_path = '/fake/path';
339
- $upload_dir = wp_get_upload_dir();
340
- if ( isset( $upload_dir['basedir'] ) ) {
341
- $sample_file_path = $upload_dir['basedir'];
342
- }
343
-
344
- $sample_data[ $form_field['element_id'] ] = array(
345
- 'name' => $form_field['field_label'],
346
- 'type' => 'image/png',
347
- 'size' => 0,
348
- 'file_url' => get_home_url(),
349
- 'file_path' => $sample_file_path,
350
- );
351
- }
352
- }
353
-
354
- //send form title, date
355
- $sample_data['form-title'] = $this->form_settings['formName'];
356
- $sample_data['entry-time'] = current_time( 'Y-m-d H:i:s' );
357
-
358
- // wrap in array as zapier best practices.
359
- return array( $sample_data );
360
- }
361
-
362
- /**
363
- * Check if setup webhook url is completed
364
- *
365
- * @since 1.0 Zapier Addon
366
- *
367
- * @param $submitted_data
368
- *
369
- * @return bool
370
- */
371
- public function setup_webhook_url_is_completed( $submitted_data ) {
372
-
373
- $multi_id = '';
374
- if ( isset( $submitted_data['multi_id'] ) ) {
375
- $multi_id = $submitted_data['multi_id'];
376
- }
377
-
378
- if ( empty( $multi_id ) ) {
379
- return false;
380
- }
381
-
382
- $name = $this->get_multi_id_form_settings_value( $multi_id, 'name', '' );
383
- $name = trim( $name );
384
- if ( empty( $name ) ) {
385
- return false;
386
- }
387
- $webhook_url = $this->get_multi_id_form_settings_value( $multi_id, 'webhook_url', '' );
388
- $webhook_url = trim( $webhook_url );
389
- if ( empty( $webhook_url ) ) {
390
- return false;
391
- }
392
-
393
- return true;
394
- }
395
-
396
- /**
397
- * Find one active connection on current form
398
- *
399
- * @since 1.0 Zapier Addon
400
- *
401
- * @return bool|array false on no connection, or settings on available
402
- */
403
- public function find_one_active_connection() {
404
- $addon_form_settings = $this->get_form_settings_values();
405
-
406
- // backward compat old version.
407
- if ( isset( $addon_form_settings['webhook_url'] ) ) {
408
- // convert to multi id type.
409
- $new_id = $this->generate_multi_id();
410
- $addon_form_settings['name'] = $new_id;
411
- $this->save_form_settings_values( array( $new_id => $addon_form_settings ) );
412
-
413
- return $this->find_one_active_connection();
414
- }
415
-
416
- foreach ( $addon_form_settings as $multi_id => $addon_form_setting ) {
417
- if ( true === $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
418
- return $addon_form_setting;
419
- }
420
- }
421
-
422
- return false;
423
- }
424
-
425
- /**
426
- * Generate multi id for multiple connection
427
- *
428
- * @since 1.0 Zapier Addon
429
- * @since 1.2 change method to non static
430
- * @return string
431
- */
432
- public function generate_multi_id() {
433
- return uniqid( 'zapier_', true );
434
- }
435
-
436
-
437
- /**
438
- * Override how multi connection displayed
439
- *
440
- * @since 1.0 Zapier Addon
441
- * @return array
442
- */
443
- public function get_multi_ids() {
444
- $multi_ids = array();
445
- foreach ( $this->get_form_settings_values() as $key => $value ) {
446
- $multi_ids[] = array(
447
- 'id' => $key,
448
- // use name that was added by user on creating connection.
449
- 'label' => isset( $value['name'] ) ? $value['name'] : $key,
450
- );
451
- }
452
-
453
- return $multi_ids;
454
- }
455
-
456
- /**
457
- * Disconnect a connection from current form
458
- *
459
- * @since 1.0 Zapier Addon
460
- *
461
- * @param array $submitted_data
462
- */
463
- public function disconnect_form( $submitted_data ) {
464
- // only execute if multi_id provided on submitted data.
465
- if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
466
- $addon_form_settings = $this->get_form_settings_values();
467
- unset( $addon_form_settings[ $submitted_data['multi_id'] ] );
468
- $this->save_form_settings_values( $addon_form_settings );
469
- }
470
- }
471
-
472
- /**
473
- * Check if multi_id form settings values completed
474
- *
475
- * @param int $multi_id ID.
476
- * @return bool
477
- */
478
- public function is_multi_form_settings_complete( $multi_id ) {
479
- $data = array( 'multi_id' => $multi_id );
480
-
481
- if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
482
- return false;
483
- }
484
-
485
- return true;
486
- }
487
  }
1
  <?php
2
 
 
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Form_Settings extends Forminator_Addon_Form_Settings_Abstract {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier-poll-hooks.php CHANGED
@@ -1,364 +1,10 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Poll_Hooks
5
- *
6
- * @since 1.6.1
7
- *
8
  */
9
  class Forminator_Addon_Zapier_Poll_Hooks extends Forminator_Addon_Poll_Hooks_Abstract {
10
 
11
- /**
12
- * Addon instance are auto available form abstract
13
- * Its added here for development purpose,
14
- * Auto-complete will resolve addon directly to `Zapier` instance instead of the abstract
15
- * And its public properties can be exposed
16
- *
17
- * @since 1.6.1
18
- * @var Forminator_Addon_Zapier
19
- */
20
- protected $addon;
21
-
22
- /**
23
- * Poll Settings Instance
24
- *
25
- * @since 1.6.1
26
- * @var Forminator_Addon_Zapier_Poll_Settings | null
27
- */
28
- protected $poll_settings_instance;
29
-
30
- /**
31
- * Forminator_Addon_Zapier_Poll_Hooks constructor.
32
- *
33
- * @since 1.6.1
34
- *
35
- * @param Forminator_Addon_Abstract $addon
36
- * @param $poll_id
37
- *
38
- * @throws Forminator_Addon_Exception
39
- */
40
- public function __construct( Forminator_Addon_Abstract $addon, $poll_id ) {
41
- parent::__construct( $addon, $poll_id );
42
- $this->_submit_poll_error_message = __( 'Zapier failed to process submitted data. Please check your form and try again', 'forminator' );
43
- }
44
-
45
- /**
46
- * Save status of request sent and received for each connected zap(s)
47
- *
48
- * @since 1.6.1
49
- *
50
- * @param array $submitted_data
51
- * @param array $current_entry_fields
52
- *
53
- * @return array
54
- */
55
- public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
56
-
57
- $poll_id = $this->poll_id;
58
- $poll_settings_instance = $this->poll_settings_instance;
59
-
60
- /**
61
- * Filter zapier submitted form data to be processed
62
- *
63
- * @since 1.6.1
64
- *
65
- * @param array $submitted_data
66
- * @param int $poll_id current Form ID.
67
- * @param Forminator_Addon_Zapier_Form_Settings $poll_settings_instance Zapier Addon Form Settings instance.
68
- */
69
- $submitted_data = apply_filters(
70
- 'forminator_addon_zapier_poll_submitted_data',
71
- $submitted_data,
72
- $poll_id,
73
- $poll_settings_instance
74
- );
75
-
76
- forminator_addon_maybe_log( __METHOD__, $submitted_data );
77
-
78
- $addon_setting_values = $this->poll_settings_instance->get_poll_settings_values();
79
- $poll_settings = $this->poll_settings_instance->get_poll_settings();
80
-
81
- $data = array();
82
-
83
- /**
84
- * Fires before sending data to Webhook URL(s)
85
- *
86
- * @since 1.6.1
87
- *
88
- * @param int $poll_id current Poll ID.
89
- * @param array $submitted_data
90
- * @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Addon Poll Settings instance.
91
- */
92
- do_action( 'forminator_addon_zapier_poll_before_post_to_webhook', $poll_id, $submitted_data, $poll_settings_instance );
93
-
94
- foreach ( $addon_setting_values as $key => $addon_setting_value ) {
95
- // save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to zapier.
96
- $data[] = array(
97
- 'name' => 'status-' . $key,
98
- 'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $poll_settings ),
99
- );
100
- }
101
-
102
- $entry_fields = $data;
103
- /**
104
- * Filter zapier entry fields to be saved to entry model
105
- *
106
- * @since 1.6.1
107
- *
108
- * @param array $entry_fields
109
- * @param int $poll_id current Poll ID.
110
- * @param array $submitted_data
111
- * @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
112
- */
113
- $data = apply_filters(
114
- 'forminator_addon_zapier_poll_entry_fields',
115
- $entry_fields,
116
- $poll_id,
117
- $submitted_data,
118
- $poll_settings_instance
119
- );
120
-
121
- return $data;
122
-
123
- }
124
-
125
- /**
126
- * Get status on sending data to zapier
127
- *
128
- * @since 1.6.1
129
- *
130
- * @param $connection_id
131
- * @param $submitted_data
132
- * @param $connection_settings
133
- * @param $poll_settings
134
- *
135
- * @return array `is_sent` true means its success send data to zapier, false otherwise
136
- */
137
- private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $poll_settings ) {
138
- // initialize as null.
139
- $zapier_api = null;
140
-
141
- $poll_id = $this->poll_id;
142
- $poll_settings_instance = $this->poll_settings_instance;
143
-
144
- //check required fields
145
- try {
146
- if ( ! isset( $connection_settings['webhook_url'] ) ) {
147
- throw new Forminator_Addon_Zapier_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
148
- }
149
-
150
- $endpoint = $connection_settings['webhook_url'];
151
- /**
152
- * Filter Endpoint Webhook URL to send
153
- *
154
- * @since 1.6.1
155
- *
156
- * @param string $endpoint
157
- * @param int $poll_id current Form ID.
158
- * @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
159
- */
160
- $endpoint = apply_filters(
161
- 'forminator_addon_zapier_poll_endpoint',
162
- $endpoint,
163
- $poll_id,
164
- $connection_settings
165
- );
166
-
167
- $zapier_api = $this->addon->get_api( $endpoint );
168
-
169
- $args = array();
170
- $args['poll-name'] = forminator_get_name_from_model( $this->poll );
171
-
172
- $answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
173
- $extra_field = isset( $submitted_data[ $this->poll_id . '-extra' ] ) ? $submitted_data[ $this->poll_id . '-extra' ] : '';
174
- $fields_labels = $this->poll->pluck_fields_array( 'title', 'element_id', '1' );
175
-
176
- $answer = isset( $fields_labels[ $answer_data ] ) ? $fields_labels[ $answer_data ] : $answer_data;
177
- $extra = $extra_field;
178
-
179
- $args['vote'] = $answer;
180
- $args['vote-extra'] = $extra;
181
- $args['results'] = array();
182
-
183
- $fields_array = $this->poll->get_fields_as_array();
184
- $map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
185
-
186
- // append new answer.
187
- if ( ! $this->poll->is_prevent_store() ) {
188
- $answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
189
-
190
- $entries = 0;
191
- // exists on map entries.
192
- if ( in_array( $answer_data, array_keys( $map_entries ), true ) ) {
193
- $entries = $map_entries[ $answer_data ];
194
- }
195
-
196
- $entries ++;
197
- $map_entries[ $answer_data ] = $entries;
198
-
199
- }
200
-
201
- $fields = $this->poll->get_fields();
202
-
203
- if ( ! is_null( $fields ) ) {
204
- foreach ( $fields as $field ) {
205
- $label = addslashes( $field->title );
206
-
207
- $slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
208
- $entries = 0;
209
- if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
210
- $entries = $map_entries[ $slug ];
211
- }
212
- $args['results'][ $slug ] = array(
213
- 'label' => $label,
214
- 'votes' => $entries,
215
- );
216
- }
217
- }
218
-
219
- /**
220
- * Filter arguments to passed on to Zapier Webhook API
221
- *
222
- * @since 1.6.1
223
- *
224
- * @param array $args
225
- * @param int $poll_id Current Poll id.
226
- * @param string $connection_id ID of current connection.
227
- * @param array $submitted_data
228
- * @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
229
- * @param array $poll_settings Displayed Poll settings.
230
- * @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
231
- */
232
- $args = apply_filters(
233
- 'forminator_addon_zapier_poll_post_to_webhook_args',
234
- $args,
235
- $poll_id,
236
- $connection_id,
237
- $submitted_data,
238
- $connection_settings,
239
- $poll_settings,
240
- $poll_settings_instance
241
- );
242
-
243
- $zapier_api->post_( $args );
244
-
245
- forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
246
-
247
- return array(
248
- 'is_sent' => true,
249
- 'connection_name' => $connection_settings['name'],
250
- 'description' => __( 'Successfully send data to Zapier', 'forminator' ),
251
- 'data_sent' => $zapier_api->get_last_data_sent(),
252
- 'data_received' => $zapier_api->get_last_data_received(),
253
- 'url_request' => $zapier_api->get_last_url_request(),
254
- );
255
-
256
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
257
- forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Zapier' );
258
-
259
- return array(
260
- 'is_sent' => false,
261
- 'description' => $e->getMessage(),
262
- 'connection_name' => $connection_settings['name'],
263
- 'data_sent' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_sent() : array() ),
264
- 'data_received' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_received() : array() ),
265
- 'url_request' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_url_request() : '' ),
266
- );
267
- }
268
- }
269
-
270
- /**
271
- * Zapier will add a column on the title/header row
272
- * its called `Zapier Info` which can be translated on forminator lang
273
- *
274
- * @since 1.6.1
275
- * @return array
276
- */
277
- public function on_export_render_title_row() {
278
-
279
- $export_headers = array(
280
- 'info' => __( 'Zapier Info', 'forminator' ),
281
- );
282
-
283
- $poll_id = $this->poll_id;
284
- $poll_settings_instance = $this->poll_settings_instance;
285
-
286
- /**
287
- * Filter zapier headers on export file
288
- *
289
- * @since 1.6.1
290
- *
291
- * @param array $export_headers headers to be displayed on export file.
292
- * @param int $poll_id current Form ID.
293
- * @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
294
- */
295
- $export_headers = apply_filters(
296
- 'forminator_addon_zapier_poll_export_headers',
297
- $export_headers,
298
- $poll_id,
299
- $poll_settings_instance
300
- );
301
-
302
- return $export_headers;
303
- }
304
-
305
- /**
306
- * Zapier will add a column that give user information whether sending data to zapier successfully or not
307
- * It will only add one column even its multiple connection, every connection will be separated by comma
308
- *
309
- * @since 1.6.1
310
- *
311
- * @param Forminator_Form_Entry_Model $entry_model
312
- * @param $addon_meta_data
313
- *
314
- * @return array
315
- */
316
- public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
317
-
318
- $poll_id = $this->poll_id;
319
- $poll_settings_instance = $this->poll_settings_instance;
320
-
321
- /**
322
- *
323
- * Filter zapier metadata that previously saved on db to be processed
324
- *
325
- * @since 1.1
326
- *
327
- * @param array $addon_meta_data
328
- * @param int $poll_id current Poll ID.
329
- * @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
330
- */
331
- $addon_meta_data = apply_filters(
332
- 'forminator_addon_zapier_poll_metadata',
333
- $addon_meta_data,
334
- $poll_id,
335
- $poll_settings_instance
336
- );
337
-
338
- $export_columns = array(
339
- 'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
340
- );
341
-
342
- /**
343
- * Filter zapier columns to be displayed on export submissions
344
- *
345
- * @since 1.6.1
346
- *
347
- * @param array $export_columns column to be exported.
348
- * @param int $poll_id current Poll ID.
349
- * @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
350
- * @param array $addon_meta_data meta data saved by addon on entry fields.
351
- * @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
352
- */
353
- $export_columns = apply_filters(
354
- 'forminator_addon_zapier_poll_export_columns',
355
- $export_columns,
356
- $poll_id,
357
- $entry_model,
358
- $addon_meta_data,
359
- $poll_settings_instance
360
- );
361
-
362
- return $export_columns;
363
- }
364
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Poll_Hooks extends Forminator_Addon_Poll_Hooks_Abstract {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier-poll-settings-exception.php CHANGED
@@ -1,68 +1,9 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Poll_Settings_Exception
5
- * Wrapper of Poll Settings Zapier Exception
6
- *
7
- * @since 1.6.1
8
  */
9
  class Forminator_Addon_Zapier_Poll_Settings_Exception extends Forminator_Addon_Zapier_Exception {
10
-
11
- /**
12
- * Holder of input exceptions
13
- *
14
- * @since 1.6.1
15
- * @var array
16
- */
17
- protected $input_exceptions = array();
18
-
19
- /**
20
- * Forminator_Addon_Zapier_Poll_Settings_Exception constructor.
21
- *
22
- * Useful if input_id is needed for later.
23
- * If no input_id needed, use @see Forminator_Addon_Zapier_Exception
24
- *
25
- * @since 1.6.1
26
- *
27
- * @param string $message
28
- * @param string $input_id
29
- */
30
- public function __construct( $message = '', $input_id = '' ) {
31
- parent::__construct( $message, 0 );
32
- if ( ! empty( $input_id ) ) {
33
- $this->add_input_exception( $message, $input_id );
34
- }
35
- }
36
-
37
- /**
38
- * Set exception message for an input
39
- *
40
- * @since 1.6.1
41
- *
42
- * @param $message
43
- * @param $input_id
44
- */
45
- public function add_input_exception( $message, $input_id ) {
46
- $this->input_exceptions[ $input_id ] = $message;
47
- }
48
-
49
- /**
50
- * Get all input exceptions
51
- *
52
- * @since 1.6.1
53
- * @return array
54
- */
55
- public function get_input_exceptions() {
56
- return $this->input_exceptions;
57
- }
58
-
59
- /**
60
- * Check if there is input_exceptions_is_available
61
- *
62
- * @since 1.6.1
63
- * @return bool
64
- */
65
- public function input_exceptions_is_available() {
66
- return count( $this->input_exceptions ) > 0;
67
- }
68
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Poll_Settings_Exception extends Forminator_Addon_Zapier_Exception {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
addons/pro/zapier/class-forminator-addon-zapier-poll-settings.php CHANGED
@@ -1,389 +1,10 @@
1
  <?php
2
 
3
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-poll-settings-exception.php';
4
-
5
  /**
6
- * Class Forminator_Addon_Zapier_Poll_Settings
7
- * Handle how poll settings displayed and saved
8
- *
9
- * @since 1.6.1
10
  */
11
  class Forminator_Addon_Zapier_Poll_Settings extends Forminator_Addon_Poll_Settings_Abstract {
12
 
13
- /**
14
- * @var Forminator_Addon_Zapier
15
- * @since 1.0 Zapier Addon
16
- */
17
- protected $addon;
18
-
19
- /**
20
- * Create Zap URL
21
- *
22
- * @since 1.0 Zapier Addon
23
- * @var string
24
- */
25
- private $new_zap_url = 'https://zapier.com/app/editor/';
26
-
27
- /**
28
- * Forminator_Addon_Zapier_Form_Settings constructor.
29
- *
30
- * @since 1.0 Zapier Addon
31
- *
32
- * @param Forminator_Addon_Abstract $addon
33
- * @param $form_id
34
- *
35
- * @throws Forminator_Addon_Exception
36
- */
37
- public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
38
- parent::__construct( $addon, $form_id );
39
-
40
- $this->_update_poll_settings_error_message = __(
41
- 'The update to your settings for this poll failed, check the form input and try again.',
42
- 'forminator'
43
- );
44
- }
45
-
46
- /**
47
- * Zapier Poll Settings wizard
48
- *
49
- * @since 1.6.1
50
- * @return array
51
- */
52
- public function poll_settings_wizards() {
53
- // numerical array steps.
54
- return array(
55
- // 0
56
- array(
57
- 'callback' => array( $this, 'setup_webhook_url' ),
58
- 'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
59
- ),
60
- );
61
- }
62
-
63
- /**
64
- * Setup webhook url
65
- *
66
- * @since 1.0 Zapier Addon
67
- *
68
- * @param $submitted_data
69
- *
70
- * @return array
71
- */
72
- public function setup_webhook_url( $submitted_data ) {
73
-
74
- $template = forminator_addon_zapier_dir() . 'views/poll-settings/setup-webhook.php';
75
-
76
- if ( ! isset( $submitted_data['multi_id'] ) ) {
77
- return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
78
- }
79
-
80
- $multi_id = $submitted_data['multi_id'];
81
- unset( $submitted_data['multi_id'] );
82
-
83
- $template_params = array(
84
- 'new_zap_url' => $this->new_zap_url,
85
- 'name' => $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' ),
86
- 'webhook_url' => $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' ),
87
- 'multi_id' => $multi_id,
88
- );
89
-
90
- $is_submit = ! empty( $submitted_data );
91
- $has_errors = false;
92
- $is_close = false;
93
- $notification = array();
94
-
95
- if ( $is_submit ) {
96
- $name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
97
- $template_params['name'] = $name;
98
-
99
- $webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
100
- $template_params['webhook_url'] = $webhook_url;
101
-
102
- try {
103
- $input_exceptions = new Forminator_Addon_Zapier_Poll_Settings_Exception();
104
-
105
- if ( empty( $name ) ) {
106
- $input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
107
- }
108
-
109
- $this->validate_and_send_sample( $submitted_data, $input_exceptions );
110
-
111
- if ( $input_exceptions->input_exceptions_is_available() ) {
112
- throw $input_exceptions;
113
- }
114
-
115
- $time_added = $this->get_multi_id_poll_settings_value( $multi_id, 'time_added', time() );
116
- $this->save_multi_id_poll_setting_values(
117
- $multi_id,
118
- array(
119
- 'name' => $name,
120
- 'webhook_url' => $webhook_url,
121
- 'time_added' => $time_added,
122
- )
123
- );
124
-
125
- $notification = array(
126
- 'type' => 'success',
127
- 'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your ZAP', 'forminator' ),
128
- );
129
- $is_close = true;
130
-
131
- } catch ( Forminator_Addon_Zapier_Poll_Settings_Exception $e ) {
132
- $template_params = array_merge( $template_params, $e->get_input_exceptions() );
133
- $has_errors = true;
134
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
135
- $template_params['error_message'] = $e->getMessage();
136
- $has_errors = true;
137
- }
138
- }
139
-
140
- $buttons = array();
141
- if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
142
- $buttons['disconnect']['markup'] = Forminator_Addon_Zapier::get_button_markup(
143
- esc_html__( 'Deactivate', 'forminator' ),
144
- 'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
145
- esc_html__( 'Deactivate Zapier from this Poll.', 'forminator' )
146
- );
147
- }
148
-
149
- $buttons['next']['markup'] = '<div class="sui-actions-right">' .
150
- Forminator_Addon_Zapier::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
151
- '</div>';
152
-
153
- return array(
154
- 'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
155
- 'buttons' => $buttons,
156
- 'redirect' => false,
157
- 'has_errors' => $has_errors,
158
- 'has_back' => false,
159
- 'is_close' => $is_close,
160
- 'notification' => $notification,
161
- );
162
-
163
- }
164
-
165
-
166
- /**
167
- * Sending test sample to zapier webhook URL
168
- * Data sent will be used on zapier to map fields on their zap action
169
- *
170
- * @since 1.0 Zapier Addon
171
- *
172
- * @param $submitted_data
173
- * @param Forminator_Addon_Zapier_Poll_Settings_Exception $current_input_exception
174
- *
175
- * @throws Forminator_Addon_Zapier_Poll_Settings_Exception
176
- * @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
177
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
178
- */
179
- private function validate_and_send_sample( $submitted_data, Forminator_Addon_Zapier_Poll_Settings_Exception $current_input_exception ) {
180
- $poll_id = $this->poll_id;
181
- if ( ! isset( $submitted_data['webhook_url'] ) ) {
182
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
183
- throw $current_input_exception;
184
- }
185
-
186
- // must be this prefix.
187
- if ( stripos( $submitted_data['webhook_url'], 'https://hooks.zapier.com/' ) !== 0 ) {
188
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
189
- throw $current_input_exception;
190
- }
191
-
192
- // must not be in silent mode.
193
- if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
194
- $current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
195
- throw $current_input_exception;
196
- }
197
-
198
- $endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
199
- if ( false === $endpoint ) {
200
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
201
- throw $current_input_exception;
202
- }
203
-
204
- if ( $current_input_exception->input_exceptions_is_available() ) {
205
- throw $current_input_exception;
206
- }
207
-
208
- $connection_settings = $submitted_data;
209
- /**
210
- * Filter Endpoint Webhook URL to send
211
- *
212
- * @since 1.6.1
213
- *
214
- * @param string $endpoint
215
- * @param int $poll_id current Form ID.
216
- * @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
217
- */
218
- $endpoint = apply_filters(
219
- 'forminator_addon_zapier_poll_endpoint',
220
- $endpoint,
221
- $poll_id,
222
- $connection_settings
223
- );
224
-
225
- forminator_addon_maybe_log( __METHOD__, $endpoint );
226
- $api = $this->addon->get_api( $endpoint );
227
-
228
- // build form sample data.
229
- $sample_data = $this->build_form_sample_data();
230
- $sample_data['is_test'] = true;
231
-
232
- /**
233
- * Filter sample data to send to Zapier Webhook URL
234
- *
235
- * It fires when user saved Zapier connection on Form Settings Page.
236
- * Sample data contains `is_test` key with value `true`,
237
- * this key indicating that it wont process trigger on Zapier.
238
- *
239
- * @since 1.6.1
240
- *
241
- * @param array $sample_data
242
- * @param int $poll_id current Form ID.
243
- * @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
244
- */
245
- $sample_data = apply_filters(
246
- 'forminator_addon_zapier_poll_sample_data',
247
- $sample_data,
248
- $poll_id,
249
- $submitted_data
250
- );
251
-
252
- $api->post_( $sample_data );
253
- }
254
-
255
- /**
256
- * Build sample data form current fields
257
- *
258
- * @since 1.6.1
259
- *
260
- * @return array
261
- */
262
- private function build_form_sample_data() {
263
- $sample = array();
264
-
265
- $sample['poll-name'] = forminator_get_name_from_model( $this->poll );
266
- $sample['vote'] = 'Vote';
267
- $sample['vote-extra'] = 'Vote Extra';
268
- $sample['results'] = array();
269
-
270
- $fields_array = $this->poll->get_fields_as_array();
271
- $map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
272
- $fields = $this->poll->get_fields();
273
-
274
- foreach ( $fields as $field ) {
275
- $label = addslashes( $field->title );
276
-
277
- $slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
278
- $entries = 0;
279
- if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
280
- $entries = $map_entries[ $slug ];
281
- }
282
- $sample['results'][ $slug ] = array(
283
- 'label' => $label,
284
- 'votes' => $entries,
285
- );
286
- }
287
-
288
- // wrap in array as zapier best practices.
289
- return array( $sample );
290
- }
291
-
292
- /**
293
- * Check if setup webhook url is completed
294
- *
295
- * @since 1.6.1
296
- *
297
- * @param $submitted_data
298
- *
299
- * @return bool
300
- */
301
- public function setup_webhook_url_is_completed( $submitted_data ) {
302
- $multi_id = '';
303
- if ( isset( $submitted_data['multi_id'] ) ) {
304
- $multi_id = $submitted_data['multi_id'];
305
- }
306
-
307
- if ( empty( $multi_id ) ) {
308
- return false;
309
- }
310
-
311
- $name = $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' );
312
- $name = trim( $name );
313
- if ( empty( $name ) ) {
314
- return false;
315
- }
316
- $webhook_url = $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' );
317
- $webhook_url = trim( $webhook_url );
318
- if ( empty( $webhook_url ) ) {
319
- return false;
320
- }
321
-
322
- return true;
323
- }
324
-
325
- /**
326
- * Generate multi id for multiple connection
327
- *
328
- * @since 1.6.1
329
- * @return string
330
- */
331
- public function generate_multi_id() {
332
- return uniqid( 'zapier_', true );
333
- }
334
-
335
-
336
- /**
337
- * Override how multi connection displayed
338
- *
339
- * @since 1.6.1
340
- * @return array
341
- */
342
- public function get_multi_ids() {
343
- $multi_ids = array();
344
- foreach ( $this->get_poll_settings_values() as $key => $value ) {
345
- $multi_ids[] = array(
346
- 'id' => $key,
347
- // use name that was added by user on creating connection.
348
- 'label' => isset( $value['name'] ) ? $value['name'] : $key,
349
- );
350
- }
351
-
352
- return $multi_ids;
353
- }
354
-
355
- /**
356
- * Disconnect a connection from current poll
357
- *
358
- * @since 1.6.1
359
- *
360
- * @param array $submitted_data
361
- */
362
- public function disconnect_form( $submitted_data ) {
363
- // only execute if multi_id provided on submitted data.
364
- if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
365
- $addon_poll_settings = $this->get_poll_settings_values();
366
- unset( $addon_poll_settings[ $submitted_data['multi_id'] ] );
367
- $this->save_poll_settings_values( $addon_poll_settings );
368
- }
369
- }
370
-
371
- /**
372
- * Check if multi_id poll settings values completed
373
- *
374
- * @since 1.6.1
375
- *
376
- * @param $multi_id
377
- *
378
- * @return bool
379
- */
380
- public function is_multi_poll_settings_complete( $multi_id ) {
381
- $data = array( 'multi_id' => $multi_id );
382
-
383
- if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
384
- return false;
385
- }
386
-
387
- return true;
388
- }
389
  }
1
  <?php
2
 
 
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Poll_Settings extends Forminator_Addon_Poll_Settings_Abstract {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier-quiz-hooks.php CHANGED
@@ -1,563 +1,10 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Quiz_Hooks
5
- *
6
- * @since 1.6.2
7
- *
8
  */
9
  class Forminator_Addon_Zapier_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
10
 
11
- /**
12
- * Addon instance are auto available form abstract
13
- * Its added here for development purpose,
14
- * Auto-complete will resolve addon directly to `Zapier` instance instead of the abstract
15
- * And its public properties can be exposed
16
- *
17
- * @since 1.6.2
18
- * @var Forminator_Addon_Zapier
19
- */
20
- protected $addon;
21
-
22
- /**
23
- * Quiz Settings Instance
24
- *
25
- * @since 1.6.2
26
- * @var Forminator_Addon_Zapier_Quiz_Settings | null
27
- */
28
- protected $quiz_settings_instance;
29
-
30
- /**
31
- * Forminator_Addon_Zapier_Quiz_Hooks constructor.
32
- *
33
- * @since 1.6.2
34
- *
35
- * @param Forminator_Addon_Abstract $addon
36
- * @param $quiz_id
37
- *
38
- * @throws Forminator_Addon_Exception
39
- */
40
- public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
41
- parent::__construct( $addon, $quiz_id );
42
- $this->_submit_quiz_error_message = __( 'Zapier failed to process submitted data. Please check your form and try again', 'forminator' );
43
- }
44
-
45
- /**
46
- * Save status of request sent and received for each connected zap(s)
47
- *
48
- * @since 1.6.2
49
- *
50
- * @param array $submitted_data
51
- * @param array $current_entry_fields
52
- *
53
- * @return array
54
- */
55
- public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
56
-
57
- $quiz_id = $this->quiz_id;
58
- $quiz_settings_instance = $this->quiz_settings_instance;
59
-
60
- /**
61
- * Filter zapier submitted form data to be processed
62
- *
63
- * @since 1.6.2
64
- *
65
- * @param array $submitted_data
66
- * @param int $quiz_id current Form ID.
67
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Addon Quiz Settings instance.
68
- */
69
- $submitted_data = apply_filters(
70
- 'forminator_addon_zapier_quiz_submitted_data',
71
- $submitted_data,
72
- $quiz_id,
73
- $quiz_settings_instance
74
- );
75
-
76
- forminator_addon_maybe_log( __METHOD__, $submitted_data );
77
-
78
- $addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
79
- $quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
80
-
81
- $data = array();
82
-
83
- /**
84
- * Fires before sending data to Webhook URL(s)
85
- *
86
- * @since 1.6.2
87
- *
88
- * @param int $quiz_id current Quiz ID.
89
- * @param array $submitted_data
90
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Addon Quiz Settings instance.
91
- */
92
- do_action( 'forminator_addon_zapier_quiz_before_post_to_webhook', $quiz_id, $submitted_data, $quiz_settings_instance );
93
-
94
- foreach ( $addon_setting_values as $key => $addon_setting_value ) {
95
- // save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to zapier.
96
- $data[] = array(
97
- 'name' => 'status-' . $key,
98
- 'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $quiz_settings, $current_entry_fields ),
99
- );
100
- }
101
-
102
- $entry_fields = $data;
103
- /**
104
- * Filter zapier entry fields to be saved to entry model
105
- *
106
- * @since 1.6.2
107
- *
108
- * @param array $entry_fields
109
- * @param int $quiz_id current Quiz ID.
110
- * @param array $submitted_data
111
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
112
- */
113
- $data = apply_filters(
114
- 'forminator_addon_zapier_quiz_entry_fields',
115
- $entry_fields,
116
- $quiz_id,
117
- $submitted_data,
118
- $quiz_settings_instance
119
- );
120
-
121
- return $data;
122
-
123
- }
124
-
125
- /**
126
- * Get status on sending data to zapier
127
- *
128
- * @since 1.6.2
129
- *
130
- * @param $connection_id
131
- * @param $submitted_data
132
- * @param $connection_settings
133
- * @param $quiz_settings
134
- * @param $current_entry_fields
135
- *
136
- * @return array `is_sent` true means its success send data to zapier, false otherwise
137
- */
138
- private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $quiz_settings, $current_entry_fields ) {
139
- // initialize as null.
140
- $zapier_api = null;
141
-
142
- $quiz_id = $this->quiz_id;
143
- $quiz_settings_instance = $this->quiz_settings_instance;
144
-
145
- //check required fields
146
- try {
147
- if ( ! isset( $connection_settings['webhook_url'] ) ) {
148
- throw new Forminator_Addon_Zapier_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
149
- }
150
-
151
- $endpoint = $connection_settings['webhook_url'];
152
- /**
153
- * Filter Endpoint Webhook URL to send
154
- *
155
- * @since 1.6.2
156
- *
157
- * @param string $endpoint
158
- * @param int $quiz_id current Form ID.
159
- * @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
160
- */
161
- $endpoint = apply_filters(
162
- 'forminator_addon_zapier_quiz_endpoint',
163
- $endpoint,
164
- $quiz_id,
165
- $connection_settings
166
- );
167
-
168
- $zapier_api = $this->addon->get_api( $endpoint );
169
-
170
- $args = $this->build_post_data( $current_entry_fields, $submitted_data );
171
-
172
- /**
173
- * Filter arguments to passed on to Zapier Webhook API
174
- *
175
- * @since 1.6.2
176
- *
177
- * @param array $args
178
- * @param int $quiz_id Current Quiz id.
179
- * @param string $connection_id ID of current connection.
180
- * @param array $submitted_data
181
- * @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
182
- * @param array $quiz_settings Displayed Quiz settings.
183
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
184
- */
185
- $args = apply_filters(
186
- 'forminator_addon_zapier_quiz_post_to_webhook_args',
187
- $args,
188
- $quiz_id,
189
- $connection_id,
190
- $submitted_data,
191
- $connection_settings,
192
- $quiz_settings,
193
- $quiz_settings_instance
194
- );
195
-
196
- $zapier_api->post_( $args );
197
-
198
- forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
199
-
200
- return array(
201
- 'is_sent' => true,
202
- 'connection_name' => $connection_settings['name'],
203
- 'description' => __( 'Successfully send data to Zapier', 'forminator' ),
204
- 'data_sent' => $zapier_api->get_last_data_sent(),
205
- 'data_received' => $zapier_api->get_last_data_received(),
206
- 'url_request' => $zapier_api->get_last_url_request(),
207
- );
208
-
209
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
210
- forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Zapier' );
211
-
212
- return array(
213
- 'is_sent' => false,
214
- 'description' => $e->getMessage(),
215
- 'connection_name' => $connection_settings['name'],
216
- 'data_sent' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_sent() : array() ),
217
- 'data_received' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_received() : array() ),
218
- 'url_request' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_url_request() : '' ),
219
- );
220
- }
221
- }
222
-
223
- /**
224
- * Build sample data form current fields
225
- *
226
- * @since 1.6.2
227
- *
228
- * @param array $quiz_entry_fields
229
- * @param array $submitted_data
230
- *
231
- * @return array
232
- */
233
- private function build_post_data( $quiz_entry_fields, $submitted_data ) {
234
- $sample = array();
235
-
236
- $sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
237
-
238
- $answers = array();
239
- $correct_answers = 0;
240
- $total_answers = 0;
241
- $nowrong_result = '';
242
- $questions = $this->quiz->questions;
243
-
244
- if ( is_array( $quiz_entry_fields ) && isset( $quiz_entry_fields[0] ) ) {
245
- $quiz_entry = $quiz_entry_fields[0];
246
- if ( isset( $quiz_entry['name'] ) && isset( $quiz_entry['value'] ) && 'entry' === $quiz_entry['name'] ) {
247
- if ( is_array( $quiz_entry['value'] ) ) {
248
-
249
- // KNOWLEDGE.
250
- if ( 'knowledge' === $this->quiz->quiz_type ) {
251
- foreach ( $quiz_entry['value'] as $key => $data ) {
252
- $question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
253
- // bit cleanup.
254
- $question_id = str_replace( 'question-', '', $question_id );
255
-
256
- $question = isset( $data['question'] ) ? $data['question'] : '';
257
- $answer = isset( $data['answer'] ) ? $data['answer'] : '';
258
- $is_correct = isset( $data['isCorrect'] ) ? $data['isCorrect'] : false;
259
-
260
- $answers[ $question_id ] = array(
261
- 'question' => $question,
262
- 'answer' => $answer,
263
- 'is_correct' => $is_correct,
264
- );
265
- if ( $is_correct ) {
266
- $correct_answers ++;
267
- }
268
- $total_answers ++;
269
- }
270
- } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
271
- if ( isset( $quiz_entry['value'][0] )
272
- && is_array( $quiz_entry['value'][0] )
273
- && isset( $quiz_entry['value'][0]['value'] )
274
- && is_array( $quiz_entry['value'][0]['value'] ) ) {
275
-
276
- $quiz_entry = $quiz_entry['value'][0]['value'];
277
-
278
- $nowrong_result = ( isset( $quiz_entry['result'] ) && isset( $quiz_entry['result']['title'] ) ) ? $quiz_entry['result']['title'] : '';
279
-
280
- $entry_questions = ( isset( $quiz_entry['answers'] ) && is_array( $quiz_entry['answers'] ) ) ? $quiz_entry['answers'] : array();
281
-
282
- foreach ( $entry_questions as $key => $entry_question ) {
283
- $question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
284
- // bit cleanup.
285
- $question_id = str_replace( 'question-', '', $question_id );
286
-
287
- $question = isset( $entry_question['question'] ) ? $entry_question['question'] : '';
288
- $answer = isset( $entry_question['answer'] ) ? $entry_question['answer'] : '';
289
-
290
- $answers[ $question_id ] = array(
291
- 'question' => $question,
292
- 'answer' => $answer,
293
- );
294
- }
295
- }
296
- }
297
- }
298
- }
299
- }
300
-
301
- $sample['answers'] = $answers;
302
- $result = array();
303
-
304
- if ( 'knowledge' === $this->quiz->quiz_type ) {
305
- $result['correct'] = $correct_answers;
306
- $result['answers'] = $total_answers;
307
-
308
- } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
309
- $result['result'] = $nowrong_result;
310
- }
311
-
312
- $sample['result'] = $result;
313
-
314
- $quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
315
- $addons_fields = $this->quiz_settings_instance->get_form_fields();
316
- $quiz_submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
317
-
318
- if ( ! empty( $quiz_submitted_data ) ) {
319
- foreach ( $quiz_submitted_data as $s => $quiz_submitted ) {
320
- $sample[ $s ] = $quiz_submitted;
321
- }
322
- }
323
-
324
- // wrap in array as zapier best practices.
325
- return array( $sample );
326
- }
327
-
328
- /**
329
- * Zapier will add a column on the title/header row
330
- * its called `Zapier Info` which can be translated on forminator lang
331
- *
332
- * @since 1.6.2
333
- * @return array
334
- */
335
- public function on_export_render_title_row() {
336
-
337
- $export_headers = array(
338
- 'info' => __( 'Zapier Info', 'forminator' ),
339
- );
340
-
341
- $quiz_id = $this->quiz_id;
342
- $quiz_settings_instance = $this->quiz_settings_instance;
343
-
344
- /**
345
- * Filter zapier headers on export file
346
- *
347
- * @since 1.6.2
348
- *
349
- * @param array $export_headers headers to be displayed on export file.
350
- * @param int $quiz_id current Form ID.
351
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
352
- */
353
- $export_headers = apply_filters(
354
- 'forminator_addon_zapier_quiz_export_headers',
355
- $export_headers,
356
- $quiz_id,
357
- $quiz_settings_instance
358
- );
359
-
360
- return $export_headers;
361
- }
362
-
363
- /**
364
- * Zapier will add a column that give user information whether sending data to zapier successfully or not
365
- * It will only add one column even its multiple connection, every connection will be separated by comma
366
- *
367
- * @since 1.6.2
368
- *
369
- * @param Forminator_Form_Entry_Model $entry_model
370
- * @param $addon_meta_data
371
- *
372
- * @return array
373
- */
374
- public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
375
-
376
- $quiz_id = $this->quiz_id;
377
- $quiz_settings_instance = $this->quiz_settings_instance;
378
-
379
- /**
380
- *
381
- * Filter zapier metadata that previously saved on db to be processed
382
- *
383
- * @since 1.1
384
- *
385
- * @param array $addon_meta_data
386
- * @param int $quiz_id current Quiz ID.
387
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
388
- */
389
- $addon_meta_data = apply_filters(
390
- 'forminator_addon_zapier_quiz_metadata',
391
- $addon_meta_data,
392
- $quiz_id,
393
- $quiz_settings_instance
394
- );
395
-
396
- $export_columns = array(
397
- 'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
398
- );
399
-
400
- /**
401
- * Filter zapier columns to be displayed on export submissions
402
- *
403
- * @since 1.6.2
404
- *
405
- * @param array $export_columns column to be exported.
406
- * @param int $quiz_id current Quiz ID.
407
- * @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
408
- * @param array $addon_meta_data meta data saved by addon on entry fields.
409
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
410
- */
411
- $export_columns = apply_filters(
412
- 'forminator_addon_zapier_quiz_export_columns',
413
- $export_columns,
414
- $quiz_id,
415
- $entry_model,
416
- $addon_meta_data,
417
- $quiz_settings_instance
418
- );
419
-
420
- return $export_columns;
421
- }
422
-
423
- /**
424
- * It wil add new row on entry table of submission page, with couple of subentries
425
- * subentries included are defined in @see Forminator_Addon_Zapier_Quiz_Hooks::get_additional_entry_item()
426
- *
427
- * @since 1.6.1
428
- *
429
- * @param Forminator_Form_Entry_Model $entry_model
430
- * @param $addon_meta_data
431
- *
432
- * @return array
433
- */
434
- public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
435
-
436
- $quiz_id = $this->quiz_id;
437
- $quiz_settings_instance = $this->quiz_settings_instance;
438
-
439
- /**
440
- *
441
- * Filter Zapier metadata that previously saved on db to be processed
442
- *
443
- * @since 1.6.2
444
- *
445
- * @param array $addon_meta_data
446
- * @param int $quiz_id current Quiz ID.
447
- * @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Addon Quiz Settings instance.
448
- */
449
- $addon_meta_data = apply_filters(
450
- 'forminator_addon_quiz_zapier_metadata',
451
- $addon_meta_data,
452
- $quiz_id,
453
- $quiz_settings_instance
454
- );
455
-
456
- $addon_meta_datas = $addon_meta_data;
457
- if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
458
- return array();
459
- }
460
-
461
- return $this->on_render_entry_multi_connection( $addon_meta_datas );
462
-
463
- }
464
-
465
- /**
466
- * Loop through addon meta data on multiple Zapier setup(s)
467
- *
468
- * @since 1.6.1
469
- *
470
- * @param $addon_meta_datas
471
- *
472
- * @return array
473
- */
474
- private function on_render_entry_multi_connection( $addon_meta_datas ) {
475
- $additional_entry_item = array();
476
- foreach ( $addon_meta_datas as $addon_meta_data ) {
477
- $additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
478
- }
479
-
480
- return $additional_entry_item;
481
-
482
- }
483
-
484
- /**
485
- * Format additional entry item as label and value arrays
486
- *
487
- * - Integration Name : its defined by user when they adding Zapier integration on their quiz
488
- * - Sent To Zapier : will be Yes/No value, that indicates whether sending data to Zapier API was successful
489
- * - Info : Text that are generated by addon when building and sending data to Zapier @see Forminator_Addon_Zapier_Quiz_Hooks::add_entry_fields()
490
- * - Below subentries will be added if full log enabled, @see Forminator_Addon_Zapier::is_show_full_log() @see FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG
491
- * - API URL : URL that wes requested when sending data to Zapier
492
- * - Data sent to Zapier : encoded body request that was sent
493
- * - Data received from Zapier : json encoded body response that was received
494
- *
495
- * @param $addon_meta_data
496
- *
497
- * @since 1.6.1
498
- * @return array
499
- */
500
- private function get_additional_entry_item( $addon_meta_data ) {
501
-
502
- if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
503
- return array();
504
- }
505
- $status = $addon_meta_data['value'];
506
- $additional_entry_item = array(
507
- 'label' => __( 'Zapier Integration', 'forminator' ),
508
- 'value' => '',
509
- );
510
-
511
- $sub_entries = array();
512
- if ( isset( $status['connection_name'] ) ) {
513
- $sub_entries[] = array(
514
- 'label' => __( 'Integration Name', 'forminator' ),
515
- 'value' => $status['connection_name'],
516
- );
517
- }
518
-
519
- if ( isset( $status['is_sent'] ) ) {
520
- $is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
521
- $sub_entries[] = array(
522
- 'label' => __( 'Sent To Zapier', 'forminator' ),
523
- 'value' => $is_sent,
524
- );
525
- }
526
-
527
- if ( isset( $status['description'] ) ) {
528
- $sub_entries[] = array(
529
- 'label' => __( 'Info', 'forminator' ),
530
- 'value' => $status['description'],
531
- );
532
- }
533
-
534
- if ( Forminator_Addon_Zapier::is_show_full_log() ) {
535
- // too long to be added on entry data enable this with `define('FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG', true)`.
536
- if ( isset( $status['url_request'] ) ) {
537
- $sub_entries[] = array(
538
- 'label' => __( 'API URL', 'forminator' ),
539
- 'value' => $status['url_request'],
540
- );
541
- }
542
-
543
- if ( isset( $status['data_sent'] ) ) {
544
- $sub_entries[] = array(
545
- 'label' => __( 'Data sent to Zapier', 'forminator' ),
546
- 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
547
- );
548
- }
549
-
550
- if ( isset( $status['data_received'] ) ) {
551
- $sub_entries[] = array(
552
- 'label' => __( 'Data received from Zapier', 'forminator' ),
553
- 'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
554
- );
555
- }
556
- }
557
-
558
- $additional_entry_item['sub_entries'] = $sub_entries;
559
-
560
- // return single array.
561
- return $additional_entry_item;
562
- }
563
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier-quiz-settings-exception.php CHANGED
@@ -1,68 +1,10 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Quiz_Settings_Exception
5
- * Wrapper of Quiz Settings Zapier Exception
6
- *
7
- * @since 1.6.2
8
  */
9
  class Forminator_Addon_Zapier_Quiz_Settings_Exception extends Forminator_Addon_Zapier_Exception {
10
 
11
- /**
12
- * Holder of input exceptions
13
- *
14
- * @since 1.6.2
15
- * @var array
16
- */
17
- protected $input_exceptions = array();
18
-
19
- /**
20
- * Forminator_Addon_Zapier_Quiz_Settings_Exception constructor.
21
- *
22
- * Useful if input_id is needed for later.
23
- * If no input_id needed, use @see Forminator_Addon_Zapier_Exception
24
- *
25
- * @since 1.6.2
26
- *
27
- * @param string $message
28
- * @param string $input_id
29
- */
30
- public function __construct( $message = '', $input_id = '' ) {
31
- parent::__construct( $message, 0 );
32
- if ( ! empty( $input_id ) ) {
33
- $this->add_input_exception( $message, $input_id );
34
- }
35
- }
36
-
37
- /**
38
- * Set exception message for an input
39
- *
40
- * @since 1.6.2
41
- *
42
- * @param $message
43
- * @param $input_id
44
- */
45
- public function add_input_exception( $message, $input_id ) {
46
- $this->input_exceptions[ $input_id ] = $message;
47
- }
48
-
49
- /**
50
- * Get all input exceptions
51
- *
52
- * @since 1.6.2
53
- * @return array
54
- */
55
- public function get_input_exceptions() {
56
- return $this->input_exceptions;
57
- }
58
-
59
- /**
60
- * Check if there is input_exceptions_is_available
61
- *
62
- * @since 1.6.2
63
- * @return bool
64
- */
65
- public function input_exceptions_is_available() {
66
- return count( $this->input_exceptions ) > 0;
67
- }
68
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Quiz_Settings_Exception extends Forminator_Addon_Zapier_Exception {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier-quiz-settings.php CHANGED
@@ -1,437 +1,10 @@
1
  <?php
2
 
3
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-quiz-settings-exception.php';
4
-
5
  /**
6
- * Class Forminator_Addon_Zapier_Quiz_Settings
7
- * Handle how quiz settings displayed and saved
8
- *
9
- * @since 1.6.2
10
  */
11
  class Forminator_Addon_Zapier_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
12
 
13
- /**
14
- * @var Forminator_Addon_Zapier
15
- * @since 1.0 Zapier Addon
16
- */
17
- protected $addon;
18
-
19
- /**
20
- * Create Zap URL
21
- *
22
- * @since 1.0 Zapier Addon
23
- * @var string
24
- */
25
- private $new_zap_url = 'https://zapier.com/app/editor/';
26
-
27
- /**
28
- * Forminator_Addon_Zapier_Form_Settings constructor.
29
- *
30
- * @since 1.0 Zapier Addon
31
- *
32
- * @param Forminator_Addon_Abstract $addon
33
- * @param $form_id
34
- *
35
- * @throws Forminator_Addon_Exception
36
- */
37
- public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
38
- parent::__construct( $addon, $form_id );
39
-
40
- $this->_update_quiz_settings_error_message = __(
41
- 'The update to your settings for this quiz failed, check the form input and try again.',
42
- 'forminator'
43
- );
44
- }
45
-
46
- /**
47
- * Zapier Quiz Settings wizard
48
- *
49
- * @since 1.6.2
50
- * @return array
51
- */
52
- public function quiz_settings_wizards() {
53
- // numerical array steps.
54
- return array(
55
- // 0
56
- array(
57
- 'callback' => array( $this, 'setup_webhook_url' ),
58
- 'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
59
- ),
60
- );
61
- }
62
-
63
- /**
64
- * Setup webhook url
65
- *
66
- * @since 1.0 Zapier Addon
67
- *
68
- * @param $submitted_data
69
- *
70
- * @return array
71
- */
72
- public function setup_webhook_url( $submitted_data ) {
73
-
74
- $template = forminator_addon_zapier_dir() . 'views/quiz-settings/setup-webhook.php';
75
-
76
- if ( ! isset( $submitted_data['multi_id'] ) ) {
77
- return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
78
- }
79
-
80
- $multi_id = $submitted_data['multi_id'];
81
- unset( $submitted_data['multi_id'] );
82
-
83
- $template_params = array(
84
- 'new_zap_url' => $this->new_zap_url,
85
- 'name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' ),
86
- 'webhook_url' => $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' ),
87
- 'multi_id' => $multi_id,
88
- );
89
-
90
- $is_submit = ! empty( $submitted_data );
91
- $has_errors = false;
92
- $is_close = false;
93
- $notification = array();
94
-
95
- if ( $is_submit ) {
96
- $name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
97
- $template_params['name'] = $name;
98
-
99
- $webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
100
- $template_params['webhook_url'] = $webhook_url;
101
-
102
- try {
103
- $input_exceptions = new Forminator_Addon_Zapier_Quiz_Settings_Exception();
104
-
105
- if ( empty( $name ) ) {
106
- $input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
107
- }
108
-
109
- $this->validate_and_send_sample( $submitted_data, $input_exceptions );
110
-
111
- if ( $input_exceptions->input_exceptions_is_available() ) {
112
- throw $input_exceptions;
113
- }
114
-
115
- $time_added = $this->get_multi_id_quiz_settings_value( $multi_id, 'time_added', time() );
116
- $this->save_multi_id_quiz_setting_values(
117
- $multi_id,
118
- array(
119
- 'name' => $name,
120
- 'webhook_url' => $webhook_url,
121
- 'time_added' => $time_added,
122
- )
123
- );
124
-
125
- $notification = array(
126
- 'type' => 'success',
127
- 'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your ZAP', 'forminator' ),
128
- );
129
- $is_close = true;
130
-
131
- } catch ( Forminator_Addon_Zapier_Quiz_Settings_Exception $e ) {
132
- $template_params = array_merge( $template_params, $e->get_input_exceptions() );
133
- $has_errors = true;
134
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
135
- $template_params['error_message'] = $e->getMessage();
136
- $has_errors = true;
137
- }
138
- }
139
-
140
- $buttons = array();
141
- if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
142
- $buttons['disconnect']['markup'] = Forminator_Addon_Zapier::get_button_markup(
143
- esc_html__( 'Deactivate', 'forminator' ),
144
- 'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
145
- esc_html__( 'Deactivate Zapier from this Quiz.', 'forminator' )
146
- );
147
- }
148
-
149
- $buttons['next']['markup'] = '<div class="sui-actions-right">' .
150
- Forminator_Addon_Zapier::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
151
- '</div>';
152
-
153
- return array(
154
- 'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
155
- 'buttons' => $buttons,
156
- 'redirect' => false,
157
- 'has_errors' => $has_errors,
158
- 'has_back' => false,
159
- 'is_close' => $is_close,
160
- 'notification' => $notification,
161
- );
162
-
163
- }
164
-
165
-
166
- /**
167
- * Sending test sample to zapier webhook URL
168
- * Data sent will be used on zapier to map fields on their zap action
169
- *
170
- * @since 1.0 Zapier Addon
171
- *
172
- * @param $submitted_data
173
- * @param Forminator_Addon_Zapier_Quiz_Settings_Exception $current_input_exception
174
- *
175
- * @throws Forminator_Addon_Zapier_Quiz_Settings_Exception
176
- * @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
177
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
178
- */
179
- private function validate_and_send_sample( $submitted_data, Forminator_Addon_Zapier_Quiz_Settings_Exception $current_input_exception ) {
180
- $quiz_id = $this->quiz_id;
181
- if ( ! isset( $submitted_data['webhook_url'] ) ) {
182
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
183
- throw $current_input_exception;
184
- }
185
-
186
- // must be this prefix.
187
- if ( stripos( $submitted_data['webhook_url'], 'https://hooks.zapier.com/' ) !== 0 ) {
188
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
189
- throw $current_input_exception;
190
- }
191
-
192
- // must not be in silent mode.
193
- if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
194
- $current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
195
- throw $current_input_exception;
196
- }
197
-
198
- $endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
199
- if ( false === $endpoint ) {
200
- $current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
201
- throw $current_input_exception;
202
- }
203
-
204
- if ( $current_input_exception->input_exceptions_is_available() ) {
205
- throw $current_input_exception;
206
- }
207
-
208
- $connection_settings = $submitted_data;
209
- /**
210
- * Filter Endpoint Webhook URL to send
211
- *
212
- * @since 1.6.2
213
- *
214
- * @param string $endpoint
215
- * @param int $quiz_id current Form ID.
216
- * @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
217
- */
218
- $endpoint = apply_filters(
219
- 'forminator_addon_zapier_quiz_endpoint',
220
- $endpoint,
221
- $quiz_id,
222
- $connection_settings
223
- );
224
-
225
- forminator_addon_maybe_log( __METHOD__, $endpoint );
226
- $api = $this->addon->get_api( $endpoint );
227
-
228
- // build form sample data.
229
- $sample_data = $this->build_form_sample_data();
230
- $sample_data['is_test'] = true;
231
-
232
- /**
233
- * Filter sample data to send to Zapier Webhook URL
234
- *
235
- * It fires when user saved Zapier connection on Form Settings Page.
236
- * Sample data contains `is_test` key with value `true`,
237
- * this key indicating that it wont process trigger on Zapier.
238
- *
239
- * @since 1.6.2
240
- *
241
- * @param array $sample_data
242
- * @param int $quiz_id current Form ID.
243
- * @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
244
- */
245
- $sample_data = apply_filters(
246
- 'forminator_addon_zapier_quiz_sample_data',
247
- $sample_data,
248
- $quiz_id,
249
- $submitted_data
250
- );
251
-
252
- $api->post_( $sample_data );
253
- }
254
-
255
- /**
256
- * Build sample data form current fields
257
- *
258
- * @since 1.6.2
259
- *
260
- * @return array
261
- */
262
- private function build_form_sample_data() {
263
- $sample = array();
264
-
265
- $sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
266
- $answers = array();
267
-
268
- $num_correct = 0;
269
-
270
- $questions = $this->quiz->questions;
271
-
272
- foreach ( $questions as $question ) {
273
- $question_title = isset( $question['title'] ) ? $question['title'] : '';
274
- $question_id = isset( $question['slug'] ) ? $question['slug'] : uniqid();
275
-
276
- // bit cleanup.
277
- $question_id = str_replace( 'question-', '', $question_id );
278
- $answer_title = 'Sample Answer';
279
-
280
- $answer = array(
281
- 'question' => $question_title,
282
- 'answer' => $answer_title,
283
- );
284
-
285
- if ( 'knowledge' === $this->quiz->quiz_type ) {
286
- $answer['is_correct'] = wp_rand( 0, 1 ) ? true : false;
287
-
288
- if ( $answer['is_correct'] ) {
289
- $num_correct ++;
290
- }
291
- }
292
-
293
- $answers[ $question_id ] = $answer;
294
- }
295
-
296
- $sample['answers'] = $answers;
297
- $result = array();
298
-
299
- if ( 'knowledge' === $this->quiz->quiz_type ) {
300
- $result['correct'] = $num_correct;
301
- $result['answers'] = count( $answers );
302
-
303
- } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
304
- $results = $this->quiz->results;
305
- $random_result_key = array_rand( $results );
306
- $result_title = ( ( isset( $results[ $random_result_key ] ) && isset( $results[ $random_result_key ]['title'] ) ) ? $results[ $random_result_key ]['title'] : '' );
307
- $result['result'] = $result_title;
308
- }
309
-
310
- $sample['result'] = $result;
311
-
312
- $form_fields = isset( $this->form_fields ) ? $this->form_fields : array();
313
- if ( ! empty( $form_fields ) ) {
314
- foreach ( $form_fields as $form_field ) {
315
- $sample[ $form_field['element_id'] ] = $form_field['field_label'];
316
-
317
- if ( 'upload' === $form_field['type'] ) {
318
-
319
- $sample_file_path = '/fake/path';
320
- $upload_dir = wp_get_upload_dir();
321
- if ( isset( $upload_dir['basedir'] ) ) {
322
- $sample_file_path = $upload_dir['basedir'];
323
- }
324
-
325
- $sample[ $form_field['element_id'] ] = array(
326
- 'name' => $form_field['field_label'],
327
- 'type' => 'image/png',
328
- 'size' => 0,
329
- 'file_url' => get_home_url(),
330
- 'file_path' => $sample_file_path,
331
- );
332
- }
333
- }
334
- }
335
-
336
- // wrap in array as zapier best practices.
337
- return array( $sample );
338
- }
339
-
340
- /**
341
- * Check if setup webhook url is completed
342
- *
343
- * @since 1.6.2
344
- *
345
- * @param $submitted_data
346
- *
347
- * @return bool
348
- */
349
- public function setup_webhook_url_is_completed( $submitted_data ) {
350
- $multi_id = '';
351
- if ( isset( $submitted_data['multi_id'] ) ) {
352
- $multi_id = $submitted_data['multi_id'];
353
- }
354
-
355
- if ( empty( $multi_id ) ) {
356
- return false;
357
- }
358
-
359
- $name = $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' );
360
- $name = trim( $name );
361
- if ( empty( $name ) ) {
362
- return false;
363
- }
364
- $webhook_url = $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' );
365
- $webhook_url = trim( $webhook_url );
366
- if ( empty( $webhook_url ) ) {
367
- return false;
368
- }
369
-
370
- return true;
371
- }
372
-
373
- /**
374
- * Generate multi id for multiple connection
375
- *
376
- * @since 1.6.2
377
- * @return string
378
- */
379
- public function generate_multi_id() {
380
- return uniqid( 'zapier_', true );
381
- }
382
-
383
-
384
- /**
385
- * Override how multi connection displayed
386
- *
387
- * @since 1.6.2
388
- * @return array
389
- */
390
- public function get_multi_ids() {
391
- $multi_ids = array();
392
- foreach ( $this->get_quiz_settings_values() as $key => $value ) {
393
- $multi_ids[] = array(
394
- 'id' => $key,
395
- // use name that was added by user on creating connection.
396
- 'label' => isset( $value['name'] ) ? $value['name'] : $key,
397
- );
398
- }
399
-
400
- return $multi_ids;
401
- }
402
-
403
- /**
404
- * Disconnect a connection from current quiz
405
- *
406
- * @since 1.6.2
407
- *
408
- * @param array $submitted_data
409
- */
410
- public function disconnect_form( $submitted_data ) {
411
- // only execute if multi_id provided on submitted data.
412
- if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
413
- $addon_quiz_settings = $this->get_quiz_settings_values();
414
- unset( $addon_quiz_settings[ $submitted_data['multi_id'] ] );
415
- $this->save_quiz_settings_values( $addon_quiz_settings );
416
- }
417
- }
418
-
419
- /**
420
- * Check if multi_id quiz settings values completed
421
- *
422
- * @since 1.6.2
423
- *
424
- * @param $multi_id
425
- *
426
- * @return bool
427
- */
428
- public function is_multi_quiz_settings_complete( $multi_id ) {
429
- $data = array( 'multi_id' => $multi_id );
430
-
431
- if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
432
- return false;
433
- }
434
-
435
- return true;
436
- }
437
  }
1
  <?php
2
 
 
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/class-forminator-addon-zapier.php CHANGED
@@ -1,429 +1,10 @@
1
  <?php
2
 
3
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-exception.php';
4
- require_once dirname( __FILE__ ) . '/lib/class-forminator-addon-zapier-wp-api.php';
5
-
6
  /**
7
- * Class Forminator_Addon_Zapier
8
- * Zapier Addon Main Class
9
- *
10
- * @since 1.0 Zapier Addon
11
  */
12
- final class Forminator_Addon_Zapier extends Forminator_Addon_Abstract {
13
-
14
- /**
15
- * @var self|null
16
- */
17
- private static $_instance = null;
18
-
19
- protected $_slug = 'zapier';
20
- protected $_version = FORMINATOR_ADDON_ZAPIER_VERSION;
21
- protected $_min_forminator_version = '1.1';
22
- protected $_short_title = 'Zapier';
23
- protected $_title = 'Zapier';
24
- protected $_url = 'https://wpmudev.com';
25
- protected $_full_path = __FILE__;
26
- protected $_documentation = 'https://wpmudev.com/docs/wpmu-dev-plugins/forminator/#zapier';
27
-
28
- protected $_form_settings = 'Forminator_Addon_Zapier_Form_Settings';
29
- protected $_form_hooks = 'Forminator_Addon_Zapier_Form_Hooks';
30
-
31
- protected $_poll_settings = 'Forminator_Addon_Zapier_Poll_Settings';
32
- protected $_poll_hooks = 'Forminator_Addon_Zapier_Poll_Hooks';
33
-
34
- protected $_quiz_settings = 'Forminator_Addon_Zapier_Quiz_Settings';
35
- protected $_quiz_hooks = 'Forminator_Addon_Zapier_Quiz_Hooks';
36
- protected $_position = 0;
37
-
38
- /**
39
- * Forminator_Addon_Zapier constructor.
40
- *
41
- * @since 1.0 Zapier Addon
42
- */
43
- public function __construct() {
44
- // late init to allow translation.
45
- $this->_description = __( 'Make your form Zap-able', 'forminator' );
46
- $doc_description = forminator_is_show_addons_documentation_link() ?
47
- sprintf(
48
- /* translators: 1: article anchor start, 2: article anchor end. */
49
- __( 'Refer to this %1$sarticle%2$s for tips and tricks on using Zapier integration and creating automated workflows.', 'forminator' ),
50
- '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
51
- '</a>'
52
- ) : '';
53
- $this->_promotion = sprintf(
54
- /* translators: ... */
55
- __( 'Zapier connects Forminator with %1$s1000+ apps%2$s. You can use it to send your submissions to third party apps not natively supported in Forminator and automate your after-submission workflows. %3$s Happy automating!', 'forminator' ),
56
- '<a href="https://zapier.com/apps" target="_blank">',
57
- '</a>',
58
- $doc_description
59
- );
60
-
61
- $this->_activation_error_message = __( 'Sorry but we failed to activate Zapier Integration, don\'t hesitate to contact us', 'forminator' );
62
- $this->_deactivation_error_message = __( 'Sorry but we failed to deactivate Zapier Integration, please try again', 'forminator' );
63
-
64
- $this->_update_settings_error_message = __(
65
- 'Sorry, we failed to update settings, please check your form and try again',
66
- 'forminator'
67
- );
68
-
69
- $this->_icon = forminator_addon_zapier_assets_url() . 'icons/zapier.png';
70
- $this->_icon_x2 = forminator_addon_zapier_assets_url() . 'icons/zapier@2x.png';
71
- $this->_image = forminator_addon_zapier_assets_url() . 'img/zapier.png';
72
- $this->_image_x2 = forminator_addon_zapier_assets_url() . 'img/zapier@2x.png';
73
- $this->_banner = forminator_addon_zapier_assets_url() . 'img/banner.png';
74
- $this->_banner_x2 = forminator_addon_zapier_assets_url() . 'img/banner@2x.png';
75
- }
76
-
77
- /**
78
- * Get Instance
79
- *
80
- * @since 1.0 Zapier Addon
81
- * @return self|null
82
- */
83
- public static function get_instance() {
84
- if ( is_null( self::$_instance ) ) {
85
- self::$_instance = new self();
86
- }
87
-
88
- return self::$_instance;
89
- }
90
-
91
- /**
92
- * Setting apier Addon
93
- *
94
- * @since 1.1 Zapier Addon
95
- * @return array
96
- */
97
- public function settings_wizards() {
98
- return array(
99
- array(
100
- 'callback' => array( $this, 'setup_connect' ),
101
- 'is_completed' => array( $this, 'is_connected' ),
102
- ),
103
- );
104
- }
105
-
106
- /**
107
- * Activate Zapier
108
- *
109
- * @since 1.1 Zapier Addon
110
- *
111
- * @param $submitted_data
112
- * @param int $form_id
113
- *
114
- * @return array
115
- */
116
- public function setup_connect( $submitted_data, $form_id = 0 ) {
117
- $settings_values = $this->get_settings_values();
118
-
119
- $template = forminator_addon_zapier_dir() . 'views/settings/setup-connect.php';
120
- $template_success = forminator_addon_zapier_dir() . 'views/settings/setup-connect-success.php';
121
-
122
- $template_params = array(
123
- 'is_connected' => $this->is_connected(),
124
- 'error_message' => '',
125
- );
126
-
127
- $has_errors = false;
128
- $show_success = false;
129
- $is_submit = ! empty( $submitted_data );
130
-
131
- foreach ( $template_params as $key => $value ) {
132
- if ( isset( $submitted_data[ $key ] ) ) {
133
- $template_params[ $key ] = $submitted_data[ $key ];
134
- } elseif ( isset( $settings_values[ $key ] ) ) {
135
- $template_params[ $key ] = $settings_values[ $key ];
136
- }
137
- }
138
-
139
- if ( $is_submit ) {
140
- $connect = isset( $submitted_data['connect'] ) ? $submitted_data['connect'] : '';
141
-
142
- try {
143
- if ( empty( $connect ) ) {
144
- throw new Forminator_Addon_Zapier_Exception( __( 'Please Connect Zapier', 'forminator' ) );
145
- }
146
-
147
- if ( ! forminator_addon_is_active( $this->_slug ) ) {
148
- $activated = Forminator_Addon_Loader::get_instance()->activate_addon( $this->_slug );
149
- if ( ! $activated ) {
150
- throw new Forminator_Addon_Zapier_Exception( Forminator_Addon_Loader::get_instance()->get_last_error_message() );
151
- }
152
- }
153
- // no form_id its on global settings.
154
- if ( empty( $form_id ) ) {
155
- $show_success = true;
156
- }
157
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
158
- $template_params['error_message'] = $e->getMessage();
159
- $has_errors = true;
160
- }
161
- }
162
-
163
- if ( $show_success ) {
164
- $template = $template_success;
165
- }
166
-
167
- $buttons = array();
168
-
169
- if ( $show_success ) {
170
- $buttons['close'] = array(
171
- 'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), 'sui-button-ghost forminator-addon-close forminator-integration-popup__close' ),
172
- );
173
- } else {
174
- if ( $this->is_connected() ) {
175
- $buttons['disconnect'] = array(
176
- 'markup' => self::get_button_markup( esc_html__( 'Disconnect', 'forminator' ), 'sui-button-ghost forminator-addon-disconnect forminator-integration-popup__close' ),
177
- );
178
- } else {
179
- $buttons['submit'] = array(
180
- 'markup' => self::get_button_markup( esc_html__( 'Activate', 'forminator' ), 'forminator-addon-connect forminator-integration-popup__close' ),
181
- );
182
- }
183
- }
184
-
185
- return array(
186
- 'html' => self::get_template( $template, $template_params ),
187
- 'buttons' => $buttons,
188
- 'redirect' => false,
189
- 'has_errors' => $has_errors,
190
- );
191
- }
192
-
193
- /**
194
- * Override on is_connected
195
- *
196
- * @since 1.0 Zapier Addon
197
- * @since 1.1 Disable auto activate
198
- *
199
- * @return bool
200
- */
201
- public function is_connected() {
202
- try {
203
- // check if its active.
204
- if ( ! $this->is_active() ) {
205
- throw new Forminator_Addon_Zapier_Exception( __( 'Zapier is not active', 'forminator' ) );
206
- }
207
- $is_connected = true;
208
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
209
- $is_connected = false;
210
- }
211
-
212
- /**
213
- * Filter connected status of zapier
214
- *
215
- * @since 1.1
216
- *
217
- * @param bool $is_connected
218
- */
219
- $is_connected = apply_filters( 'forminator_addon_zapier_is_connected', $is_connected );
220
-
221
- return $is_connected;
222
- }
223
-
224
- /**
225
- * Check if zapier is connected with current form
226
- *
227
- * @since 1.0 Zapier Addon
228
- *
229
- * @param $form_id
230
- *
231
- * @return bool
232
- */
233
- public function is_form_connected( $form_id ) {
234
- try {
235
- $form_settings_instance = null;
236
- if ( ! $this->is_connected() ) {
237
- throw new Forminator_Addon_Zapier_Exception( __( 'Zapier is not connected', 'forminator' ) );
238
- }
239
-
240
- $form_settings_instance = $this->get_addon_settings( $form_id, 'form' );
241
- if ( ! $form_settings_instance instanceof Forminator_Addon_Zapier_Form_Settings ) {
242
- throw new Forminator_Addon_Zapier_Exception( __( 'Invalid Form Settings of Zapier', 'forminator' ) );
243
- }
244
-
245
- // Mark as active when there is at least one active connection.
246
- if ( false === $form_settings_instance->find_one_active_connection() ) {
247
- throw new Forminator_Addon_Zapier_Exception( __( 'No active Zapier connection found in this form', 'forminator' ) );
248
- }
249
-
250
- $is_form_connected = true;
251
-
252
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
253
- $is_form_connected = false;
254
- forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
255
- }
256
-
257
- /**
258
- * Filter connected status of zapier with the form
259
- *
260
- * @since 1.1
261
- *
262
- * @param bool $is_form_connected
263
- * @param int $form_id Current Form ID.
264
- * @param Forminator_Addon_Zapier_Form_Settings|null $form_settings_instance Instance of form settings, or null when unavailable.
265
- *
266
- */
267
- $is_form_connected = apply_filters( 'forminator_addon_zapier_is_form_connected', $is_form_connected, $form_id, $form_settings_instance );
268
-
269
- return $is_form_connected;
270
- }
271
-
272
- /**
273
- * Get Zapier API
274
- *
275
- * @since 1.0 Zapier Addon
276
- *
277
- * @param string $endpoint
278
- *
279
- * @return Forminator_Addon_Zapier_Wp_Api|null
280
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
281
- */
282
- public function get_api( $endpoint ) {
283
- return Forminator_Addon_Zapier_Wp_Api::get_instance( $endpoint );
284
- }
285
-
286
- /**
287
- * Flag show full log on entries
288
- *
289
- * @since 1.0 Zapier Addon
290
- * @return bool
291
- */
292
- public static function is_show_full_log() {
293
- if ( defined( 'FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG' ) && FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG ) {
294
- return true;
295
- }
296
-
297
- return false;
298
- }
299
-
300
- /**
301
- * Allow multiple connection on one form
302
- *
303
- * @since 1.0 Zapier Addon
304
- * @return bool
305
- */
306
- public function is_allow_multi_on_form() {
307
- return true;
308
- }
309
-
310
- /**
311
- * Flag for check if and addon connected to a poll(poll settings such as list id completed)
312
- *
313
- * Please apply necessary WordPress hook on the inheritance class
314
- *
315
- * @since 1.6.1
316
- *
317
- * @param $poll_id
318
- *
319
- * @return boolean
320
- */
321
- public function is_poll_connected( $poll_id ) {
322
- try {
323
- $poll_settings_instance = null;
324
- if ( ! $this->is_connected() ) {
325
- throw new Forminator_Addon_Zapier_Exception( 'Zapier is not connected' );
326
- }
327
-
328
- $poll_settings_instance = $this->get_addon_settings( $poll_id, 'poll' );
329
- if ( ! $poll_settings_instance instanceof Forminator_Addon_Zapier_Poll_Settings ) {
330
- throw new Forminator_Addon_Zapier_Exception( 'Zapier Poll Settings of Trello' );
331
- }
332
-
333
- // Mark as active when there is at least one active connection.
334
- if ( false === $poll_settings_instance->find_one_active_connection() ) {
335
- throw new Forminator_Addon_Zapier_Exception( 'No active Poll connection found in this poll' );
336
- }
337
-
338
- $is_poll_connected = true;
339
-
340
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
341
-
342
- $is_poll_connected = false;
343
- }
344
-
345
- /**
346
- * Filter connected status Zapier with the poll
347
- *
348
- * @since 1.6.1
349
- *
350
- * @param bool $is_poll_connected
351
- * @param int $poll_id Current Poll ID.
352
- * @param Forminator_Addon_Trello_Poll_Settings|null $poll_settings_instance Instance of poll settings, or null when unavailable.
353
- *
354
- */
355
- $is_poll_connected = apply_filters( 'forminator_addon_zapier_is_poll_connected', $is_poll_connected, $poll_id, $poll_settings_instance );
356
-
357
- return $is_poll_connected;
358
- }
359
-
360
- /**
361
- * Allow multiple connection on one poll
362
- *
363
- * @since 1.6.1
364
- * @return bool
365
- */
366
- public function is_allow_multi_on_poll() {
367
- return true;
368
- }
369
-
370
- /**
371
- * Flag for check if and addon connected to a quiz(quiz settings such as list id completed)
372
- *
373
- * Please apply necessary WordPress hook on the inheritance class
374
- *
375
- * @since 1.6.2
376
- *
377
- * @param $quiz_id
378
- *
379
- * @return boolean
380
- */
381
- public function is_quiz_connected( $quiz_id ) {
382
- try {
383
- $quiz_settings_instance = null;
384
- if ( ! $this->is_connected() ) {
385
- throw new Forminator_Addon_Zapier_Exception( 'Zapier is not connected' );
386
- }
387
-
388
- $quiz_settings_instance = $this->get_addon_settings( $quiz_id, 'quiz' );
389
- if ( ! $quiz_settings_instance instanceof Forminator_Addon_Zapier_Quiz_Settings ) {
390
- throw new Forminator_Addon_Zapier_Exception( 'Zapier Quiz Settings of Trello' );
391
- }
392
-
393
- // Mark as active when there is at least one active connection.
394
- if ( false === $quiz_settings_instance->find_one_active_connection() ) {
395
- throw new Forminator_Addon_Zapier_Exception( 'No active Zapier connection found in this quiz' );
396
- }
397
-
398
- $is_quiz_connected = true;
399
-
400
- } catch ( Forminator_Addon_Zapier_Exception $e ) {
401
-
402
- $is_quiz_connected = false;
403
- }
404
-
405
- /**
406
- * Filter connected status Zapier with the quiz
407
- *
408
- * @since 1.6.2
409
- *
410
- * @param bool $is_quiz_connected
411
- * @param int $quiz_id Current Quiz ID.
412
- * @param Forminator_Addon_Trello_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable.
413
- *
414
- */
415
- $is_quiz_connected = apply_filters( 'forminator_addon_zapier_is_quiz_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
416
-
417
- return $is_quiz_connected;
418
- }
419
 
420
- /**
421
- * Allow multiple connection on one quiz
422
- *
423
- * @since 1.6.2
424
- * @return bool
425
- */
426
- public function is_allow_multi_on_quiz() {
427
- return true;
428
- }
429
  }
1
  <?php
2
 
 
 
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
+ final class Forminator_Addon_Zapier {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-exception.php CHANGED
@@ -1,10 +1,9 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Wp_Api_Exception
5
- * Exception holder for zapier wp api
6
- *
7
- * @since 1.0 Zapier Addon
8
  */
9
  class Forminator_Addon_Zapier_Wp_Api_Exception extends Forminator_Addon_Zapier_Exception {
10
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Wp_Api_Exception extends Forminator_Addon_Zapier_Exception {
9
  }
addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-not-found-exception.php CHANGED
@@ -1,10 +1,9 @@
1
  <?php
2
 
3
  /**
4
- * Class Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
5
- * Exception holder for zapier wp api on 404 not found error status
6
- *
7
- * @since 1.0 Zapier Addon
8
  */
9
  class Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception extends Forminator_Addon_Zapier_Wp_Api_Exception {
10
  }
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
7
  */
8
  class Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception extends Forminator_Addon_Zapier_Wp_Api_Exception {
9
  }
addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api.php CHANGED
@@ -1,307 +1,10 @@
1
  <?php
2
 
3
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-wp-api-exception.php';
4
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-wp-api-not-found-exception.php';
5
-
6
  /**
7
- * Class Forminator_Addon_Zapier_Wp_Api
 
 
8
  */
9
  class Forminator_Addon_Zapier_Wp_Api {
10
 
11
- /**
12
- * Instances of zapier api
13
- * key is md5(_endpoint)
14
- *
15
- * @var array
16
- */
17
- private static $_instances = array();
18
-
19
- /**
20
- * Zapier endpoint of static webhook
21
- *
22
- * @var string
23
- */
24
- private $_endpoint = '';
25
-
26
- /**
27
- * Last data sent to zapier
28
- *
29
- * @since 1.0 Zapier Addon
30
- * @var array
31
- */
32
- private $_last_data_sent = array();
33
-
34
- /**
35
- * Last data received from zapier
36
- *
37
- * @since 1.0 Zapier Addon
38
- * @var array
39
- */
40
- private $_last_data_received = array();
41
-
42
- /**
43
- * Last URL requested
44
- *
45
- * @since 1.0 Zapier Addon
46
- * @var string
47
- */
48
- private $_last_url_request = '';
49
-
50
- /**
51
- * Forminator_Addon_Zapier_Wp_Api constructor.
52
- *
53
- * @since 1.0 Zapier Addon
54
- *
55
- * @param $_endpoint
56
- *
57
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
58
- */
59
- public function __construct( $_endpoint ) {
60
- global $wpdb;
61
- $wpdb->last_error;
62
- //prerequisites
63
- if ( ! $_endpoint ) {
64
- throw new Forminator_Addon_Zapier_Wp_Api_Exception( __( 'Missing required Static Webhook URL', 'forminator' ) );
65
- }
66
-
67
- $this->_endpoint = $_endpoint;
68
- }
69
-
70
- /**
71
- * Get singleton
72
- *
73
- * @since 1.0 Zapier Addon
74
- *
75
- * @param string $_endpoint
76
- *
77
- * @return Forminator_Addon_Zapier_Wp_Api|null
78
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
79
- */
80
- public static function get_instance( $_endpoint ) {
81
- if ( ! isset( self::$_instances[ md5( $_endpoint ) ] ) ) {
82
- self::$_instances[ md5( $_endpoint ) ] = new self( $_endpoint );
83
- }
84
-
85
- return self::$_instances[ md5( $_endpoint ) ];
86
- }
87
-
88
- /**
89
- * Add custom user agent on request
90
- *
91
- * @since 1.0 Zapier Addon
92
- *
93
- * @param $user_agent
94
- *
95
- * @return string
96
- */
97
- public function filter_user_agent( $user_agent ) {
98
- $user_agent .= ' ForminatorZapier/' . FORMINATOR_ADDON_ZAPIER_VERSION;
99
-
100
- /**
101
- * Filter user agent to be used by zapier api
102
- *
103
- * @since 1.1
104
- *
105
- * @param string $user_agent current user agent.
106
- */
107
- $user_agent = apply_filters( 'forminator_addon_zapier_api_user_agent', $user_agent );
108
-
109
- return $user_agent;
110
- }
111
-
112
- /**
113
- * HTTP Request
114
- *
115
- * @since 1.0 Zapier Addon
116
- *
117
- * @param string $verb
118
- * @param $path
119
- * @param array $args
120
- *
121
- * @return array|mixed|object
122
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
123
- * @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
124
- */
125
- private function request( $verb, $path, $args = array() ) {
126
- // Adding extra user agent for wp remote request.
127
- add_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
128
-
129
- $url = trailingslashit( $this->_endpoint ) . $path;
130
- $verb = ! empty( $verb ) ? $verb : 'GET';
131
-
132
- /**
133
- * Filter zapier url to be used on sending api request
134
- *
135
- * @since 1.1
136
- *
137
- * @param string $url full url with scheme.
138
- * @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
139
- * @param string $path requested path resource.
140
- * @param array $args argument sent to this function.
141
- */
142
- $url = apply_filters( 'forminator_addon_zapier_api_url', $url, $verb, $path, $args );
143
-
144
- $this->_last_url_request = $url;
145
-
146
- $headers = array(
147
- 'Accept' => 'application/json',
148
- 'Content-Type' => 'application/json',
149
- );
150
-
151
- /**
152
- * Filter zapier headers to sent on api request
153
- *
154
- * @since 1.1
155
- *
156
- * @param array $headers
157
- * @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
158
- * @param string $path requested path resource.
159
- * @param array $args argument sent to this function.
160
- */
161
- $headers = apply_filters( 'forminator_addon_zapier_api_request_headers', $headers, $verb, $path, $args );
162
-
163
- $_args = array(
164
- 'method' => $verb,
165
- 'headers' => $headers,
166
- );
167
-
168
- // X-Hook-Test handler.
169
- if ( isset( $args['is_test'] ) ) {
170
- if ( true === $args['is_test'] ) {
171
- // Add `X-Hook-Test` header to avoid execute task on zapier.
172
- $_args['headers']['X-Hook-Test'] = 'true';
173
- }
174
- // always unset when exist.
175
- unset( $args['is_test'] );
176
- }
177
-
178
- $request_data = $args;
179
- /**
180
- * Filter zapier request data to be used on sending api request
181
- *
182
- * @since 1.1
183
- *
184
- * @param array $request_data it will be `http_build_query`-ed when `GET` or `wp_json_encode`-ed otherwise.
185
- * @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
186
- * @param string $path requested path resource.
187
- */
188
- $args = apply_filters( 'forminator_addon_zapier_api_request_data', $request_data, $verb, $path );
189
-
190
- if ( 'GET' === $verb ) {
191
- $url .= ( '?' . http_build_query( $args ) );
192
- } else {
193
- $_args['body'] = wp_json_encode( $args );
194
- }
195
-
196
- $this->_last_data_sent = $args;
197
-
198
- $res = wp_remote_request( $url, $_args );
199
- $wp_response = $res;
200
-
201
- remove_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
202
-
203
- if ( is_wp_error( $res ) || ! $res ) {
204
- forminator_addon_maybe_log( __METHOD__, $res );
205
- throw new Forminator_Addon_Zapier_Wp_Api_Exception(
206
- __( 'Failed to process request, make sure your Webhook URL is correct and your server has internet connection.', 'forminator' )
207
- );
208
- }
209
-
210
- if ( isset( $res['response']['code'] ) ) {
211
- $status_code = $res['response']['code'];
212
- $msg = '';
213
- if ( $status_code > 400 ) {
214
- if ( isset( $res['response']['message'] ) ) {
215
- $msg = $res['response']['message'];
216
- }
217
-
218
- if ( 404 === $status_code ) {
219
- /* translators: ... */
220
- throw new Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
221
- }
222
- /* translators: ... */
223
- throw new Forminator_Addon_Zapier_Wp_Api_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
224
- }
225
- }
226
-
227
- $body = wp_remote_retrieve_body( $res );
228
-
229
- // probably silent mode.
230
- if ( ! empty( $body ) ) {
231
- $res = json_decode( $body );
232
- }
233
-
234
- $response = $res;
235
- /**
236
- * Filter zapier api response returned to addon
237
- *
238
- * @since 1.1
239
- *
240
- * @param mixed $response original wp remote request response or decoded body if available.
241
- * @param string $body original content of http response's body.
242
- * @param array|WP_Error $wp_response original wp remote request response.
243
- */
244
- $res = apply_filters( 'forminator_addon_zapier_api_response', $response, $body, $wp_response );
245
-
246
- $this->_last_data_received = $res;
247
-
248
- forminator_addon_maybe_log( $res );
249
-
250
- return $res;
251
- }
252
-
253
-
254
- /**
255
- * Send data to static webhook zapier URL
256
- *
257
- * @since 1.0 Zapier Addon
258
- *
259
- * @param $args
260
- * add `is_test` => true to add `X-Hook-Test: true`
261
- *
262
- * @return array|mixed|object
263
- * @throws Forminator_Addon_Zapier_Wp_Api_Exception
264
- * @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
265
- */
266
- public function post_( $args ) {
267
-
268
- return $this->request(
269
- 'POST',
270
- '',
271
- $args
272
- );
273
- }
274
-
275
- /**
276
- * Get last data sent
277
- *
278
- * @since 1.0 Zapier Addon
279
- *
280
- * @return array
281
- */
282
- public function get_last_data_sent() {
283
- return $this->_last_data_sent;
284
- }
285
-
286
- /**
287
- * Get last data received
288
- *
289
- * @since 1.0 Zapier Addon
290
- *
291
- * @return array
292
- */
293
- public function get_last_data_received() {
294
- return $this->_last_data_received;
295
- }
296
-
297
- /**
298
- * Get last data received
299
- *
300
- * @since 1.0 Zapier Addon
301
- *
302
- * @return string
303
- */
304
- public function get_last_url_request() {
305
- return $this->_last_url_request;
306
- }
307
  }
1
  <?php
2
 
 
 
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
7
  */
8
  class Forminator_Addon_Zapier_Wp_Api {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
addons/pro/zapier/views/poll-settings/setup-webhook.php CHANGED
@@ -1,120 +1,2 @@
1
  <?php
2
- // defaults.
3
- $vars = array(
4
- 'error_message' => '',
5
- 'name' => '',
6
- 'name_error' => '',
7
- 'multi_id' => '',
8
- 'new_zap_url' => '',
9
- 'webhook_url' => '',
10
- 'webhook_url_error' => '',
11
- );
12
- /** @var array $template_vars */
13
- foreach ( $template_vars as $key => $val ) {
14
- $vars[ $key ] = $val;
15
- }
16
- ?>
17
 
18
- <div class="forminator-integration-popup__header">
19
-
20
- <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
21
- <?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
22
- </h3>
23
-
24
- <p id="forminator-integration-popup__description" class="sui-description">
25
- <?php esc_html_e( 'Put your ZAP Webhook URL below. ', 'forminator' ); ?>
26
- </p>
27
-
28
- <?php if ( ! empty( $vars['error_message'] ) ) : ?>
29
- <div
30
- role="alert"
31
- class="sui-notice sui-notice-red sui-active"
32
- style="display: block; text-align: left;"
33
- aria-live="assertive"
34
- >
35
-
36
- <div class="sui-notice-content">
37
-
38
- <div class="sui-notice-message">
39
-
40
- <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
41
-
42
- <p><?php echo esc_html( $vars['error_message'] ); ?></p>
43
-
44
- </div>
45
-
46
- </div>
47
-
48
- </div>
49
- <?php endif; ?>
50
-
51
- </div>
52
-
53
- <form enctype="multipart/form-data">
54
-
55
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
56
- <label class="sui-label"><?php esc_html_e( 'Zapier Integration Name', 'forminator' ); ?></label>
57
- <div class="sui-control-with-icon">
58
- <input type="text"
59
- name="name"
60
- placeholder="<?php esc_attr_e( 'Friendly Name', 'forminator' ); ?>"
61
- value="<?php echo esc_attr( $vars['name'] ); ?>"
62
- class="sui-form-control"
63
- />
64
- <i class="sui-icon-web-globe-world" aria-hidden="true"></i>
65
- </div>
66
- <?php if ( ! empty( $vars['name_error'] ) ) : ?>
67
- <span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
68
- <?php endif; ?>
69
- </div>
70
-
71
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
72
- <label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
73
- <div class="sui-control-with-icon">
74
- <input
75
- type="text"
76
- name="webhook_url"
77
- placeholder="<?php esc_attr_e( 'Webhook URL', 'forminator' ); ?>"
78
- value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
79
- class="sui-form-control"/>
80
- <i class="sui-icon-link" aria-hidden="true"></i>
81
- </div>
82
- <?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
83
- <span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
84
- <?php endif; ?>
85
- </div>
86
-
87
- <input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
88
-
89
- </form>
90
-
91
- <div
92
- role="alert"
93
- class="sui-notice sui-notice-yellow sui-active"
94
- style="display: block; text-align: left;"
95
- aria-live="assertive"
96
- >
97
-
98
- <div class="sui-notice-content">
99
-
100
- <div class="sui-notice-message">
101
-
102
- <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
103
-
104
- <p>
105
- <?php
106
- echo sprintf(/* translators: ... */
107
- esc_html__( 'Please go %1$shere%2$s if you do not have any ZAP created. Remember to choose %3$sWebhooks by Zapier%4$s as Trigger App.', 'forminator' ),
108
- '<a href="' . esc_url( $vars['new_zap_url'] ) . '" target="_blank">',
109
- '</a>',
110
- '<strong>',
111
- '</strong>'
112
- );
113
- ?>
114
- </p>
115
-
116
- </div>
117
-
118
- </div>
119
-
120
- </div>
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
addons/pro/zapier/views/quiz-settings/setup-webhook.php CHANGED
@@ -1,120 +1,2 @@
1
  <?php
2
- // defaults.
3
- $vars = array(
4
- 'error_message' => '',
5
- 'name' => '',
6
- 'name_error' => '',
7
- 'multi_id' => '',
8
- 'new_zap_url' => '',
9
- 'webhook_url' => '',
10
- 'webhook_url_error' => '',
11
- );
12
- /** @var array $template_vars */
13
- foreach ( $template_vars as $key => $val ) {
14
- $vars[ $key ] = $val;
15
- }
16
- ?>
17
 
18
- <div class="forminator-integration-popup__header">
19
-
20
- <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
21
- <?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
22
- </h3>
23
-
24
- <p id="forminator-integration-popup__description" class="sui-description">
25
- <?php esc_html_e( 'Put your ZAP Webhook URL below. ', 'forminator' ); ?>
26
- </p>
27
-
28
- <?php if ( ! empty( $vars['error_message'] ) ) : ?>
29
- <div
30
- role="alert"
31
- class="sui-notice sui-notice-red sui-active"
32
- style="display: block; text-align: left;"
33
- aria-live="assertive"
34
- >
35
-
36
- <div class="sui-notice-content">
37
-
38
- <div class="sui-notice-message">
39
-
40
- <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
41
-
42
- <p><?php echo esc_html( $vars['error_message'] ); ?></p>
43
-
44
- </div>
45
-
46
- </div>
47
-
48
- </div>
49
- <?php endif; ?>
50
-
51
- </div>
52
-
53
- <form enctype="multipart/form-data">
54
-
55
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
56
- <label class="sui-label"><?php esc_html_e( 'Zapier Integration Name', 'forminator' ); ?></label>
57
- <div class="sui-control-with-icon">
58
- <input type="text"
59
- name="name"
60
- placeholder="<?php esc_attr_e( 'Friendly Name', 'forminator' ); ?>"
61
- value="<?php echo esc_attr( $vars['name'] ); ?>"
62
- class="sui-form-control"
63
- />
64
- <i class="sui-icon-web-globe-world" aria-hidden="true"></i>
65
- </div>
66
- <?php if ( ! empty( $vars['name_error'] ) ) : ?>
67
- <span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
68
- <?php endif; ?>
69
- </div>
70
-
71
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
72
- <label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
73
- <div class="sui-control-with-icon">
74
- <input
75
- type="text"
76
- name="webhook_url"
77
- placeholder="<?php esc_attr_e( 'Webhook URL', 'forminator' ); ?>"
78
- value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
79
- class="sui-form-control"/>
80
- <i class="sui-icon-link" aria-hidden="true"></i>
81
- </div>
82
- <?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
83
- <span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
84
- <?php endif; ?>
85
- </div>
86
-
87
- <input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
88
-
89
- </form>
90
-
91
- <div
92
- role="alert"
93
- class="sui-notice sui-notice-yellow sui-active"
94
- style="display: block; text-align: left;"
95
- aria-live="assertive"
96
- >
97
-
98
- <div class="sui-notice-content">
99
-
100
- <div class="sui-notice-message">
101
-
102
- <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
103
-
104
- <p>
105
- <?php
106
- echo sprintf(/* translators: ... */
107
- esc_html__( 'Please go %1$shere%2$s if you do not have any ZAP created. Remember to choose %3$sWebhooks by Zapier%4$s as Trigger App.', 'forminator' ),
108
- '<a href="' . esc_url( $vars['new_zap_url'] ) . '" target="_blank">',
109
- '</a>',
110
- '<strong>',
111
- '</strong>'
112
- );
113
- ?>
114
- </p>
115
-
116
- </div>
117
-
118
- </div>
119
-
120
- </div>
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
addons/pro/zapier/views/settings/setup-connect-success.php CHANGED
@@ -1,14 +1 @@
1
- <div class="forminator-integration-popup__header">
2
 
3
- <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
4
- <?php
5
- /* translators: ... */
6
- echo esc_html( sprintf( __( '%1$s Added', 'forminator' ), 'Zapier' ) );
7
- ?>
8
- </h3>
9
-
10
- </div>
11
-
12
- <p id="forminator-integration-popup__description" class="sui-description" style="text-align: center;">
13
- <?php esc_html_e( 'You can now go to your forms and assign them to this integration', 'forminator' ); ?>
14
- </p>
 
1
 
 
 
 
 
 
 
 
 
 
 
 
 
addons/pro/zapier/views/settings/setup-connect.php CHANGED
@@ -1,84 +1 @@
1
  <?php
2
- // Defaults.
3
- $vars = array(
4
- 'error_message' => '',
5
- 'is_connected' => false,
6
- );
7
-
8
- /** @var array $template_vars */
9
- foreach ( $template_vars as $key => $val ) {
10
- $vars[ $key ] = $val;
11
- } ?>
12
-
13
- <div class="forminator-integration-popup__header">
14
-
15
- <h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
16
- <?php
17
- /* translators: ... */
18
- echo esc_html( sprintf( __( 'Activate %1$s', 'forminator' ), 'Zapier' ) );
19
- ?>
20
- </h3>
21
-
22
- <?php if ( ! empty( $vars['is_connected'] ) || ! empty( $vars['error_message'] ) ) : ?>
23
- <p id="forminator-integration-popup__description" class="sui-description">
24
- <?php esc_html_e( 'Activate Zapier to start using it on your forms.', 'forminator' ); ?>
25
- </p>
26
- <?php endif; ?>
27
-
28
- </div>
29
-
30
- <?php if ( empty( $vars['is_connected'] ) && empty( $vars['error_message'] ) ) : ?>
31
- <p id="forminator-integration-popup__description" class="sui-description" style="margin: 0; text-align: center;">
32
- <?php esc_html_e( 'Activate Zapier to start using it on your forms.', 'forminator' ); ?>
33
- </p>
34
- <?php endif; ?>
35
-
36
- <?php if ( ! empty( $vars['is_connected'] ) ) : ?>
37
- <div
38
- role="alert"
39
- class="sui-notice sui-notice-green sui-active"
40
- style="display: block; text-align: left;"
41
- aria-live="assertive"
42
- >
43
-
44
- <div class="sui-notice-content">
45
-
46
- <div class="sui-notice-message">
47
-
48
- <span class="sui-notice-icon sui-icon-check-tick" aria-hidden="true"></span>
49
-
50
- <p><?php esc_html_e( 'Zapier is already active.', 'forminator' ); ?></p>
51
-
52
- </div>
53
-
54
- </div>
55
-
56
- </div>
57
- <?php endif; ?>
58
-
59
- <?php if ( ! empty( $vars['error_message'] ) ) : ?>
60
- <div
61
- role="alert"
62
- class="sui-notice sui-notice-red sui-active"
63
- style="display: block; text-align: left;"
64
- aria-live="assertive"
65
- >
66
-
67
- <div class="sui-notice-content">
68
-
69
- <div class="sui-notice-message">
70
-
71
- <span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
72
-
73
- <p><?php echo esc_html( $vars['error_message'] ); ?></p>
74
-
75
- </div>
76
-
77
- </div>
78
-
79
- </div>
80
- <?php endif; ?>
81
-
82
- <form>
83
- <input type="hidden" value="1" name="connect">
84
- </form>
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
addons/pro/zapier/zapier.php CHANGED
@@ -1,38 +1,8 @@
1
  <?php
2
 
3
  /**
4
- * Addon Name: Zapier
5
- * Version: 1.0
6
- * Plugin URI: https://wpmudev.com/
7
- * Description: Integrate Forminator Custom Forms with Zapier to execute various action you like
8
- * Author: WPMU DEV
9
- * Author URI: http://wpmudev.com
10
  */
11
 
12
- define( 'FORMINATOR_ADDON_ZAPIER_VERSION', '1.2' );
13
-
14
- function forminator_addon_zapier_url() {
15
- return trailingslashit( forminator_plugin_url() . 'addons/pro/zapier' );
16
- }
17
-
18
- function forminator_addon_zapier_assets_url() {
19
- return trailingslashit( forminator_addon_zapier_url() . 'assets' );
20
- }
21
-
22
- function forminator_addon_zapier_dir() {
23
- return trailingslashit( dirname( __FILE__ ) );
24
- }
25
-
26
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier.php';
27
-
28
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-form-settings.php';
29
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-form-hooks.php';
30
-
31
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-poll-settings.php';
32
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-poll-hooks.php';
33
-
34
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-quiz-settings.php';
35
- require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-quiz-hooks.php';
36
-
37
- //Direct Load
38
- Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Zapier' );
1
  <?php
2
 
3
  /**
4
+ * Moved to Webhook integration.
5
+ * Leave it here to avoid Fatal errors during updating plugin.
6
+ * Remove zapier folder after several versions.
 
 
 
7
  */
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/abstracts/class-admin-module-edit-page.php CHANGED
@@ -452,6 +452,14 @@ abstract class Forminator_Admin_Module_Edit_Page extends Forminator_Admin_Page {
452
  </li>
453
  <?php endif; ?>
454
 
 
 
 
 
 
 
 
 
455
  </ul>
456
 
457
  <div class="sui-chartjs <?php echo esc_attr( $opened_chart ); ?> forminator-stats-chart" data-chart-id="<?php echo esc_attr( $module['id'] ); ?>">
452
  </li>
453
  <?php endif; ?>
454
 
455
+ <li>
456
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=forminator-reports&form_type=' . $post_type . '&form_id=' . $module['id'] ) ); ?>"
457
+ class="sui-button sui-button-ghost">
458
+ <i class="sui-icon-page" aria-hidden="true"></i>
459
+ <?php esc_html_e( 'view full report', 'forminator' ); ?>
460
+ </a>
461
+ </li>
462
+
463
  </ul>
464
 
465
  <div class="sui-chartjs <?php echo esc_attr( $opened_chart ); ?> forminator-stats-chart" data-chart-id="<?php echo esc_attr( $module['id'] ); ?>">
admin/abstracts/class-admin-page.php CHANGED
@@ -578,4 +578,68 @@ abstract class Forminator_Admin_Page {
578
 
579
  return 'data:image/svg+xml;base64,' . base64_encode( $svg );
580
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
581
  }
578
 
579
  return 'data:image/svg+xml;base64,' . base64_encode( $svg );
580
  }
581
+
582
+ /**
583
+ * Forminator modules
584
+ */
585
+ public function populate_modules() {
586
+
587
+ $modules[] = array(
588
+ 'name' => __( 'Forms', 'forminator' ),
589
+ 'model' => Forminator_Form_Model::model(),
590
+ 'slug' => 'form',
591
+ );
592
+ $modules[] = array(
593
+ 'name' => __( 'Polls', 'forminator' ),
594
+ 'model' => Forminator_Poll_Model::model(),
595
+ 'slug' => 'poll',
596
+ );
597
+ $modules[] = array(
598
+ 'name' => __( 'Quizzes', 'forminator' ),
599
+ 'model' => Forminator_Quiz_Model::model(),
600
+ 'slug' => 'quiz',
601
+ );
602
+
603
+ return $modules;
604
+ }
605
+
606
+ /**
607
+ * Modules form type
608
+ *
609
+ * @return array
610
+ */
611
+ public function modules_form_type() {
612
+ $form_types = array();
613
+ $modules = $this->populate_modules();
614
+ foreach ( $modules as $module ) {
615
+ /** @var Forminator_Base_Form_Model $model */
616
+ $model = $module['model'];
617
+ $name = $module['name'];
618
+
619
+ $form_types[ $model->get_post_type() ] = $name;
620
+ }
621
+
622
+ return $form_types;
623
+ }
624
+
625
+ /**
626
+ * Get Form Model if current requested form_id available and matched form_type
627
+ *
628
+ * @return bool|Forminator_Base_Form_Model|null
629
+ */
630
+ public function get_form_model() {
631
+ if ( $this->get_current_form_id() ) {
632
+ $form_model = forminator_get_model_from_id( $this->get_current_form_id() );
633
+ if ( ! $form_model instanceof Forminator_Base_Form_Model ) {
634
+ return null;
635
+ }
636
+ if ( $form_model->get_post_type() !== $this->get_current_form_type() ) {
637
+ return null;
638
+ }
639
+
640
+ return $form_model;
641
+ }
642
+
643
+ return null;
644
+ }
645
  }
admin/classes/class-admin-ajax.php CHANGED
@@ -90,7 +90,10 @@ class Forminator_Admin_AJAX {
90
  add_action( 'wp_ajax_forminator_load_import_quiz_popup', array( $this, 'load_import' ) );
91
  add_action( 'wp_ajax_forminator_save_import_quiz_popup', array( $this, 'save_import' ) );
92
 
93
- add_action( 'wp_ajax_forminator_save_accessibility_settings_popup', array( $this, 'save_accessibility_settings' ) );
 
 
 
94
 
95
  add_action( 'wp_ajax_forminator_save_dashboard_settings_popup', array( $this, 'save_dashboard_settings' ) );
96
 
@@ -106,6 +109,8 @@ class Forminator_Admin_AJAX {
106
  add_action( 'wp_ajax_forminator_dismiss_notification', array( $this, 'dismiss_notice' ) );
107
  add_action( 'wp_ajax_forminator_dismiss_notice', array( $this, 'dismiss_admin_notice' ) );
108
 
 
 
109
  add_action( 'wp_ajax_forminator_later_notification', array( $this, 'later_notice' ) );
110
 
111
  add_action( 'wp_ajax_forminator_reset_tracking_data', array( $this, 'reset_tracking_data' ) );
@@ -115,10 +120,7 @@ class Forminator_Admin_AJAX {
115
  add_action( 'wp_ajax_forminator_apply_appearance_preset', array( $this, 'apply_appearance_preset' ) );
116
  add_action( 'wp_ajax_forminator_delete_appearance_preset', array( $this, 'delete_appearance_preset' ) );
117
 
118
- add_action( 'wp_ajax_forminator_dismiss_prelaunch_subscriptions', array( $this, 'dismiss_prelaunch_subscriptions_notice' ) );
119
-
120
  add_action( 'wp_ajax_forminator_module_search', array( $this, 'module_search' ) );
121
- add_action( 'wp_ajax_forminator_load_addons_page_details_popup', array( $this, 'addons_page_details' ) );
122
 
123
  // Process ajax actions.
124
  $ajax_actions = array(
@@ -131,6 +133,8 @@ class Forminator_Admin_AJAX {
131
  foreach ( $ajax_actions as $action ) {
132
  add_action( "wp_ajax_$action", array( $this, 'addons_page_actions' ) );
133
  }
 
 
134
  }
135
 
136
  /**
@@ -275,7 +279,7 @@ class Forminator_Admin_AJAX {
275
  $status = $form_model->status;
276
  }
277
 
278
- //we need to empty fields cause we will send new data
279
  $form_model->clear_fields();
280
  }
281
 
@@ -336,7 +340,6 @@ class Forminator_Admin_AJAX {
336
  if ( empty( $status ) ) {
337
  $status = Forminator_Form_Model::STATUS_PUBLISH;
338
  }
339
-
340
  } else {
341
  $form_model = Forminator_Base_Form_Model::get_model( $id );
342
 
@@ -420,7 +423,7 @@ class Forminator_Admin_AJAX {
420
  // Regenerare module css file.
421
  Forminator_Render_Form::regenerate_css_file( $form_id );
422
 
423
- $count++;
424
  }
425
  }
426
 
@@ -437,6 +440,7 @@ class Forminator_Admin_AJAX {
437
  *
438
  * @param array $settings Current Settings.
439
  * @param array $new_settings New Appearance settings.
 
440
  * @return array
441
  */
442
  private function merge_appearance_settings( $settings, $new_settings ) {
@@ -532,7 +536,7 @@ class Forminator_Admin_AJAX {
532
  * Save Appearance Preset
533
  *
534
  * @param string $id ID.
535
- * @param array $settings Settings.
536
  */
537
  private static function save_preset( $id, $settings ) {
538
  update_option( 'forminator_appearance_preset_' . $id, $settings );
@@ -627,9 +631,9 @@ class Forminator_Admin_AJAX {
627
  update_option( 'forminator_v3_captcha_key', Forminator_Core::sanitize_text_field( 'v3_captcha_key' ) );
628
  update_option( 'forminator_v3_captcha_secret', Forminator_Core::sanitize_text_field( 'v3_captcha_secret' ) );
629
 
630
- update_option( "forminator_hcaptcha_key", sanitize_text_field( $_POST['hcaptcha_key'] ) );
631
- update_option( "forminator_hcaptcha_secret", sanitize_text_field( $_POST['hcaptcha_secret'] ) );
632
- update_option( "forminator_captcha_tab_saved", sanitize_text_field( $_POST['captcha_tab_saved'] ) );
633
  // update_option( "forminator_hcaptcha_noconflict", sanitize_text_field( $_POST['hcaptcha_noconflict'] ) );
634
 
635
  update_option( 'forminator_captcha_language', Forminator_Core::sanitize_text_field( 'captcha_language' ) );
@@ -712,12 +716,12 @@ class Forminator_Admin_AJAX {
712
 
713
  } else {
714
  $html .= '<div role="alert" class="sui-notice sui-active" style="display: block; text-align: left;" aria-live="assertive">';
715
- $html .= '<div class="sui-notice-content">';
716
- $html .= '<div class="sui-notice-message">';
717
- $html .= '<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>';
718
- $html .= '<p>' . esc_html__( 'You have to first save your credentials to load the reCAPTCHA . ', 'forminator' ) . '</p>';
719
- $html .= '</div>';
720
- $html .= '</div>';
721
  $html .= '</div>';
722
  }
723
 
@@ -736,17 +740,17 @@ class Forminator_Admin_AJAX {
736
 
737
  // $captcha = sanitize_text_field( $_POST['captcha'] );// phpcs:ignore -- data without nonce verification
738
 
739
- $hcaptcha_key = get_option( 'forminator_hcaptcha_key', '' );
740
  $hcaptcha_secret = get_option( 'forminator_hcaptcha_secret', '' );
741
- $onload = 'forminator_render_admin_hcaptcha';
742
 
743
  if ( ! empty( $hcaptcha_key ) && ! empty( $hcaptcha_secret ) ) {
744
  // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
745
  // recaptchacompat=off seems to fix problems with hcaptcha container loading recaptcha instead of hcaptcha in the admin
746
- $html = '<script src="https://js.hcaptcha.com/1/api.js?hl=' . $language . '&onload=' . $onload . '&render=explicit&recaptchacompat=off" async defer></script>';
747
  $html .= '<div class="forminator-hcaptcha h-captcha" data-sitekey="' . esc_attr( $hcaptcha_key ) . '"></div>';
748
  } else {
749
- $html = '<div class="sui-notice" style="margin: 10px 0;"><p>' . esc_html__( 'Save your API keys to load the hCAPTCHA preview.', 'forminator' ) . '</p></div>';
750
  }
751
 
752
  wp_send_json_success( $html );
@@ -860,7 +864,7 @@ class Forminator_Admin_AJAX {
860
  $preview_data = false;
861
  // force -1 for preview.
862
  $form_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
863
- $form_id = $form_id ? $form_id : -1;
864
 
865
  // Check if preview data set
866
  if ( ! empty( $_POST['data'] ) ) {
@@ -967,7 +971,6 @@ class Forminator_Admin_AJAX {
967
  * @see get_users()
968
  *
969
  * @since 1.2
970
- *
971
  */
972
  $args = apply_filters( 'forminator_builder_search_emails_args', $args, $search_email );
973
 
@@ -992,7 +995,6 @@ class Forminator_Admin_AJAX {
992
  * @param string $search_email string to search.
993
  *
994
  * @since 1.2
995
- *
996
  */
997
  $data = apply_filters( 'forminator_builder_search_emails_data', $data, $users, $args, $search_email );
998
 
@@ -1003,15 +1005,14 @@ class Forminator_Admin_AJAX {
1003
  * Get superglobal POST data
1004
  *
1005
  * @param string $nonce_action action to validate.
1006
- * @param array $sanitize_callbacks {
1007
- * custom sanitize options, its assoc array
1008
- * 'field_name_1' => 'function_to_call_1' function will called with `call_user_func_array`,
1009
- * 'field_name_2' => 'function_to_call_2',
1010
- * }
1011
  *
1012
  * @return array
1013
  * @since 1.1
1014
- *
1015
  */
1016
  protected function get_post_data( $nonce_action = '', $sanitize_callbacks = array() ) {
1017
  // do nonce / caps check when requested.
@@ -1191,10 +1192,16 @@ class Forminator_Admin_AJAX {
1191
  // Validate nonce
1192
  forminator_validate_ajax( 'forminator_save_import_' . $slug );
1193
 
1194
- $importable = json_decode( html_entity_decode( wp_unslash( $_POST[ 'importable'] ) ), true );
1195
 
1196
  $import_data = Forminator_Core::sanitize_array( $importable );
1197
 
 
 
 
 
 
 
1198
  // hook custom data here.
1199
  $import_data = apply_filters( 'forminator_' . $slug . '_import_data', $import_data );
1200
 
@@ -1236,6 +1243,67 @@ class Forminator_Admin_AJAX {
1236
  }
1237
  }
1238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1239
 
1240
  /**
1241
  * Get instance of thirdparty importer class
@@ -1830,11 +1898,11 @@ class Forminator_Admin_AJAX {
1830
  $data['buttons'] = array();
1831
 
1832
  $data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
1833
- '<button class="sui-button forminator-stripe-connect" type="button" data-nonce="' . wp_create_nonce( 'forminator_stripe_settings_modal' ) . '">' .
1834
- '<span class="sui-loading-text">' . esc_html__( 'Connect', 'forminator' ) . '</span>' .
1835
- '<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>' .
1836
- '</button>' .
1837
- '</div>';
1838
 
1839
  wp_send_json_success( $data );
1840
  }
@@ -1956,11 +2024,11 @@ class Forminator_Admin_AJAX {
1956
  $data['buttons'] = array();
1957
 
1958
  $data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
1959
- '<button class="sui-button forminator-paypal-connect" type="button" data-nonce="' . wp_create_nonce( 'forminator_paypal_settings_modal' ) . '">' .
1960
- '<span class="sui-loading-text">' . esc_html__( 'Connect', 'forminator' ) . '</span>' .
1961
- '<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>' .
1962
- '</button>' .
1963
- '</div>';
1964
 
1965
  wp_send_json_success( $data );
1966
  }
@@ -2025,6 +2093,17 @@ class Forminator_Admin_AJAX {
2025
  wp_send_json_success();
2026
  }
2027
 
 
 
 
 
 
 
 
 
 
 
 
2028
  /**
2029
  * Save general payments settings
2030
  *
@@ -2129,23 +2208,6 @@ class Forminator_Admin_AJAX {
2129
  }
2130
  }
2131
 
2132
- /**
2133
- * Dismiss Subscriptions Prelaunch notice
2134
- *
2135
- * @since 1.14.10
2136
- */
2137
- public function dismiss_prelaunch_subscriptions_notice() {
2138
- forminator_validate_ajax( 'forminator_dismiss_prelaunch_subscriptions' );
2139
-
2140
- $slug = Forminator_Core::sanitize_text_field( 'prop' );
2141
-
2142
- $dismissed_messages = get_user_meta( get_current_user_id(), 'frmt_dismissed_messages', true );
2143
- $dismissed_messages = empty( $dismissed_messages ) ? array() : $dismissed_messages;
2144
- $dismissed_messages[ $slug ] = true;
2145
-
2146
- update_user_meta( get_current_user_id(), 'frmt_dismissed_messages', $dismissed_messages );
2147
- }
2148
-
2149
  /**
2150
  * Module search for all types
2151
  *
@@ -2175,28 +2237,6 @@ class Forminator_Admin_AJAX {
2175
  wp_send_json_success( $html );
2176
  }
2177
 
2178
- /**
2179
- * Addons page details
2180
- */
2181
- public function addons_page_details() {
2182
- // Validate nonce.
2183
- forminator_validate_ajax( 'forminator_addons_page_details' );
2184
-
2185
- $pid = filter_input( INPUT_POST, 'id' );
2186
- if ( ! $pid ) {
2187
- wp_send_json_error();
2188
- }
2189
-
2190
- $file = forminator_plugin_dir() . 'admin/views/addons/addon-details.php';
2191
-
2192
- ob_start();
2193
- /** @noinspection PhpIncludeInspection */
2194
- include $file;
2195
- $html = ob_get_clean();
2196
-
2197
- wp_send_json_success( $html );
2198
- }
2199
-
2200
  public function addons_page_actions() {
2201
  // Validate nonce.
2202
  forminator_validate_ajax( 'forminator_popup_addons_actions' );
@@ -2218,4 +2258,44 @@ class Forminator_Admin_AJAX {
2218
  );
2219
 
2220
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2221
  }
90
  add_action( 'wp_ajax_forminator_load_import_quiz_popup', array( $this, 'load_import' ) );
91
  add_action( 'wp_ajax_forminator_save_import_quiz_popup', array( $this, 'save_import' ) );
92
 
93
+ add_action( 'wp_ajax_forminator_save_accessibility_settings_popup', array(
94
+ $this,
95
+ 'save_accessibility_settings'
96
+ ) );
97
 
98
  add_action( 'wp_ajax_forminator_save_dashboard_settings_popup', array( $this, 'save_dashboard_settings' ) );
99
 
109
  add_action( 'wp_ajax_forminator_dismiss_notification', array( $this, 'dismiss_notice' ) );
110
  add_action( 'wp_ajax_forminator_dismiss_notice', array( $this, 'dismiss_admin_notice' ) );
111
 
112
+ add_action( 'wp_ajax_forminator_promote_remind_later', array( $this, 'promote_remind_later' ) );
113
+
114
  add_action( 'wp_ajax_forminator_later_notification', array( $this, 'later_notice' ) );
115
 
116
  add_action( 'wp_ajax_forminator_reset_tracking_data', array( $this, 'reset_tracking_data' ) );
120
  add_action( 'wp_ajax_forminator_apply_appearance_preset', array( $this, 'apply_appearance_preset' ) );
121
  add_action( 'wp_ajax_forminator_delete_appearance_preset', array( $this, 'delete_appearance_preset' ) );
122
 
 
 
123
  add_action( 'wp_ajax_forminator_module_search', array( $this, 'module_search' ) );
 
124
 
125
  // Process ajax actions.
126
  $ajax_actions = array(
133
  foreach ( $ajax_actions as $action ) {
134
  add_action( "wp_ajax_$action", array( $this, 'addons_page_actions' ) );
135
  }
136
+
137
+ add_action( 'wp_ajax_forminator_filter_report_data', array( $this, 'filter_report_data' ) );
138
  }
139
 
140
  /**
279
  $status = $form_model->status;
280
  }
281
 
282
+ // we need to empty fields cause we will send new data
283
  $form_model->clear_fields();
284
  }
285
 
340
  if ( empty( $status ) ) {
341
  $status = Forminator_Form_Model::STATUS_PUBLISH;
342
  }
 
343
  } else {
344
  $form_model = Forminator_Base_Form_Model::get_model( $id );
345
 
423
  // Regenerare module css file.
424
  Forminator_Render_Form::regenerate_css_file( $form_id );
425
 
426
+ $count ++;
427
  }
428
  }
429
 
440
  *
441
  * @param array $settings Current Settings.
442
  * @param array $new_settings New Appearance settings.
443
+ *
444
  * @return array
445
  */
446
  private function merge_appearance_settings( $settings, $new_settings ) {
536
  * Save Appearance Preset
537
  *
538
  * @param string $id ID.
539
+ * @param array $settings Settings.
540
  */
541
  private static function save_preset( $id, $settings ) {
542
  update_option( 'forminator_appearance_preset_' . $id, $settings );
631
  update_option( 'forminator_v3_captcha_key', Forminator_Core::sanitize_text_field( 'v3_captcha_key' ) );
632
  update_option( 'forminator_v3_captcha_secret', Forminator_Core::sanitize_text_field( 'v3_captcha_secret' ) );
633
 
634
+ update_option( 'forminator_hcaptcha_key', sanitize_text_field( $_POST['hcaptcha_key'] ) );
635
+ update_option( 'forminator_hcaptcha_secret', sanitize_text_field( $_POST['hcaptcha_secret'] ) );
636
+ update_option( 'forminator_captcha_tab_saved', sanitize_text_field( $_POST['captcha_tab_saved'] ) );
637
  // update_option( "forminator_hcaptcha_noconflict", sanitize_text_field( $_POST['hcaptcha_noconflict'] ) );
638
 
639
  update_option( 'forminator_captcha_language', Forminator_Core::sanitize_text_field( 'captcha_language' ) );
716
 
717
  } else {
718
  $html .= '<div role="alert" class="sui-notice sui-active" style="display: block; text-align: left;" aria-live="assertive">';
719
+ $html .= '<div class="sui-notice-content">';
720
+ $html .= '<div class="sui-notice-message">';
721
+ $html .= '<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>';
722
+ $html .= '<p>' . esc_html__( 'You have to first save your credentials to load the reCAPTCHA . ', 'forminator' ) . '</p>';
723
+ $html .= '</div>';
724
+ $html .= '</div>';
725
  $html .= '</div>';
726
  }
727
 
740
 
741
  // $captcha = sanitize_text_field( $_POST['captcha'] );// phpcs:ignore -- data without nonce verification
742
 
743
+ $hcaptcha_key = get_option( 'forminator_hcaptcha_key', '' );
744
  $hcaptcha_secret = get_option( 'forminator_hcaptcha_secret', '' );
745
+ $onload = 'forminator_render_admin_hcaptcha';
746
 
747
  if ( ! empty( $hcaptcha_key ) && ! empty( $hcaptcha_secret ) ) {
748
  // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
749
  // recaptchacompat=off seems to fix problems with hcaptcha container loading recaptcha instead of hcaptcha in the admin
750
+ $html = '<script src="https://js.hcaptcha.com/1/api.js?hl=' . $language . '&onload=' . $onload . '&render=explicit&recaptchacompat=off" async defer></script>';
751
  $html .= '<div class="forminator-hcaptcha h-captcha" data-sitekey="' . esc_attr( $hcaptcha_key ) . '"></div>';
752
  } else {
753
+ $html = '<div class="sui-notice" style="margin: 10px 0;"><p>' . esc_html__( 'Save your API keys to load the hCAPTCHA preview.', 'forminator' ) . '</p></div>';
754
  }
755
 
756
  wp_send_json_success( $html );
864
  $preview_data = false;
865
  // force -1 for preview.
866
  $form_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
867
+ $form_id = $form_id ? $form_id : - 1;
868
 
869
  // Check if preview data set
870
  if ( ! empty( $_POST['data'] ) ) {
971
  * @see get_users()
972
  *
973
  * @since 1.2
 
974
  */
975
  $args = apply_filters( 'forminator_builder_search_emails_args', $args, $search_email );
976
 
995
  * @param string $search_email string to search.
996
  *
997
  * @since 1.2
 
998
  */
999
  $data = apply_filters( 'forminator_builder_search_emails_data', $data, $users, $args, $search_email );
1000
 
1005
  * Get superglobal POST data
1006
  *
1007
  * @param string $nonce_action action to validate.
1008
+ * @param array $sanitize_callbacks {
1009
+ * custom sanitize options, its assoc array
1010
+ * 'field_name_1' => 'function_to_call_1' function will called with `call_user_func_array`,
1011
+ * 'field_name_2' => 'function_to_call_2',
1012
+ * }
1013
  *
1014
  * @return array
1015
  * @since 1.1
 
1016
  */
1017
  protected function get_post_data( $nonce_action = '', $sanitize_callbacks = array() ) {
1018
  // do nonce / caps check when requested.
1192
  // Validate nonce
1193
  forminator_validate_ajax( 'forminator_save_import_' . $slug );
1194
 
1195
+ $importable = json_decode( html_entity_decode( wp_unslash( $_POST['importable'] ) ), true );
1196
 
1197
  $import_data = Forminator_Core::sanitize_array( $importable );
1198
 
1199
+ // Modify recipients if replace all recipients checkbox has been checked.
1200
+ $change_recipients = Forminator_Core::sanitize_text_field( 'change_recipients' );
1201
+ if ( 'checked' === $change_recipients ) {
1202
+ $import_data = $this->change_recipients( $import_data );
1203
+ }
1204
+
1205
  // hook custom data here.
1206
  $import_data = apply_filters( 'forminator_' . $slug . '_import_data', $import_data );
1207
 
1243
  }
1244
  }
1245
 
1246
+ /**
1247
+ * Change the recipients
1248
+ *
1249
+ * @since 1.18.0
1250
+ *
1251
+ * @param mixed $data imported module data.
1252
+ *
1253
+ * @return array $data
1254
+ */
1255
+ public function change_recipients( $data ) {
1256
+ if ( ! empty( $data['data']['notifications'] ) ) {
1257
+ $current_user_email = wp_get_current_user()->user_email;
1258
+
1259
+ foreach ( $data['data']['notifications'] as $notif_key => $notif ) {
1260
+ // Modify the recipients.
1261
+ if ( ! empty( $notif['recipients'] ) ) {
1262
+ $recipients = $this->apply_user_email( $notif['recipients'], $current_user_email );
1263
+ $data['data']['notifications'][ $notif_key ]['recipients'] = $recipients;
1264
+ }
1265
+
1266
+ // Modify the routing recipients.
1267
+ if ( ! empty( $notif['routing'] ) ) {
1268
+
1269
+ foreach ( $notif['routing'] as $routing_key => $route ) {
1270
+ if ( ! empty( $route['email'] ) ) {
1271
+ $route_emails = $this->apply_user_email( $route['email'], $current_user_email );
1272
+ $data['data']['notifications'][ $notif_key ]['routing'][ $routing_key ]['email'] = $route_emails;
1273
+ }
1274
+ }
1275
+ }
1276
+ }
1277
+ }
1278
+
1279
+ return $data;
1280
+ }
1281
+
1282
+ /**
1283
+ * Apply user emails
1284
+ *
1285
+ * @since 1.18.0
1286
+ *
1287
+ * @param string $data - Email recipients
1288
+ * @param string $current_user_email
1289
+ *
1290
+ * @return array $recipients
1291
+ */
1292
+ public function apply_user_email( $data, $current_user_email ) {
1293
+ $recipients = explode( ',', $data );
1294
+
1295
+ foreach ( $recipients as $key => $recipient ) {
1296
+ $recipient = trim( $recipient );
1297
+
1298
+ // Will not change recipients that use field tags like {email-1}.
1299
+ if ( false === strpos( $recipient, '{' ) ) {
1300
+ $recipients[ $key ] = $current_user_email;
1301
+ }
1302
+ }
1303
+ $recipients = array_unique( $recipients );
1304
+
1305
+ return implode( ',', $recipients );
1306
+ }
1307
 
1308
  /**
1309
  * Get instance of thirdparty importer class
1898
  $data['buttons'] = array();
1899
 
1900
  $data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
1901
+ '<button class="sui-button forminator-stripe-connect" type="button" data-nonce="' . wp_create_nonce( 'forminator_stripe_settings_modal' ) . '">' .
1902
+ '<span class="sui-loading-text">' . esc_html__( 'Connect', 'forminator' ) . '</span>' .
1903
+ '<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>' .
1904
+ '</button>' .
1905
+ '</div>';
1906
 
1907
  wp_send_json_success( $data );
1908
  }
2024
  $data['buttons'] = array();
2025
 
2026
  $data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
2027
+ '<button class="sui-button forminator-paypal-connect" type="button" data-nonce="' . wp_create_nonce( 'forminator_paypal_settings_modal' ) . '">' .
2028
+ '<span class="sui-loading-text">' . esc_html__( 'Connect', 'forminator' ) . '</span>' .
2029
+ '<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>' .
2030
+ '</button>' .
2031
+ '</div>';
2032
 
2033
  wp_send_json_success( $data );
2034
  }
2093
  wp_send_json_success();
2094
  }
2095
 
2096
+ /**
2097
+ * Promote free plan - Remind me later
2098
+ */
2099
+ public function promote_remind_later() {
2100
+ forminator_validate_ajax( 'forminator_promote_remind_later' );
2101
+
2102
+ set_transient( 'forminator_free_plan_remind_later_' . get_current_user_id(), true, WEEK_IN_SECONDS );
2103
+
2104
+ wp_send_json_success();
2105
+ }
2106
+
2107
  /**
2108
  * Save general payments settings
2109
  *
2208
  }
2209
  }
2210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2211
  /**
2212
  * Module search for all types
2213
  *
2237
  wp_send_json_success( $html );
2238
  }
2239
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2240
  public function addons_page_actions() {
2241
  // Validate nonce.
2242
  forminator_validate_ajax( 'forminator_popup_addons_actions' );
2258
  );
2259
 
2260
  }
2261
+
2262
+ /**
2263
+ * Filter report data
2264
+ *
2265
+ * @return void
2266
+ */
2267
+ public function filter_report_data() {
2268
+ // Validate nonce.
2269
+ forminator_validate_ajax( 'forminator_filter_report_data' );
2270
+
2271
+ $form_id = filter_input( INPUT_POST, 'form_id', FILTER_VALIDATE_INT );
2272
+ $form_type = Forminator_Core::sanitize_text_field( 'form_type' );
2273
+ $start_date = Forminator_Core::sanitize_text_field( 'start_date' );
2274
+ $end_date = Forminator_Core::sanitize_text_field( 'end_date' );
2275
+ $range_time = Forminator_Core::sanitize_text_field( 'range_time' );
2276
+ $range_text = ! empty( $range_time ) ? $range_time : 'Custom';
2277
+
2278
+ if ( ! empty( $form_id ) && ! empty( $start_date ) && ! empty( $end_date ) ) {
2279
+
2280
+ $admin_report_instance = Forminator_Admin_Report_Page::get_instance();
2281
+
2282
+ $reports = $admin_report_instance->forminator_report_data( $form_id, $form_type, $start_date, $end_date, $range_text );
2283
+ $report_data = $admin_report_instance->forminator_report_array( $reports, $form_id );
2284
+ $chart_data = $admin_report_instance->forminator_report_chart_data( $form_id, $start_date, $end_date );
2285
+ if ( isset( $chart_data['submissions'] ) ) {
2286
+ $chart_data['submissions'] = array_values( $chart_data['submissions'] );
2287
+ }
2288
+
2289
+ if ( ! empty( $report_data ) ) {
2290
+ $response = array(
2291
+ 'reports' => $report_data,
2292
+ 'chart_data' => $chart_data
2293
+ );
2294
+ wp_send_json_success( $response );
2295
+ }
2296
+ }
2297
+ wp_send_json_error(
2298
+ array( 'message' => __( 'Required field missing', 'forminator' ) )
2299
+ );
2300
+ }
2301
  }
admin/classes/class-admin.php CHANGED
@@ -26,12 +26,22 @@ class Forminator_Admin {
26
  add_action( 'admin_notices', array( $this, 'show_stripe_updated_notice' ) );
27
  add_action( 'admin_notices', array( $this, 'show_rating_notice' ) );
28
  add_action( 'admin_notices', array( $this, 'show_pro_available_notice' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  add_action( 'admin_notices', array( $this, 'check_stripe_addon_version' ) );
30
  add_action( 'admin_notices', array( $this, 'show_cf7_importer_notice' ) );
31
  add_action( 'admin_notices', array( $this, 'show_addons_update_notice' ) );
32
- // add_action( 'admin_notices', array( $this, 'show_wpmudev_giveaway' ) );
33
- //add_action( 'admin_notices', array( $this, 'show_prelaunch_subscriptions_notice' ) );
34
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts_for_notices' ) );
35
  add_action( 'admin_init', array( $this, 'init_notices' ), 1 );
36
 
37
  // Add plugin action links.
@@ -55,8 +65,6 @@ class Forminator_Admin {
55
  * Triggered when Admin is loaded
56
  */
57
  do_action( 'forminator_admin_loaded' );
58
-
59
- $this->forminator_in_plugin_update_message();
60
  }
61
 
62
  /**
@@ -99,136 +107,6 @@ class Forminator_Admin {
99
  );
100
  }
101
 
102
- public function enqueue_scripts_for_notices() {
103
- // Hide for Forminator Pro.
104
- /* if ( FORMINATOR_PRO ) {
105
- return;
106
- } */
107
-
108
- // Enable notifications for main site and super admins only.
109
- if ( ! is_main_site() || ! current_user_can( 'update_core' ) ) {
110
- return;
111
- }
112
-
113
- $page = filter_input( INPUT_GET, 'page' );
114
- if ( ! $page || false === strpos( $page, 'forminator' ) ) {
115
- return;
116
- }
117
-
118
- $dismissed_messages = get_user_meta( get_current_user_id(), 'frmt_dismissed_messages', true );
119
-
120
- // Hide if already dismissed.
121
- /* if ( isset( $dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) &&
122
- $dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) {
123
- return;
124
- } */
125
-
126
- $forminator_data = new Forminator_Admin_Data();
127
- $forminator_l10n = new Forminator_Admin_L10n();
128
-
129
- // Discount subscription notice
130
- /* wp_register_script(
131
- 'forminator-admin-discount',
132
- forminator_plugin_url() . 'build/discount.js',
133
- array(
134
- 'jquery',
135
- 'wp-color-picker',
136
- 'react',
137
- 'react-dom',
138
- ),
139
- FORMINATOR_VERSION,
140
- true
141
- );
142
-
143
- wp_localize_script( 'forminator-admin-discount', 'forminatorData', $forminator_data->get_options_data() );
144
- wp_localize_script( 'forminator-admin-discount', 'forminatorl10n', $forminator_l10n->get_l10n_strings() );
145
-
146
- wp_enqueue_script( 'forminator-admin-discount' ); */
147
-
148
- // Membership Giveaway
149
- /* wp_register_script(
150
- 'forminator-admin-giveaway',
151
- forminator_plugin_url() . 'assets/js/giveaway.js',
152
- array(
153
- 'jquery',
154
- 'wp-color-picker',
155
- 'react',
156
- 'react-dom',
157
- ),
158
- FORMINATOR_VERSION,
159
- true
160
- );
161
-
162
- wp_localize_script( 'forminator-admin-giveaway', 'forminatorData', $forminator_data->get_options_data() );
163
- wp_localize_script( 'forminator-admin-giveaway', 'forminatorl10n', $forminator_l10n->get_l10n_strings() );
164
-
165
- wp_enqueue_script( 'forminator-admin-giveaway' ); */
166
- }
167
-
168
- /**
169
- * Show Prelaunch Subscriptions notice
170
- *
171
- * @since 1.14.10
172
- */
173
- public function show_prelaunch_subscriptions_notice() {
174
- $dismissed_messages = get_user_meta( get_current_user_id(), 'frmt_dismissed_messages', true );
175
-
176
- // Hide for Forminator Pro.
177
- /* if ( FORMINATOR_PRO ) {
178
- return;
179
- } */
180
-
181
- // Enable notifications for main site and super admins only.
182
- if ( ! is_main_site() || ! current_user_can( 'update_core' ) ) {
183
- return;
184
- }
185
-
186
- $page = filter_input( INPUT_GET, 'page' );
187
- if ( ! $page || false === strpos( $page, 'forminator' ) ) {
188
- return;
189
- }
190
-
191
- // Hide if already dismissed.
192
- /* if ( isset( $dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) &&
193
- $dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) {
194
- return;
195
- } */
196
-
197
- ?>
198
- <!-- Load shared module markup -->
199
- <div
200
- id="app"
201
- class="sui-wrap sui-subscription-notice"
202
- data-prop="forminator_prelaunch_subscriptions_notice_dismissed"
203
- data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_prelaunch_subscriptions' ) ); ?>"
204
- ></div>
205
-
206
- <!-- Function to keep notice closed after user clicks on dismiss button -->
207
- <script type="text/javascript">
208
- ( function( $ ) {
209
- // Define global FORMI object if it doesn't exist.
210
- if ( 'object' !== typeof window.FORMI ) {
211
- window.FORMI = {};
212
- }
213
-
214
- FORMI.dismissNotice = function() {
215
- var $notice = $( '#app' );
216
- var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
217
-
218
- jQuery.post(
219
- ajaxUrl,
220
- {
221
- action: 'forminator_dismiss_prelaunch_subscriptions',
222
- prop: $notice.data('prop'),
223
- _ajax_nonce: $notice.data('nonce')
224
- }
225
- );
226
- }
227
- }( jQuery ) );
228
- </script>
229
- <?php
230
- }
231
-
232
  /**
233
  * Include required files
234
  *
@@ -242,6 +120,7 @@ class Forminator_Admin {
242
  include_once forminator_plugin_dir() . 'admin/pages/settings-page.php';
243
  include_once forminator_plugin_dir() . 'admin/pages/upgrade-page.php';
244
  include_once forminator_plugin_dir() . 'admin/pages/addons-page.php';
 
245
 
246
  // Admin AJAX.
247
  include_once forminator_plugin_dir() . 'admin/classes/class-admin-ajax.php';
@@ -270,6 +149,9 @@ class Forminator_Admin {
270
  // Admin Addons page.
271
  include_once forminator_plugin_dir() . 'admin/classes/class-addons-page.php';
272
 
 
 
 
273
  }
274
 
275
  /**
@@ -411,28 +293,29 @@ class Forminator_Admin {
411
  }
412
 
413
  /**
414
- * Check if we have any Stripe form
415
  *
416
- * @since 1.9
417
- *
418
- * @return bool
419
  */
420
- public function has_stripe_forms() {
421
- $forms = Forminator_Form_Model::model()->get_models_by_field( 'stripe-1' );
422
-
423
- if ( count( $forms ) > 0 ) {
424
- return true;
425
- }
426
 
427
- return false;
 
 
 
 
 
 
428
  }
429
 
430
  /**
431
  * Check if we have any old Stripe form
432
  *
 
433
  * @since 1.9
434
  *
435
- * @return bool
436
  */
437
  public function has_old_stripe_forms() {
438
  $forms = Forminator_Form_Model::model()->get_models_by_field_and_version( 'stripe-1', '1.9-alpha.1' );
@@ -461,14 +344,17 @@ class Forminator_Admin {
461
  }
462
 
463
  // Show the notice only to users who can do something about this and who are members.
464
- if ( ! self::user_can_update_plugins() || ! in_array( forminator_membership_status(), array( 'full', 'upgrade' ), true ) ) {
 
 
 
465
  return;
466
  }
467
 
468
  $url = add_query_arg(
469
- array( 'page' => 'wpmudev-plugins' ),
470
- network_admin_url( 'admin.php' )
471
- ) . '#pid=2097296';
472
  $link = '<a type="button" href="' . esc_url( $url ) . '" target="_self" class="button button-primary">' . esc_html__( 'Upgrade' ) . '</a>';
473
 
474
  $username = forminator_get_current_username();
@@ -481,10 +367,64 @@ class Forminator_Admin {
481
  $message .= '<p>' . $link . '</p>';
482
 
483
  echo '<div class="forminator-grouped-notice notice notice-info is-dismissible"'
484
- . ' data-notice-slug="forminator_pro_is_available"'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
  . ' data-nonce="' . esc_attr( wp_create_nonce( 'forminator_dismiss_notice' ) ) . '">';
486
  echo wp_kses_post( $message );
487
  echo '</div>';
 
 
 
 
 
 
488
  }
489
 
490
  /**
@@ -494,7 +434,7 @@ class Forminator_Admin {
494
  public function check_stripe_addon_version() {
495
  // Show the notice only if Stripe Addon is active and its version is less than 1.0.4.
496
  if ( ! defined( 'FORMINATOR_STRIPE_ADDON' ) || ! class_exists( 'Forminator_Stripe_Addon' )
497
- || version_compare( FORMINATOR_STRIPE_ADDON, '1.0.4', '>=' ) ) {
498
  return;
499
  }
500
 
@@ -509,8 +449,8 @@ class Forminator_Admin {
509
  $message .= '</p>';
510
 
511
  echo '<div class="forminator-grouped-notice notice notice-error"'
512
- . ' data-notice-slug="forminator_pro_is_available"'
513
- . '>';
514
  echo wp_kses_post( $message );
515
  echo '</div>';
516
  }
@@ -519,6 +459,7 @@ class Forminator_Admin {
519
  * Check if the given notification was dismissed.
520
  *
521
  * @param string $notification_name Notification slug.
 
522
  * @return bool
523
  */
524
  public static function was_notification_dismissed( $notification_name ) {
@@ -527,6 +468,17 @@ class Forminator_Admin {
527
  return ( is_array( $dismissed ) && in_array( $notification_name, $dismissed, true ) );
528
  }
529
 
 
 
 
 
 
 
 
 
 
 
 
530
  /**
531
  * Check if the current user is able to update plugins
532
  *
@@ -555,60 +507,60 @@ class Forminator_Admin {
555
  }
556
 
557
  ?>
558
- <div class="forminator-notice-cf7 forminator-notice notice notice-info"
559
- data-prop="forminator_cf7_notice_dismissed"
560
- data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
561
- <p style="color: #1A2432; font-size: 14px; font-weight: bold;"><?php echo esc_html__( 'Forminator - Import your Contact Form 7 forms automatically', 'forminator' ); ?></p>
562
-
563
- <p style="color: #72777C; line-height: 22px;"><?php echo esc_html__( 'We noticed that Contact Form 7 is active on your website. You can use our built-in Contact Form 7 importer to import your existing forms and the relevant plugin settings from Contact Form 7 to Forminator. The importer supports the most widely used add-ons as well.', 'forminator' ); ?></p>
564
-
565
- <p>
566
- <a href="<?php echo esc_url( menu_page_url( 'forminator-settings', false ) . '&section=import' ); ?>"
567
- class="button button-primary"><?php esc_html_e( 'Import Contact Form 7 Forms', 'forminator' ); ?></a>
568
- <a href="#" class="dismiss-notice"
569
- style="margin-left: 10px; text-decoration: none; color: #555; font-weight: 500;"><?php esc_html_e( 'Dismiss', 'forminator' ); ?></a>
570
- </p>
571
-
572
- </div>
573
-
574
- <script type="text/javascript">
575
- jQuery('.forminator-notice-cf7 .button-primary').on('click', function (e) {
576
- e.preventDefault();
577
-
578
- var $self = jQuery(this);
579
- var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
580
- var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
581
-
582
- jQuery.post(
583
- ajaxUrl,
584
- {
585
- action: 'forminator_dismiss_notification',
586
- prop: $notice.data('prop'),
587
- _ajax_nonce: $notice.data('nonce')
588
- }
589
- ).always(function () {
590
- location.href = $self.attr('href');
591
- });
592
- });
593
-
594
- jQuery('.forminator-notice-cf7 .dismiss-notice').on('click', function (e) {
595
- e.preventDefault();
596
-
597
- var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
598
- var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
599
-
600
- jQuery.post(
601
- ajaxUrl,
602
- {
603
- action: 'forminator_dismiss_notification',
604
- prop: $notice.data('prop'),
605
- _ajax_nonce: $notice.data('nonce')
606
- }
607
- ).always(function () {
608
- $notice.hide();
609
- });
610
- });
611
- </script>
612
  <?php
613
  }
614
 
@@ -629,36 +581,39 @@ class Forminator_Admin {
629
  }
630
  ?>
631
 
632
- <div class="forminator-notice notice notice-warning" data-prop="forminator_stripe_notice_dismissed" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
633
-
634
- <p style="color: #72777C; line-height: 22px;"><?php echo wp_kses_post( sprintf( __( 'To make Forminator\'s Stripe field <a href="%s" target="_blank">SCA Compliant</a>, we have replaced the Stripe Checkout modal with Stripe Elements which adds an inline field to collect your customer\'s credit or debit card details. Your existing forms with Stripe field are automatically updated, but we recommend checking them to ensure everything works fine.', 'forminator' ), 'https://stripe.com/gb/guides/strong-customer-authentication' ) ); ?></p>
635
-
636
- <p>
637
- <a href="<?php echo esc_url( menu_page_url( 'forminator', false ) . '&show_stripe_dialog=true' ); ?>" class="button button-primary"><?php esc_html_e( 'Learn more', 'forminator' ); ?></a>
638
- <a href="#" class="dismiss-notice" style="margin-left: 10px; text-decoration: none; color: #555; font-weight: 500;"><?php esc_html_e( 'Dismiss', 'forminator' ); ?></a>
639
- </p>
640
-
641
- </div>
642
-
643
- <script type="text/javascript">
644
- jQuery( '.forminator-notice .dismiss-notice' ).on( 'click', function( e ) {
645
- e.preventDefault();
646
-
647
- var $notice = jQuery( e.currentTarget ).closest( '.forminator-notice' );
648
- var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
649
-
650
- jQuery.post(
651
- ajaxUrl,
652
- {
653
- action: 'forminator_dismiss_notification',
654
- prop: $notice.data('prop'),
655
- _ajax_nonce: $notice.data('nonce')
656
- }
657
- ).always( function() {
658
- $notice.hide();
659
- });
660
- });
661
- </script>
 
 
 
662
  <?php
663
  }
664
 
@@ -688,19 +643,25 @@ class Forminator_Admin {
688
  $milestone = ( 10 >= $published_modules ) ? 5 : 10;
689
  ?>
690
 
691
- <div id="forminator-free-publish-notice" class="forminator-rating-notice notice notice-info fui-wordpress-notice" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
 
 
692
 
693
- <p style="color: #72777C; line-height: 22px;"><?php printf( esc_html__( 'Awesome! You\'ve published more than %d modules with Forminator. Hope you are enjoying it so far. We have spent countless hours developing this free plugin for you, and we would really appreciate it if you could drop us a rating on wp.org to help us spread the word and boost our motivation.', 'forminator' ), (int) $milestone ); ?></p>
694
 
695
- <p>
696
- <a type="button" href="#" target="_blank" class="button button-primary button-large" data-prop="forminator_rating_success"><?php esc_html_e( 'Rate Forminator', 'forminator' ); ?></a>
 
697
 
698
- <button type="button" class="button button-large" style="margin-left: 11px;" data-prop="<?php echo 10 > $published_modules ? 'forminator_publish_rating_later' : 'forminator_publish_rating_later_dismiss'; ?>"><?php esc_html_e( 'Maybe later', 'forminator' ); ?></button>
 
699
 
700
- <a href="#" class="dismiss" style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;" data-prop="forminator_rating_dismissed"><?php esc_html_e( 'No Thanks', 'forminator' ); ?></a>
701
- </p>
 
 
702
 
703
- </div>
704
 
705
  <?php
706
  } else {
@@ -711,22 +672,22 @@ class Forminator_Admin {
711
  if ( $install_date && current_time( 'timestamp' ) > strtotime( '+7 days', $install_date ) && ! $publish_later && ! $publish_later_dismiss && ! $days_later_dismiss ) {
712
  ?>
713
 
714
- <div id="forminator-free-usage-notice"
715
- class="forminator-rating-notice notice notice-info fui-wordpress-notice"
716
- data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
717
 
718
- <p style="color: #72777C; line-height: 22px;"><?php esc_html_e( 'Excellent! You\'ve been using Forminator for a while now. Hope you are enjoying it so far. We have spent countless hours developing this free plugin for you, and we would really appreciate it if you could drop us a rating on wp.org to help us spread the word and boost our motivation.', 'forminator' ); ?></p>
719
 
720
- <p>
721
- <a type="button" href="#" target="_blank" class="button button-primary button-large"
722
- data-prop="forminator_rating_success"><?php esc_html_e( 'Rate Forminator', 'forminator' ); ?></a>
723
 
724
- <a href="#" class="dismiss"
725
- style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;"
726
- data-prop="forminator_days_rating_later_dismiss"><?php esc_html_e( 'Maybe later', 'forminator' ); ?></a>
727
- </p>
728
 
729
- </div>
730
 
731
  <?php
732
  }
@@ -734,30 +695,30 @@ class Forminator_Admin {
734
 
735
  ?>
736
 
737
- <script type="text/javascript">
738
- jQuery('.forminator-rating-notice a, .forminator-rating-notice button').on('click', function (e) {
739
- e.preventDefault();
740
-
741
- var $notice = jQuery(e.currentTarget).closest('.forminator-rating-notice'),
742
- prop = jQuery(this).data('prop'),
743
- ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
744
-
745
- if ('forminator_rating_success' === prop) {
746
- window.open('https://wordpress.org/support/plugin/forminator/reviews/#new-post', '_blank');
747
- }
748
-
749
- jQuery.post(
750
- ajaxUrl,
751
- {
752
- action: 'forminator_dismiss_notification',
753
- prop: prop,
754
- _ajax_nonce: $notice.data('nonce')
755
- }
756
- ).always(function () {
757
- $notice.hide();
758
- });
759
- });
760
- </script>
761
 
762
  <?php
763
  }
@@ -765,11 +726,11 @@ class Forminator_Admin {
765
  /**
766
  * Show action links on the plugin screen.
767
  *
768
- * @since 1.13
769
- *
770
  * @param array $links Plugin Action links.
771
  *
772
  * @return mixed
 
 
773
  */
774
  public function add_plugin_action_links( $links ) {
775
  // Settings link.
@@ -785,7 +746,7 @@ class Forminator_Admin {
785
  // Upgrade or Renew links.
786
  if ( ! FORMINATOR_PRO || 'upgrade' === $membership ) {
787
  $action_links['upgrade'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_upgrade' ) . '" aria-label="' . esc_attr( __( 'Upgrade to Forminator Pro', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade', 'forminator' ) . '</a>';
788
- } elseif ( 'expired' === $membership || 'free' === $membership ) {
789
  $action_links['renew'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_renew' ) . '" aria-label="' . esc_attr( __( 'Upgrade 35% OFF Sale', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade 35% OFF Sale', 'forminator' ) . '</a>';
790
  }
791
 
@@ -795,13 +756,13 @@ class Forminator_Admin {
795
  /**
796
  * Show row meta on the plugin screen.
797
  *
798
- * @since 1.13
799
- *
800
  * @param mixed $links Plugin Row Meta.
801
  * @param mixed $file Plugin Base file.
802
  * @param array $plugin_data Plugin data.
803
  *
804
  * @return array
 
 
805
  */
806
  public function plugin_row_meta( $links, $file, $plugin_data ) {
807
  if ( FORMINATOR_PLUGIN_BASENAME === $file ) {
@@ -891,169 +852,54 @@ class Forminator_Admin {
891
  }
892
  ?>
893
 
894
- <div id="forminator-addons-update-notice" class="forminator-update-notice notice notice-info fui-wordpress-notice is-dismissible" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
895
- <p style="color: #72777C; line-height: 22px;">
896
- <strong>
 
 
897
  <?php echo esc_html__( 'New update available for one or more Add-ons.', 'forminator' ); ?>
898
- </strong>
899
- </p>
900
- <p style="color: #72777C; line-height: 22px;">
901
  <?php esc_html_e( 'A new update is available for one or more of your Forminator Add-ons. Click on the button below to check and update the required Add-on.', 'forminator' ); ?>
902
- </p>
903
- <p><a type="button"
904
- href="<?php echo esc_url( menu_page_url( 'forminator-addons', false ) ); ?>"
905
- target="_blank" class="button button-primary button-large"
906
- ><?php esc_html_e( 'View and Update', 'forminator' ); ?></a>
907
  <?php if ( ! $notice_later ) { ?>
908
- <a href="#" class="forminator-notice-dismiss" data-prop="forminator_addons_update_<?php echo esc_attr( $version ); ?>later" style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;" data-prop-value="<?php echo esc_attr( current_time( 'timestamp' ) ); ?>"><?php esc_html_e( 'Remind me later', 'forminator' ); ?></a>
 
 
 
909
  <?php } ?>
910
- </p>
911
- <button type="button" class="notice-dismiss forminator-notice-dismiss" data-prop="forminator_addons_update_<?php echo esc_attr( $version ); ?>dismiss">
912
- <span class="screen-reader-text"></span>
913
- </button>
914
- </div>
915
- <script type="text/javascript">
916
- jQuery( '.forminator-update-notice .forminator-notice-dismiss' ).on( 'click', function( e ) {
917
- e.preventDefault();
918
-
919
- var $notice = jQuery( e.currentTarget ).closest( '.forminator-update-notice' ),
920
- prop = jQuery( this ).data('prop'),
921
- value = jQuery( this ).data('prop-value'),
922
- ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
923
- jQuery.post(
924
- ajaxUrl,
925
- {
926
- action: 'forminator_dismiss_notification',
927
- prop: prop,
928
- value: 'undefined' !== typeof value ? value : '',
929
- _ajax_nonce: $notice.data('nonce')
930
- }
931
- ).always( function() {
932
- $notice.hide();
933
- });
934
- });
935
- </script>
 
936
  <?php
937
  }
938
-
939
- /**
940
- * Get apply preset modal HTML
941
- */
942
- public static function get_apply_preset_modal() {
943
- ?>
944
- <div class="sui-modal sui-modal-sm sui-modal-alt">
945
- <div
946
- role="dialog"
947
- id="forminator-apply-preset-modal"
948
- class="sui-modal-content sui-fade-in"
949
- aria-labelledby="forminator-apply-preset-title"
950
- aria-describedby="forminator-apply-preset-description"
951
- >
952
- <div class="sui-box" role="document">
953
- <div class="sui-box-header sui-flatten sui-content-center sui-spacing-top--60">
954
- <button class="sui-button-icon sui-button-float--right" data-modal-close="">
955
- <span class="sui-icon-close sui-md" aria-hidden="true"></span>
956
- <span class="sui-screen-reader-text"><?php esc_html_e( 'Close this dialog window.', 'forminator' ); ?></span>
957
- </button>
958
-
959
- <h3 class="sui-box-title sui-lg" id="forminator-apply-preset-title"><?php esc_html_e( 'Choose Preset', 'forminator' ); ?></h3>
960
-
961
- <p class="sui-description" id="forminator-apply-preset-description">
962
- <?php esc_html_e( 'Select an appearance preset from the list below to apply the appearance to the selected form(s)', 'forminator' ); ?>
963
- </p>
964
- </div>
965
- <div class="sui-box-body sui-box-body-slim">
966
-
967
- <div class="sui-form-field" style="margin-bottom: 10px;">
968
- <?php echo Forminator_Settings_Page::get_preset_selectbox(); ?>
969
- </div>
970
-
971
- <div class="sui-notice" style="margin-top: 10px;">
972
- <div class="sui-notice-content">
973
- <div class="sui-notice-message">
974
- <span class="sui-notice-icon sui-icon-info sui-md" aria-hidden="true"></span>
975
- <p><?php esc_html_e( 'The current appearance configurations will be overwritten for the selected form(s).', 'forminator' ); ?></p>
976
- </div>
977
- </div>
978
- </div>
979
-
980
- </div>
981
-
982
- <div class="sui-box-footer sui-flatten sui-box-footer-center sui-content-center" style="padding-bottom: 40px;">
983
- <button id="forminator-apply-preset" class="sui-button sui-button-blue">
984
- <span class="sui-button-text-default">
985
- <i class="sui-icon-check" aria-hidden="true"></i> <?php esc_html_e( 'Apply Preset', 'forminator' ); ?>
986
- </span>
987
- <span class="sui-button-text-onload">
988
- <i class="sui-icon-loader sui-loading" aria-hidden="true"></i>
989
- </span>
990
- </button>
991
- </div>
992
- <?php wp_nonce_field( 'forminator_apply_preset' ); ?>
993
- </div>
994
- </div>
995
- </div>
996
- <?php
997
- }
998
-
999
- /**
1000
- * Forminator plugin update notice
1001
- *
1002
- * @return void
1003
- */
1004
- public function forminator_in_plugin_update_message() {
1005
- if ( ! FORMINATOR_PRO ) {
1006
- add_action( 'in_plugin_update_message-forminator/forminator.php', array(
1007
- $this,
1008
- 'show_plugin_update_notice'
1009
- ), 10, 2 );
1010
- } else {
1011
- add_action(
1012
- 'load-plugins.php',
1013
- function () {
1014
- add_action( 'after_plugin_row_forminator/forminator.php', array(
1015
- $this,
1016
- 'show_plugin_update_notice'
1017
- ), 10, 2 );
1018
- },
1019
- 22
1020
- );
1021
- }
1022
- }
1023
-
1024
- /**
1025
- * Show plugin update notice
1026
- *
1027
- * @param $data
1028
- * @param $response
1029
- *
1030
- * @return void
1031
- */
1032
- public function show_plugin_update_notice( $data, $response ) {
1033
- $plugin_data = (object) $response;
1034
-
1035
- if ( empty( $plugin_data->update ) || empty( $plugin_data->new_version ) || empty( $plugin_data->plugin ) ) {
1036
- return;
1037
- }
1038
-
1039
- if ( '1.16.0' === $plugin_data->new_version || '1.16' === $plugin_data->new_version ) {
1040
- $notice = '<br/><strong>' . __( 'Upgrade Notice: ', 'forminator' ) . '</strong>';
1041
- $notice .= __( 'Forminator is getting a huge performance boost thanks to some form submission improvements.', 'forminator' );
1042
- $notice .= '<br/><br/>' . sprintf(
1043
- __( 'There\'s an extremely low chance these changes may affect you if any of your forms use a custom action or filter that we\'ve now removed or modified (forms using standard Forminator features won\'t be affected at all). If needed, refer to this list of the %1$sretired actions/filters%2$s, but we\'re confident that %3$s of users should remain unaffected.', 'forminator' ),
1044
- '<a href="https://wpmudev.com/docs/api-plugin-development/forminator-api-docs/#modified-or-deprecated-hooks" target="_blank">',
1045
- '</a>',
1046
- '99%'
1047
- );
1048
- $notice .= '<br/><br/>' . esc_html__( 'Any problems or issues? Don\'t hesitate to create a support ticket or contact support directly.', 'forminator' );
1049
-
1050
- echo "<script type='text/javascript'>
1051
- (function ($) {
1052
- $( function (e) {
1053
- $( '.wp-list-table tr[data-plugin=\"" . esc_attr( $plugin_data->plugin ) . "\"] .notice-warning' ).append( '" . addslashes( $notice ) . "' ).css('padding-bottom', '10px');
1054
- });
1055
- })(jQuery);
1056
- </script>";
1057
- }
1058
- }
1059
  }
26
  add_action( 'admin_notices', array( $this, 'show_stripe_updated_notice' ) );
27
  add_action( 'admin_notices', array( $this, 'show_rating_notice' ) );
28
  add_action( 'admin_notices', array( $this, 'show_pro_available_notice' ) );
29
+
30
+ // Show Promote free plan notice only for Free version, for admins and if WPMU DEV Dashboard is not activated.
31
+ if ( ! FORMINATOR_PRO && ! class_exists( 'WPMUDEV_Dashboard' ) && current_user_can( 'manage_options' )
32
+ // The notice was already dismissed.
33
+ && ! self::was_notification_dismissed( 'forminator_promote_free_plan' )
34
+ // Remind me later was clicked.
35
+ && ! self::maybe_remind_later()
36
+ ) {
37
+
38
+ add_action( 'admin_notices', array( $this, 'promote_free_plan' ) );
39
+ add_action( 'admin_enqueue_scripts', array( $this, 'promote_free_plan_scripts' ) );
40
+ }
41
+
42
  add_action( 'admin_notices', array( $this, 'check_stripe_addon_version' ) );
43
  add_action( 'admin_notices', array( $this, 'show_cf7_importer_notice' ) );
44
  add_action( 'admin_notices', array( $this, 'show_addons_update_notice' ) );
 
 
 
45
  add_action( 'admin_init', array( $this, 'init_notices' ), 1 );
46
 
47
  // Add plugin action links.
65
  * Triggered when Admin is loaded
66
  */
67
  do_action( 'forminator_admin_loaded' );
 
 
68
  }
69
 
70
  /**
107
  );
108
  }
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  /**
111
  * Include required files
112
  *
120
  include_once forminator_plugin_dir() . 'admin/pages/settings-page.php';
121
  include_once forminator_plugin_dir() . 'admin/pages/upgrade-page.php';
122
  include_once forminator_plugin_dir() . 'admin/pages/addons-page.php';
123
+ include_once forminator_plugin_dir() . 'admin/pages/reports-page.php';
124
 
125
  // Admin AJAX.
126
  include_once forminator_plugin_dir() . 'admin/classes/class-admin-ajax.php';
149
  // Admin Addons page.
150
  include_once forminator_plugin_dir() . 'admin/classes/class-addons-page.php';
151
 
152
+ // Admin report page
153
+ include_once forminator_plugin_dir() . 'admin/classes/class-reports-page.php';
154
+
155
  }
156
 
157
  /**
293
  }
294
 
295
  /**
296
+ * Add Reports page
297
  *
298
+ * @since 1.18.0
 
 
299
  */
300
+ public function add_reports_page() {
301
+ add_action( 'admin_menu', array( $this, 'init_reports_page' ) );
302
+ }
 
 
 
303
 
304
+ /**
305
+ * Initialize Reports page
306
+ *
307
+ * @since 1.18.0
308
+ */
309
+ public function init_reports_page() {
310
+ $this->pages['forminator-reports'] = new Forminator_Reports_Page( 'forminator-reports', 'common/reports', __( 'Reports', 'forminator' ), __( 'Reports', 'forminator' ), 'forminator' );
311
  }
312
 
313
  /**
314
  * Check if we have any old Stripe form
315
  *
316
+ * @return bool
317
  * @since 1.9
318
  *
 
319
  */
320
  public function has_old_stripe_forms() {
321
  $forms = Forminator_Form_Model::model()->get_models_by_field_and_version( 'stripe-1', '1.9-alpha.1' );
344
  }
345
 
346
  // Show the notice only to users who can do something about this and who are members.
347
+ if ( ! self::user_can_update_plugins() || ! in_array( forminator_membership_status(), array(
348
+ 'full',
349
+ 'upgrade'
350
+ ), true ) ) {
351
  return;
352
  }
353
 
354
  $url = add_query_arg(
355
+ array( 'page' => 'wpmudev-plugins' ),
356
+ network_admin_url( 'admin.php' )
357
+ ) . '#pid=2097296';
358
  $link = '<a type="button" href="' . esc_url( $url ) . '" target="_self" class="button button-primary">' . esc_html__( 'Upgrade' ) . '</a>';
359
 
360
  $username = forminator_get_current_username();
367
  $message .= '<p>' . $link . '</p>';
368
 
369
  echo '<div class="forminator-grouped-notice notice notice-info is-dismissible"'
370
+ . ' data-notice-slug="forminator_pro_is_available"'
371
+ . ' data-nonce="' . esc_attr( wp_create_nonce( 'forminator_dismiss_notice' ) ) . '">';
372
+ echo wp_kses_post( $message );
373
+ echo '</div>';
374
+ }
375
+
376
+ /**
377
+ * Enqueue scripts for Promote Free Plan notice
378
+ */
379
+ public function promote_free_plan_scripts() {
380
+ // Show the notice only on WP Dashboard page.
381
+ $screen = get_current_screen();
382
+ if ( 'dashboard' !== $screen->id ) {
383
+ return;
384
+ }
385
+
386
+ $dashboard_object = $this->pages['forminator-dashboard'];
387
+ $dashboard_object->enqueue_scripts( '' );
388
+ }
389
+
390
+ /**
391
+ * Displays Promote Free Plan notice
392
+ */
393
+ public function promote_free_plan() {
394
+ // Show the notice only on WP Dashboard page.
395
+ $screen = get_current_screen();
396
+ if ( 'dashboard' !== $screen->id ) {
397
+ return;
398
+ }
399
+
400
+ $button_1 = '<a href="https://wpmudev.com/register/?free_hub&utm_source=forminator&utm_medium=referral&utm_campaign=wp_admin_free_plan_1" target="_blank" class="button button-primary">'
401
+ . esc_html__( 'Claim your free gift' )
402
+ . '</a>';
403
+ $button_2 = '<button class="button" id="forminator-promote-popup-open">' . esc_html__( 'Find out more' ) . '</button>';
404
+ $remind = '<a style="margin-left:20px;text-decoration: none;" href="#" id="forminator-promote-remind-later" data-nonce="' . esc_attr( wp_create_nonce( 'forminator_promote_remind_later' ) ) . '">' . esc_html__( 'Remind me later', 'forminator' ) . '</a>';
405
+
406
+ $message = '<p><strong>';
407
+ $message .= esc_html__( 'Managing multiple WP sites for clients? Here’s a free gift to make it easier', 'forminator' );
408
+ $message .= '</strong></p>';
409
+ $message .= '<p>';
410
+ $message .= esc_html__( 'In addition to Forminator, WPMU DEV has everything you need for fast and convenient site management.', 'forminator' );
411
+ $message .= '</p>';
412
+ $message .= '<p>';
413
+ $message .= esc_html__( 'Trusted by over 50K web developers. Completely free to try.', 'forminator' );
414
+ $message .= '</p>';
415
+ $message .= '<p>' . $button_1 . '&nbsp;&nbsp;&nbsp;&nbsp;' . $button_2 . $remind . '</p>';
416
+
417
+ echo '<div class="forminator-grouped-notice notice notice-info is-dismissible"'
418
+ . ' data-notice-slug="forminator_promote_free_plan"'
419
  . ' data-nonce="' . esc_attr( wp_create_nonce( 'forminator_dismiss_notice' ) ) . '">';
420
  echo wp_kses_post( $message );
421
  echo '</div>';
422
+ $dashboard_object = $this->pages['forminator-dashboard'];
423
+ echo '<div class="' . esc_attr( $dashboard_object->get_sui_body_class() ) . '">';
424
+ echo '<div class="sui-wrap wpmudev-forminator-forminator">';
425
+ $dashboard_object->template( 'dashboard/promote-free-plan' );
426
+ echo '</div>';
427
+ echo '</div>';
428
  }
429
 
430
  /**
434
  public function check_stripe_addon_version() {
435
  // Show the notice only if Stripe Addon is active and its version is less than 1.0.4.
436
  if ( ! defined( 'FORMINATOR_STRIPE_ADDON' ) || ! class_exists( 'Forminator_Stripe_Addon' )
437
+ || version_compare( FORMINATOR_STRIPE_ADDON, '1.0.4', '>=' ) ) {
438
  return;
439
  }
440
 
449
  $message .= '</p>';
450
 
451
  echo '<div class="forminator-grouped-notice notice notice-error"'
452
+ . ' data-notice-slug="forminator_pro_is_available"'
453
+ . '>';
454
  echo wp_kses_post( $message );
455
  echo '</div>';
456
  }
459
  * Check if the given notification was dismissed.
460
  *
461
  * @param string $notification_name Notification slug.
462
+ *
463
  * @return bool
464
  */
465
  public static function was_notification_dismissed( $notification_name ) {
468
  return ( is_array( $dismissed ) && in_array( $notification_name, $dismissed, true ) );
469
  }
470
 
471
+ /**
472
+ * Return true if Remind me later was clicked
473
+ *
474
+ * @return bool
475
+ */
476
+ private static function maybe_remind_later() {
477
+ $option = get_transient( 'forminator_free_plan_remind_later_' . get_current_user_id() );
478
+
479
+ return ! ! $option;
480
+ }
481
+
482
  /**
483
  * Check if the current user is able to update plugins
484
  *
507
  }
508
 
509
  ?>
510
+ <div class="forminator-notice-cf7 forminator-notice notice notice-info"
511
+ data-prop="forminator_cf7_notice_dismissed"
512
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
513
+ <p style="color: #1A2432; font-size: 14px; font-weight: bold;"><?php echo esc_html__( 'Forminator - Import your Contact Form 7 forms automatically', 'forminator' ); ?></p>
514
+
515
+ <p style="color: #72777C; line-height: 22px;"><?php echo esc_html__( 'We noticed that Contact Form 7 is active on your website. You can use our built-in Contact Form 7 importer to import your existing forms and the relevant plugin settings from Contact Form 7 to Forminator. The importer supports the most widely used add-ons as well.', 'forminator' ); ?></p>
516
+
517
+ <p>
518
+ <a href="<?php echo esc_url( menu_page_url( 'forminator-settings', false ) . '&section=import' ); ?>"
519
+ class="button button-primary"><?php esc_html_e( 'Import Contact Form 7 Forms', 'forminator' ); ?></a>
520
+ <a href="#" class="dismiss-notice"
521
+ style="margin-left: 10px; text-decoration: none; color: #555; font-weight: 500;"><?php esc_html_e( 'Dismiss', 'forminator' ); ?></a>
522
+ </p>
523
+
524
+ </div>
525
+
526
+ <script type="text/javascript">
527
+ jQuery('.forminator-notice-cf7 .button-primary').on('click', function (e) {
528
+ e.preventDefault();
529
+
530
+ var $self = jQuery(this);
531
+ var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
532
+ var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
533
+
534
+ jQuery.post(
535
+ ajaxUrl,
536
+ {
537
+ action: 'forminator_dismiss_notification',
538
+ prop: $notice.data('prop'),
539
+ _ajax_nonce: $notice.data('nonce')
540
+ }
541
+ ).always(function () {
542
+ location.href = $self.attr('href');
543
+ });
544
+ });
545
+
546
+ jQuery('.forminator-notice-cf7 .dismiss-notice').on('click', function (e) {
547
+ e.preventDefault();
548
+
549
+ var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
550
+ var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
551
+
552
+ jQuery.post(
553
+ ajaxUrl,
554
+ {
555
+ action: 'forminator_dismiss_notification',
556
+ prop: $notice.data('prop'),
557
+ _ajax_nonce: $notice.data('nonce')
558
+ }
559
+ ).always(function () {
560
+ $notice.hide();
561
+ });
562
+ });
563
+ </script>
564
  <?php
565
  }
566
 
581
  }
582
  ?>
583
 
584
+ <div class="forminator-notice notice notice-warning" data-prop="forminator_stripe_notice_dismissed"
585
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
586
+
587
+ <p style="color: #72777C; line-height: 22px;"><?php echo wp_kses_post( sprintf( __( 'To make Forminator\'s Stripe field <a href="%s" target="_blank">SCA Compliant</a>, we have replaced the Stripe Checkout modal with Stripe Elements which adds an inline field to collect your customer\'s credit or debit card details. Your existing forms with Stripe field are automatically updated, but we recommend checking them to ensure everything works fine.', 'forminator' ), 'https://stripe.com/gb/guides/strong-customer-authentication' ) ); ?></p>
588
+
589
+ <p>
590
+ <a href="<?php echo esc_url( menu_page_url( 'forminator', false ) . '&show_stripe_dialog=true' ); ?>"
591
+ class="button button-primary"><?php esc_html_e( 'Learn more', 'forminator' ); ?></a>
592
+ <a href="#" class="dismiss-notice"
593
+ style="margin-left: 10px; text-decoration: none; color: #555; font-weight: 500;"><?php esc_html_e( 'Dismiss', 'forminator' ); ?></a>
594
+ </p>
595
+
596
+ </div>
597
+
598
+ <script type="text/javascript">
599
+ jQuery('.forminator-notice .dismiss-notice').on('click', function (e) {
600
+ e.preventDefault();
601
+
602
+ var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
603
+ var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
604
+
605
+ jQuery.post(
606
+ ajaxUrl,
607
+ {
608
+ action: 'forminator_dismiss_notification',
609
+ prop: $notice.data('prop'),
610
+ _ajax_nonce: $notice.data('nonce')
611
+ }
612
+ ).always(function () {
613
+ $notice.hide();
614
+ });
615
+ });
616
+ </script>
617
  <?php
618
  }
619
 
643
  $milestone = ( 10 >= $published_modules ) ? 5 : 10;
644
  ?>
645
 
646
+ <div id="forminator-free-publish-notice"
647
+ class="forminator-rating-notice notice notice-info fui-wordpress-notice"
648
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
649
 
650
+ <p style="color: #72777C; line-height: 22px;"><?php printf( esc_html__( 'Awesome! You\'ve published more than %d modules with Forminator. Hope you are enjoying it so far. We have spent countless hours developing this free plugin for you, and we would really appreciate it if you could drop us a rating on wp.org to help us spread the word and boost our motivation.', 'forminator' ), (int) $milestone ); ?></p>
651
 
652
+ <p>
653
+ <a type="button" href="#" target="_blank" class="button button-primary button-large"
654
+ data-prop="forminator_rating_success"><?php esc_html_e( 'Rate Forminator', 'forminator' ); ?></a>
655
 
656
+ <button type="button" class="button button-large" style="margin-left: 11px;"
657
+ data-prop="<?php echo 10 > $published_modules ? 'forminator_publish_rating_later' : 'forminator_publish_rating_later_dismiss'; ?>"><?php esc_html_e( 'Maybe later', 'forminator' ); ?></button>
658
 
659
+ <a href="#" class="dismiss"
660
+ style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;"
661
+ data-prop="forminator_rating_dismissed"><?php esc_html_e( 'No Thanks', 'forminator' ); ?></a>
662
+ </p>
663
 
664
+ </div>
665
 
666
  <?php
667
  } else {
672
  if ( $install_date && current_time( 'timestamp' ) > strtotime( '+7 days', $install_date ) && ! $publish_later && ! $publish_later_dismiss && ! $days_later_dismiss ) {
673
  ?>
674
 
675
+ <div id="forminator-free-usage-notice"
676
+ class="forminator-rating-notice notice notice-info fui-wordpress-notice"
677
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
678
 
679
+ <p style="color: #72777C; line-height: 22px;"><?php esc_html_e( 'Excellent! You\'ve been using Forminator for a while now. Hope you are enjoying it so far. We have spent countless hours developing this free plugin for you, and we would really appreciate it if you could drop us a rating on wp.org to help us spread the word and boost our motivation.', 'forminator' ); ?></p>
680
 
681
+ <p>
682
+ <a type="button" href="#" target="_blank" class="button button-primary button-large"
683
+ data-prop="forminator_rating_success"><?php esc_html_e( 'Rate Forminator', 'forminator' ); ?></a>
684
 
685
+ <a href="#" class="dismiss"
686
+ style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;"
687
+ data-prop="forminator_days_rating_later_dismiss"><?php esc_html_e( 'Maybe later', 'forminator' ); ?></a>
688
+ </p>
689
 
690
+ </div>
691
 
692
  <?php
693
  }
695
 
696
  ?>
697
 
698
+ <script type="text/javascript">
699
+ jQuery('.forminator-rating-notice a, .forminator-rating-notice button').on('click', function (e) {
700
+ e.preventDefault();
701
+
702
+ var $notice = jQuery(e.currentTarget).closest('.forminator-rating-notice'),
703
+ prop = jQuery(this).data('prop'),
704
+ ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
705
+
706
+ if ('forminator_rating_success' === prop) {
707
+ window.open('https://wordpress.org/support/plugin/forminator/reviews/#new-post', '_blank');
708
+ }
709
+
710
+ jQuery.post(
711
+ ajaxUrl,
712
+ {
713
+ action: 'forminator_dismiss_notification',
714
+ prop: prop,
715
+ _ajax_nonce: $notice.data('nonce')
716
+ }
717
+ ).always(function () {
718
+ $notice.hide();
719
+ });
720
+ });
721
+ </script>
722
 
723
  <?php
724
  }
726
  /**
727
  * Show action links on the plugin screen.
728
  *
 
 
729
  * @param array $links Plugin Action links.
730
  *
731
  * @return mixed
732
+ * @since 1.13
733
+ *
734
  */
735
  public function add_plugin_action_links( $links ) {
736
  // Settings link.
746
  // Upgrade or Renew links.
747
  if ( ! FORMINATOR_PRO || 'upgrade' === $membership ) {
748
  $action_links['upgrade'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_upgrade' ) . '" aria-label="' . esc_attr( __( 'Upgrade to Forminator Pro', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade', 'forminator' ) . '</a>';
749
+ } elseif ( ( 'expired' === $membership || 'free' === $membership ) && ! isset( $_SERVER['WPMUDEV_HOSTED'] ) ) {
750
  $action_links['renew'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_renew' ) . '" aria-label="' . esc_attr( __( 'Upgrade 35% OFF Sale', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade 35% OFF Sale', 'forminator' ) . '</a>';
751
  }
752
 
756
  /**
757
  * Show row meta on the plugin screen.
758
  *
 
 
759
  * @param mixed $links Plugin Row Meta.
760
  * @param mixed $file Plugin Base file.
761
  * @param array $plugin_data Plugin data.
762
  *
763
  * @return array
764
+ * @since 1.13
765
+ *
766
  */
767
  public function plugin_row_meta( $links, $file, $plugin_data ) {
768
  if ( FORMINATOR_PLUGIN_BASENAME === $file ) {
852
  }
853
  ?>
854
 
855
+ <div id="forminator-addons-update-notice"
856
+ class="forminator-update-notice notice notice-info fui-wordpress-notice is-dismissible"
857
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
858
+ <p style="color: #72777C; line-height: 22px;">
859
+ <strong>
860
  <?php echo esc_html__( 'New update available for one or more Add-ons.', 'forminator' ); ?>
861
+ </strong>
862
+ </p>
863
+ <p style="color: #72777C; line-height: 22px;">
864
  <?php esc_html_e( 'A new update is available for one or more of your Forminator Add-ons. Click on the button below to check and update the required Add-on.', 'forminator' ); ?>
865
+ </p>
866
+ <p><a type="button"
867
+ href="<?php echo esc_url( menu_page_url( 'forminator-addons', false ) ); ?>"
868
+ target="_blank" class="button button-primary button-large"
869
+ ><?php esc_html_e( 'View and Update', 'forminator' ); ?></a>
870
  <?php if ( ! $notice_later ) { ?>
871
+ <a href="#" class="forminator-notice-dismiss"
872
+ data-prop="forminator_addons_update_<?php echo esc_attr( $version ); ?>later"
873
+ style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;"
874
+ data-prop-value="<?php echo esc_attr( current_time( 'timestamp' ) ); ?>"><?php esc_html_e( 'Remind me later', 'forminator' ); ?></a>
875
  <?php } ?>
876
+ </p>
877
+ <button type="button" class="notice-dismiss forminator-notice-dismiss"
878
+ data-prop="forminator_addons_update_<?php echo esc_attr( $version ); ?>dismiss">
879
+ <span class="screen-reader-text"></span>
880
+ </button>
881
+ </div>
882
+ <script type="text/javascript">
883
+ jQuery('.forminator-update-notice .forminator-notice-dismiss').on('click', function (e) {
884
+ e.preventDefault();
885
+
886
+ var $notice = jQuery(e.currentTarget).closest('.forminator-update-notice'),
887
+ prop = jQuery(this).data('prop'),
888
+ value = jQuery(this).data('prop-value'),
889
+ ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
890
+ jQuery.post(
891
+ ajaxUrl,
892
+ {
893
+ action: 'forminator_dismiss_notification',
894
+ prop: prop,
895
+ value: 'undefined' !== typeof value ? value : '',
896
+ _ajax_nonce: $notice.data('nonce')
897
+ }
898
+ ).always(function () {
899
+ $notice.hide();
900
+ });
901
+ });
902
+ </script>
903
  <?php
904
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
905
  }
admin/classes/class-reports-page.php ADDED
@@ -0,0 +1,460 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die();
4
+ }
5
+
6
+ /**
7
+ * Class Forminator_Admin_Report_page
8
+ *
9
+ * @since 1.18.0
10
+ */
11
+ class Forminator_Admin_Report_Page {
12
+
13
+ /**
14
+ * Plugin instance
15
+ *
16
+ * @since 1.18.0
17
+ * @access private
18
+ * @var null
19
+ */
20
+ private static $instance = null;
21
+
22
+ /**
23
+ * Return the plugin instance
24
+ *
25
+ * @return Forminator_Admin_Report_page|null
26
+ */
27
+ public static function get_instance() {
28
+ if ( is_null( self::$instance ) ) {
29
+ self::$instance = new self();
30
+ }
31
+
32
+ return self::$instance;
33
+ }
34
+
35
+ /**
36
+ * Get Reports data
37
+ *
38
+ * @param $form_id
39
+ * @param $form_type
40
+ * @param $start_date
41
+ * @param $end_date
42
+ *
43
+ * @return array
44
+ */
45
+ public function forminator_report_data( $form_id, $form_type, $start_date = '', $end_date = '', $range_type = '' ) {
46
+ $reports = array();
47
+ $form_view = Forminator_Form_Views_Model::get_instance();
48
+ if ( ! empty( $form_id ) ) {
49
+ $start_date = ! empty( $start_date ) ? $start_date : date_i18n( 'Y-m-01' );
50
+ $end_date = ! empty( $end_date ) ? $end_date : date_i18n( 'Y-m-t' );
51
+ $module_slug = $this->get_module_slug( $form_type );
52
+ $module_time = get_the_date( 'Y-m-d H:i:s', $form_id );
53
+ $previous_time = ! empty( $range_type ) ? $range_type : 'This Month';
54
+ $previous_start_date = $this->forminator_previous_time( $previous_time, $start_date, $end_date );
55
+ $previous_end_date = date( 'Y-m-d', strtotime( '-1 day', strtotime( $start_date ) ) );
56
+ $reports = array(
57
+ 'start_date' => $start_date,
58
+ 'end_date' => $end_date,
59
+ 'previous_start' => $previous_start_date,
60
+ 'previous_end' => $previous_end_date,
61
+ 'last_entry_time' => forminator_get_latest_entry_time_by_form_id( $form_id ),
62
+ 'average_month' => Forminator_Admin_Report_Page::forminator_montly_average( $module_time ),
63
+ 'previous_entries' => Forminator_Form_Entry_Model::count_report_entries( $form_id, $previous_start_date, $previous_end_date ),
64
+ 'selected_entries' => Forminator_Form_Entry_Model::count_report_entries( $form_id, $start_date, $end_date ),
65
+ 'total_entries' => Forminator_Form_Entry_Model::count_report_entries( $form_id ),
66
+ 'previous_views' => $form_view->count_views( $form_id, $previous_start_date, $previous_end_date ),
67
+ 'selected_views' => $form_view->count_views( $form_id, $start_date, $end_date ),
68
+ 'total_views' => $form_view->count_views( $form_id ),
69
+ 'previous_payment' => 0,
70
+ 'selected_payment' => 0,
71
+ 'stripe_payment' => 0,
72
+ 'paypal_payment' => 0,
73
+ 'integration' => array(),
74
+ );
75
+
76
+ if ( 'quiz' === $module_slug ) {
77
+ $hasLead = false;
78
+ $model = Forminator_Base_Form_Model::get_model( $form_id );
79
+ if ( is_object( $model )
80
+ && isset( $model->settings['hasLeads'] )
81
+ && $model->settings['hasLeads']
82
+ ) {
83
+ $hasLead = $model->settings['hasLeads'];
84
+ $reports['total_leads'] = Forminator_Form_Entry_Model::count_leads( $form_id );
85
+ $reports['selected_leads'] = Forminator_Form_Entry_Model::count_leads( $form_id, $start_date, $end_date );
86
+ $reports['previous_leads'] = Forminator_Form_Entry_Model::count_leads( $form_id, $previous_start_date, $previous_end_date );
87
+ }
88
+ $reports['has_leads'] = $hasLead;
89
+ }
90
+
91
+ if ( self::has_live_payments( $form_id ) ) {
92
+ $payment_report = $this->forminator_payment_report_data( $form_id, $start_date, $end_date, $previous_start_date, $previous_end_date );
93
+ $reports = array_merge( $reports, $payment_report );
94
+ }
95
+
96
+ $connected_addons = forminator_get_addons_instance_connected_with_module( $form_id, $module_slug );
97
+ if ( ! empty( $connected_addons ) ) {
98
+ $reports['integration'] = $connected_addons;
99
+ }
100
+ forminator_maybe_log( __METHOD__, $start_date, $end_date );
101
+ }
102
+
103
+ return apply_filters( 'forminator_reports_data', $reports );
104
+ }
105
+
106
+ /**
107
+ * Get montly average
108
+ *
109
+ * @param $start_date
110
+ * @param $month_type
111
+ *
112
+ * @return mixed|void
113
+ */
114
+ public static function forminator_montly_average( $start_date ) {
115
+ $total_month = 0;
116
+ if ( ! empty( $start_date ) ) {
117
+ $start_date = strtotime( trim( $start_date ) );
118
+ $end_date = strtotime( date( 'Y/m/d' ) );
119
+ $start_year = date( 'Y', $start_date );
120
+ $end_year = date( 'Y', $end_date );
121
+ $start_month = date( 'm', $start_date );
122
+ $end_month = date( 'm', $end_date );
123
+ $total_month = ( ( $end_year - $start_year ) * 12 ) + ( $end_month - $start_month );
124
+ }
125
+
126
+ return apply_filters( 'forminator_reports_average_month', $total_month );
127
+ }
128
+
129
+ /**
130
+ * Check payment
131
+ *
132
+ * @param $form_id
133
+ *
134
+ * @return bool
135
+ */
136
+ public static function has_live_payments( $form_id ) {
137
+ $model = Forminator_Form_Entry_Model::has_live_payment( $form_id );
138
+
139
+ return $model;
140
+ }
141
+
142
+ /**
143
+ * Get module slug
144
+ *
145
+ * @param $form_type
146
+ *
147
+ * @return string
148
+ */
149
+ public function get_module_slug( $form_type ) {
150
+ switch ( $form_type ) {
151
+ case 'forminator_forms':
152
+ $slug = 'form';
153
+ break;
154
+ case 'forminator_polls':
155
+ $slug = 'poll';
156
+ break;
157
+ case 'forminator_quizzes':
158
+ $slug = 'quiz';
159
+ break;
160
+ default:
161
+ $slug = '';
162
+ break;
163
+ }
164
+
165
+ return $slug;
166
+ }
167
+
168
+ /**
169
+ * Report array
170
+ *
171
+ * @param $reports
172
+ * @param $form_id
173
+ *
174
+ * @return array[]
175
+ */
176
+ public function forminator_report_array( $reports, $form_id ) {
177
+ $report_data = array();
178
+ if ( ! empty( $reports ) ) {
179
+ $selected_conversion = 0 < $reports['selected_views']
180
+ ? number_format( ( $reports['selected_entries'] * 100 ) / $reports['selected_views'], 1 )
181
+ : 0;
182
+ $previous_conversion = 0 < $reports['previous_views']
183
+ ? number_format( ( $reports['previous_entries'] * 100 ) / $reports['previous_views'], 1 )
184
+ : 0;
185
+ $report_data = array(
186
+ 'views' => array(
187
+ 'selected' => intval( $reports['selected_views'] ),
188
+ 'previous' => intval( $reports['previous_views'] ),
189
+ 'increment' => $this->forminator_difference_calculate( $reports['selected_views'], $reports['previous_views'] ),
190
+ 'average' => 0 < $reports['average_month']
191
+ ? round( intval( $reports['total_views'] ) / intval( $reports['average_month'] ) )
192
+ : '',
193
+ 'difference' => $reports['selected_views'] > $reports['previous_views'] ? 'high' : 'low',
194
+ ),
195
+ 'conversion' => array(
196
+ 'selected' => 0 < $selected_conversion ? floatval( $selected_conversion ) . '%' : 0,
197
+ 'previous' => 0 < $previous_conversion ? floatval( $previous_conversion ) . '%' : 0,
198
+ 'increment' => $this->forminator_difference_calculate( $selected_conversion, $previous_conversion ),
199
+ 'average' => 0 < $reports['average_month']
200
+ ? number_format( floatval( $selected_conversion ) / intval( $reports['average_month'] ), 1 ) . '%'
201
+ : 0,
202
+ 'difference' => $selected_conversion > $previous_conversion ? 'high' : 'low',
203
+ ),
204
+ 'payment' => array(
205
+ 'selected' => 0 < $reports['selected_payment']
206
+ ? '$' . number_format( $reports['selected_payment'], 2 )
207
+ : 0,
208
+ 'previous' => 0 < $reports['previous_payment']
209
+ ? '$' . number_format( $reports['previous_payment'], 2 )
210
+ : 0,
211
+ 'stripe' => 0 < $reports['stripe_payment']
212
+ ? '$' . number_format( $reports['stripe_payment'], 2 )
213
+ : 0,
214
+ 'paypal' => 0 < $reports['paypal_payment']
215
+ ? '$' . number_format( $reports['paypal_payment'], 2 )
216
+ : 0,
217
+ 'increment' => 0 < $reports['selected_payment']
218
+ ? round( intval( $reports['previous_payment'] ) ) * 100 / intval( $reports['selected_payment'] ) . '%'
219
+ : '',
220
+ 'difference' => $reports['selected_payment'] > $reports['previous_payment'] ? 'high' : 'low',
221
+ ),
222
+ 'entries' => array(
223
+ 'selected' => intval( $reports['selected_entries'] ),
224
+ 'previous' => intval( $reports['previous_entries'] ),
225
+ 'increment' => $this->forminator_difference_calculate( $reports['selected_entries'], $reports['previous_entries'] ),
226
+ 'average' => 0 < $reports['average_month']
227
+ ? round( intval( $reports['total_entries'] ) / intval( $reports['average_month'] ) )
228
+ : '',
229
+ 'difference' => $reports['selected_entries'] > $reports['previous_entries'] ? 'high' : 'low',
230
+ ),
231
+ );
232
+ if ( isset( $reports['has_leads'] ) && $reports['has_leads'] ) {
233
+ $report_data['leads'] = array(
234
+ 'selected' => intval( $reports['selected_leads'] ),
235
+ 'previous' => intval( $reports['previous_leads'] ),
236
+ 'increment' => $this->forminator_difference_calculate( $reports['selected_leads'], $reports['previous_leads'] ),
237
+ 'average' => 0 < $reports['average_month']
238
+ ? round( intval( $reports['total_leads'] ) / intval( $reports['average_month'] ) )
239
+ : '',
240
+ 'difference' => $reports['selected_leads'] > $reports['previous_leads'] ? 'high' : 'low',
241
+ );
242
+ }
243
+ if ( ! empty( $reports['integration'] ) ) {
244
+ $integration_data = array();
245
+ foreach ( $reports['integration'] as $integration ) {
246
+ $addon_data = $integration->to_array();
247
+ $slug = $addon_data['slug'];
248
+ if ( ! empty( $integration->multi_id ) ) {
249
+ $multi_id = $integration->multi_id;
250
+ } elseif ( ! empty( $integration->multi_global_id ) ) {
251
+ $multi_id = $integration->multi_global_id;
252
+ } else {
253
+ $multi_id = '';
254
+ }
255
+ if ( ! empty( $multi_id ) ) {
256
+ $meta_key = 'forminator_addon_' . $slug . '_status-' . $multi_id;
257
+ $previous_send = Forminator_Form_Entry_Model::addons_data( $form_id, $meta_key, $reports['previous_start'], $reports['previous_end'] );
258
+ $selected_sent = Forminator_Form_Entry_Model::addons_data( $form_id, $meta_key, $reports['start_date'], $reports['end_date'] );
259
+
260
+ $integration_data[ $slug ] = array(
261
+ 'title' => $addon_data['title'],
262
+ 'short_title' => $addon_data['short_title'],
263
+ 'image' => $addon_data['image'],
264
+ 'selected' => $selected_sent,
265
+ 'previous' => $previous_send,
266
+ 'increment' => $this->forminator_difference_calculate( $selected_sent, $previous_send ),
267
+ 'difference' => $selected_sent >= $previous_send ? 'high' : 'low',
268
+ );
269
+ }
270
+ }
271
+ $report_data['integration'] = $integration_data;
272
+ }
273
+ }
274
+
275
+ return $report_data;
276
+ }
277
+
278
+ /**
279
+ * Get payment report data
280
+ *
281
+ * @param $form_id
282
+ * @param $start_date
283
+ * @param $end_date
284
+ * @param $previous_start
285
+ * @param $previous_end
286
+ *
287
+ * @return array
288
+ */
289
+ public function forminator_payment_report_data( $form_id, $start_date, $end_date, $previous_start, $previous_end ) {
290
+ $payments = array(
291
+ 'selected_payment' => 0,
292
+ 'previous_payment' => 0,
293
+ 'stripe_payment' => 0,
294
+ 'paypal_payment' => 0
295
+ );
296
+ $end_date = $end_date . ' 23:59:00';
297
+ $payment_data = Forminator_Form_Entry_Model::payment_amount( $form_id, $previous_start, $end_date );
298
+ if ( ! empty( $payment_data ) ) {
299
+ foreach ( $payment_data as $data ) {
300
+ $meta_value = maybe_unserialize( $data->meta_value );
301
+ if ( $data->date_created >= $start_date && $data->date_created <= $end_date ) {
302
+ $payments['selected_payment'] += $meta_value['amount'];
303
+ if ( 'stripe-1' === $data->meta_key ) {
304
+ $payments['stripe_payment'] += $meta_value['amount'];
305
+ }
306
+ if ( 'paypal-1' === $data->meta_key ) {
307
+ $payments['paypal_payment'] += $meta_value['amount'];
308
+ }
309
+ }
310
+ if ( $data->date_created >= $previous_start && $data->date_created <= $previous_end ) {
311
+ $payments['previous_payment'] += $meta_value['amount'];
312
+ }
313
+ }
314
+ }
315
+
316
+ return $payments;
317
+ }
318
+
319
+ /**
320
+ * Chart data
321
+ *
322
+ * @param $form_id
323
+ * @param $start_date
324
+ * @param $end_date
325
+ *
326
+ * @return array
327
+ */
328
+ public function forminator_report_chart_data( $form_id, $start_date = '', $end_date = '' ) {
329
+ $days_array = array();
330
+ $default_array = array();
331
+
332
+ if ( empty( $start_date ) ) {
333
+ $start_date = date( 'Y-m-01' );
334
+ }
335
+ if ( empty( $end_date ) ) {
336
+ $end_date = date( 'Y-m-t' );
337
+ }
338
+ $sdate = strtotime( $start_date );
339
+ $edate = strtotime( $end_date );
340
+
341
+ while ( $sdate <= $edate ) {
342
+ $default_date = date( 'Y-m-d', $sdate );
343
+ $days_array[] = date( 'M j, Y', $sdate );
344
+ $default_array[ $default_date ] = 0;
345
+ $sdate = strtotime( '+1 day', $sdate );
346
+ }
347
+
348
+ $report_entries = Forminator_Form_Entry_Model::count_report_entries( $form_id, $start_date, $end_date );
349
+ if ( 0 === $report_entries ) {
350
+ $submissions_data = $default_array;
351
+ } else {
352
+ $submissions = Forminator_Form_Entry_Model::get_form_latest_entries_count_grouped_by_day( $form_id, $start_date, $end_date );
353
+ $submissions_array = wp_list_pluck( $submissions, 'entries_amount', 'date_created' );
354
+ $submissions_data = array_merge( $default_array, array_intersect_key( $submissions_array, $default_array ) );
355
+ }
356
+
357
+ $canvas_spacing = max( $submissions_data ) + 8;
358
+
359
+ return array(
360
+ 'monthDays' => $days_array,
361
+ 'submissions' => $submissions_data,
362
+ 'canvas_spacing' => intval( $canvas_spacing )
363
+ );
364
+ }
365
+
366
+ /**
367
+ * Previous Time
368
+ *
369
+ * @param $time
370
+ * @param $start_date
371
+ *
372
+ * @return false|string
373
+ */
374
+ public function forminator_previous_time( $time, $start_date, $end_date ) {
375
+ switch ( $time ) {
376
+ case 'Today':
377
+ $previous_start_date = date( 'Y-m-d', strtotime( '-1 day', strtotime( $start_date ) ) );;
378
+ break;
379
+
380
+ case 'Last 7 Days':
381
+ $previous_start_date = date( 'Y-m-d', strtotime( '-7 day', strtotime( $start_date ) ) );
382
+ break;
383
+
384
+ case 'This Month':
385
+ $previous_start_date = date( 'Y-m-d', strtotime( 'first day of last month', strtotime( $start_date ) ) );
386
+ break;
387
+
388
+ case 'Last 30 Days':
389
+ $previous_start_date = date( 'Y-m-d', strtotime( '-30 day', strtotime( $start_date ) ) );
390
+ break;
391
+
392
+ case 'This Year':
393
+ $previous_start_date = date( 'Y-m-d', strtotime( 'last year January 1st', strtotime( $start_date ) ) );
394
+ break;
395
+ case 'Custom':
396
+ $datediff = strtotime( $end_date ) - strtotime( $start_date );
397
+ $total_days = round( $datediff / ( 60 * 60 * 24 ) ) + 1;
398
+ $previous_days = '-' . $total_days . 'day';
399
+ $previous_start_date = date( 'Y-m-d', strtotime( $previous_days, strtotime( $start_date ) ) );
400
+ break;
401
+
402
+ default:
403
+ $previous_start_date = '';
404
+ }
405
+
406
+ return $previous_start_date;
407
+ }
408
+
409
+ /**
410
+ * Difference_calculate
411
+ *
412
+ * @param $selected
413
+ * @param $previous
414
+ *
415
+ * @return float|int
416
+ */
417
+ public function forminator_difference_calculate( $selected, $previous ) {
418
+ $percent = 0;
419
+ if ( 0 < $previous && 0 < $selected ) {
420
+ if ( $previous < $selected ) {
421
+ // Increase percent
422
+ $percent_from = $selected - $previous;
423
+ } else {
424
+ // Decrease percent
425
+ $percent_from = $previous - $selected;
426
+ }
427
+ $percent_value = ( $percent_from * 100 ) / $previous;
428
+ $percent = 0 < $percent_value ? round( $percent_from / $previous * 100 ) . '%' : 0;
429
+ }
430
+
431
+ return $percent;
432
+ }
433
+
434
+ /**
435
+ * Get app link
436
+ *
437
+ * @param $module_id
438
+ * @param $module_type
439
+ *
440
+ * @return string|void
441
+ */
442
+ public function get_app_link_module_id( $module_id, $module_type ) {
443
+ switch ( $module_type ) {
444
+ case 'forminator_quizzes':
445
+ $quiz_model = Forminator_Base_Form_Model::get_model( $module_id );
446
+ $quiz_type = isset( $quiz_model->quiz_type ) ? $quiz_model->quiz_type : '';
447
+ $wizard_slug = 'forminator-' . $quiz_type . '-wizard';
448
+ break;
449
+ case 'forminator_polls':
450
+ $wizard_slug = 'forminator-poll-wizard';
451
+ break;
452
+ default:
453
+ $wizard_slug = 'forminator-cform-wizard';
454
+ break;
455
+ }
456
+ $wizard_link = admin_url( 'admin.php?page=' . $wizard_slug . '&id=' . $module_id );
457
+
458
+ return $wizard_link;
459
+ }
460
+ }
admin/locale.php CHANGED
@@ -1,12 +1,12 @@
1
  <?php
2
  /* THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. */
3
  $forminator_admin_locale = array(
4
- "Appearance" => array( null, __("Appearance", "forminator" ), ), // src/form/components/appearance.js:62
5
- "Apply Preset" => array( null, __("Apply Preset", "forminator" ), ), // src/form/components/appearance.js:69
6
- "Fields" => array( null, __("Fields", "forminator" ), ), // src/form/components/appearance.js:96
7
- "Behavior" => array( null, __("Behavior", "forminator" ), ), // src/form/components/appearance.js:105
8
- "User Registration" => array( null, __("User Registration", "forminator" ), ), // src/form/components/appearance.js:113
9
- "User Login" => array( null, __("User Login", "forminator" ), ), // src/form/components/appearance.js:121
10
  "Colors" => array( null, __("Colors", "forminator" ), ), // src/form/components/appearance/colors.js:212
11
  "Adjust the default color combinations to match your theme styling." => array( null, __("Adjust the default color combinations to match your theme styling.", "forminator" ), ), // src/form/components/appearance/colors.js:213
12
  "Use Default Colors" => array( null, __("Use Default Colors", "forminator" ), ), // src/form/components/appearance/colors.js:227
@@ -120,6 +120,12 @@ $forminator_admin_locale = array(
120
  "Text" => array( null, __("Text", "forminator" ), ), // src/form/components/appearance/design/basic.js:22
121
  "Button" => array( null, __("Button", "forminator" ), ), // src/form/components/appearance/design/basic.js:25
122
  "You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS." => array( null, __("You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS.", "forminator" ), ), // src/form/components/appearance/design/none.js:28
 
 
 
 
 
 
123
  "Fonts" => array( null, __("Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:147
124
  "By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts." => array( null, __("By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts.", "forminator" ), ), // src/form/components/appearance/fonts.js:148
125
  "Use Theme Fonts" => array( null, __("Use Theme Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:163
@@ -149,9 +155,6 @@ $forminator_admin_locale = array(
149
  "Choose how much spacing you want between each form field." => array( null, __("Choose how much spacing you want between each form field.", "forminator" ), ), // src/form/components/appearance/form-container.js:65
150
  "Comfortable" => array( null, __("Comfortable", "forminator" ), ), // src/form/components/appearance/form-container.js:69
151
  "Compact" => array( null, __("Compact", "forminator" ), ), // src/form/components/appearance/form-container.js:72
152
- "Radius" => array( null, __("Radius", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:22
153
- "in px" => array( null, __("in px", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:23
154
- "Thickness" => array( null, __("Thickness", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:32
155
  "Style" => array( null, __("Style", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:43
156
  "Solid" => array( null, __("Solid", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:46
157
  "Dashed" => array( null, __("Dashed", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:49
@@ -321,7 +324,7 @@ To continue where you left off, click the link below or copy the link to your we
321
  "Enter Placeholder" => array( null, __("Enter Placeholder", "forminator" ), ), // src/form/components/fields/address.js:108
322
  "Description (optional)" => array( null, __("Description (optional)", "forminator" ), ), // src/form/components/fields/address.js:123
323
  "Enter description" => array( null, __("Enter description", "forminator" ), ), // src/form/components/fields/address.js:124
324
- "At least one field must be enabled" => array( null, __("At least one field must be enabled", "forminator" ), ), // src/form/components/fields/address.js:251
325
  "Field Type" => array( null, __("Field Type", "forminator" ), ), // src/form/components/fields/calculation.js:69
326
  "By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form." => array( null, __("By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form.", "forminator" ), ), // src/form/components/fields/calculation.js:77
327
  "Read-only" => array( null, __("Read-only", "forminator" ), ), // src/form/components/fields/calculation.js:88
@@ -483,83 +486,84 @@ To continue where you left off, click the link below or copy the link to your we
483
  "Validate Field" => array( null, __("Validate Field", "forminator" ), ), // src/form/components/fields/password.js:192
484
  "Validation message" => array( null, __("Validation message", "forminator" ), ), // src/form/components/fields/password.js:198
485
  "Enter validation message" => array( null, __("Enter validation message", "forminator" ), ), // src/form/components/fields/password.js:200
486
- "In %s" => array( null, __("In %s", "forminator" ), ), // src/form/components/fields/paypal.js:69
487
- "You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field." => array( null, __("You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field.", "forminator" ), ), // src/form/components/fields/paypal.js:101
488
- "Mode of payment" => array( null, __("Mode of payment", "forminator" ), ), // src/form/components/fields/paypal.js:125
489
- "We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode." => array( null, __("We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode.", "forminator" ), ), // src/form/components/fields/paypal.js:128
490
- "Sandbox" => array( null, __("Sandbox", "forminator" ), ), // src/form/components/fields/paypal.js:138
491
- "Live" => array( null, __("Live", "forminator" ), ), // src/form/components/fields/paypal.js:139
492
- "Charge currency" => array( null, __("Charge currency", "forminator" ), ), // src/form/components/fields/paypal.js:145
493
- "It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers." => array( null, __("It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers.", "forminator" ), ), // src/form/components/fields/paypal.js:147
494
- "Payment amount" => array( null, __("Payment amount", "forminator" ), ), // src/form/components/fields/paypal.js:163
495
- "Fixed" => array( null, __("Fixed", "forminator" ), ), // src/form/components/fields/paypal.js:170
496
- "Fixed amount" => array( null, __("Fixed amount", "forminator" ), ), // src/form/components/fields/paypal.js:180
497
- "E.g. 20.00" => array( null, __("E.g. 20.00", "forminator" ), ), // src/form/components/fields/paypal.js:182
498
- "Enter an amount or choose a form field." => array( null, __("Enter an amount or choose a form field.", "forminator" ), ), // src/form/components/fields/paypal.js:184
499
- "Variable" => array( null, __("Variable", "forminator" ), ), // src/form/components/fields/paypal.js:193
500
- "Variable amount" => array( null, __("Variable amount", "forminator" ), ), // src/form/components/fields/paypal.js:203
501
- "Select field" => array( null, __("Select field", "forminator" ), ), // src/form/components/fields/paypal.js:214
502
- "A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula." => array( null, __("A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula.", "forminator" ), ), // src/form/components/fields/paypal.js:227
503
- "Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels." => array( null, __("Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels.", "forminator" ), ), // src/form/components/fields/paypal.js:249
504
- "PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color." => array( null, __("PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color.", "forminator" ), ), // src/form/components/fields/paypal.js:268
505
- "Gold" => array( null, __("Gold", "forminator" ), ), // src/form/components/fields/paypal.js:274
506
- "Blue" => array( null, __("Blue", "forminator" ), ), // src/form/components/fields/paypal.js:275
507
- "Silver" => array( null, __("Silver", "forminator" ), ), // src/form/components/fields/paypal.js:276
508
- "White" => array( null, __("White", "forminator" ), ), // src/form/components/fields/paypal.js:277
509
- "Black" => array( null, __("Black", "forminator" ), ), // src/form/components/fields/paypal.js:278
510
- "Width" => array( null, __("Width", "forminator" ), ), // src/form/components/fields/paypal.js:283
511
- "E.g. 250" => array( null, __("E.g. 250", "forminator" ), ), // src/form/components/fields/paypal.js:300
512
- "px" => array( null, __("px", "forminator" ), ), // src/form/components/fields/paypal.js:306
513
- "Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit." => array( null, __("Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit.", "forminator" ), ), // src/form/components/fields/paypal.js:309
514
- "Height" => array( null, __("Height", "forminator" ), ), // src/form/components/fields/paypal.js:321
515
- "Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px" => array( null, __("Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px", "forminator" ), ), // src/form/components/fields/paypal.js:345
516
- "Shape" => array( null, __("Shape", "forminator" ), ), // src/form/components/fields/paypal.js:356
517
- "Choose your preferred shape from your PayPal Smart Buttons." => array( null, __("Choose your preferred shape from your PayPal Smart Buttons.", "forminator" ), ), // src/form/components/fields/paypal.js:359
518
- "Rectangular" => array( null, __("Rectangular", "forminator" ), ), // src/form/components/fields/paypal.js:364
519
- "Pill" => array( null, __("Pill", "forminator" ), ), // src/form/components/fields/paypal.js:365
520
- "We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}." => array( null, __("We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}.", "forminator" ), ), // src/form/components/fields/paypal.js:375
521
- "Tagline" => array( null, __("Tagline", "forminator" ), ), // src/form/components/fields/paypal.js:394
522
- "Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button." => array( null, __("Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button.", "forminator" ), ), // src/form/components/fields/paypal.js:397
523
- "Disable Funding Sources" => array( null, __("Disable Funding Sources", "forminator" ), ), // src/form/components/fields/paypal.js:419
524
- "PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors." => array( null, __("PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:426
525
- "Credit or debit cards" => array( null, __("Credit or debit cards", "forminator" ), ), // src/form/components/fields/paypal.js:440
526
- "PayPal Credit" => array( null, __("PayPal Credit", "forminator" ), ), // src/form/components/fields/paypal.js:447
527
- "Bancontact" => array( null, __("Bancontact", "forminator" ), ), // src/form/components/fields/paypal.js:454
528
- "BLIK" => array( null, __("BLIK", "forminator" ), ), // src/form/components/fields/paypal.js:461
529
- "eps" => array( null, __("eps", "forminator" ), ), // src/form/components/fields/paypal.js:468
530
- "giropay" => array( null, __("giropay", "forminator" ), ), // src/form/components/fields/paypal.js:475
531
- "iDEAL" => array( null, __("iDEAL", "forminator" ), ), // src/form/components/fields/paypal.js:482
532
- "Mercado Pago" => array( null, __("Mercado Pago", "forminator" ), ), // src/form/components/fields/paypal.js:491
533
- "MyBank" => array( null, __("MyBank", "forminator" ), ), // src/form/components/fields/paypal.js:498
534
- "Przelewy24" => array( null, __("Przelewy24", "forminator" ), ), // src/form/components/fields/paypal.js:505
535
- "SEPA-Lastschrift" => array( null, __("SEPA-Lastschrift", "forminator" ), ), // src/form/components/fields/paypal.js:512
536
- "Sofort" => array( null, __("Sofort", "forminator" ), ), // src/form/components/fields/paypal.js:519
537
- "Venmo" => array( null, __("Venmo", "forminator" ), ), // src/form/components/fields/paypal.js:526
538
- "Disable Card Options" => array( null, __("Disable Card Options", "forminator" ), ), // src/form/components/fields/paypal.js:537
539
- "PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors." => array( null, __("PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:544
540
- "Visa" => array( null, __("Visa", "forminator" ), ), // src/form/components/fields/paypal.js:558
541
- "Mastercard" => array( null, __("Mastercard", "forminator" ), ), // src/form/components/fields/paypal.js:565
542
- "American Express" => array( null, __("American Express", "forminator" ), ), // src/form/components/fields/paypal.js:572
543
- "Discover" => array( null, __("Discover", "forminator" ), ), // src/form/components/fields/paypal.js:579
544
- "JCB" => array( null, __("JCB", "forminator" ), ), // src/form/components/fields/paypal.js:588
545
- "Elo" => array( null, __("Elo", "forminator" ), ), // src/form/components/fields/paypal.js:595
546
- "Hiper" => array( null, __("Hiper", "forminator" ), ), // src/form/components/fields/paypal.js:602
547
- "Pre-fill Billing Details" => array( null, __("Pre-fill Billing Details", "forminator" ), ), // src/form/components/fields/paypal.js:613
548
- "Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again." => array( null, __("Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again.", "forminator" ), ), // src/form/components/fields/paypal.js:620
549
- "Enable" => array( null, __("Enable", "forminator" ), ), // src/form/components/fields/paypal.js:641
550
- "Customer name (optional)" => array( null, __("Customer name (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:648
551
- "Select a name field" => array( null, __("Select a name field", "forminator" ), ), // src/form/components/fields/paypal.js:657
552
- "Customer email address (optional)" => array( null, __("Customer email address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:672
553
- "Select an email field" => array( null, __("Select an email field", "forminator" ), ), // src/form/components/fields/paypal.js:681
554
- "Billing address (optional)" => array( null, __("Billing address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:699
555
- "Select an address field" => array( null, __("Select an address field", "forminator" ), ), // src/form/components/fields/paypal.js:708
556
- "Disable" => array( null, __("Disable", "forminator" ), ), // src/form/components/fields/paypal.js:727
557
- "Shipping Address" => array( null, __("Shipping Address", "forminator" ), ), // src/form/components/fields/paypal.js:737
558
- "If you are selling a product that doesn't need to be shipped, you can choose to disable and hide the shipping address fields from the PayPal payment page." => array( null, __("If you are selling a product that doesn't need to be shipped, you can choose to disable and hide the shipping address fields from the PayPal payment page.", "forminator" ), ), // src/form/components/fields/paypal.js:744
559
- "By default, PayPal detects the language for the visitors based on their geolocation and browser preferences. It is recommended to pass this parameter only if you need the PayPal buttons to render in the same language as the rest of your site. {{link}}Supported locale codes.{{/link}}" => array( null, __("By default, PayPal detects the language for the visitors based on their geolocation and browser preferences. It is recommended to pass this parameter only if you need the PayPal buttons to render in the same language as the rest of your site. {{link}}Supported locale codes.{{/link}}", "forminator" ), ), // src/form/components/fields/paypal.js:774
560
- "Eg. en_US" => array( null, __("Eg. en_US", "forminator" ), ), // src/form/components/fields/paypal.js:793
561
- "Debug Mode" => array( null, __("Debug Mode", "forminator" ), ), // src/form/components/fields/paypal.js:803
562
- "PayPal debug mode helps troubleshoot any issues. However, it's recommended to disable this in production as it causes a significant increase in the script size and performance decrease." => array( null, __("PayPal debug mode helps troubleshoot any issues. However, it's recommended to disable this in production as it causes a significant increase in the script size and performance decrease.", "forminator" ), ), // src/form/components/fields/paypal.js:810
 
563
  "Make sure the users fill this field as per the selected validation and warn them when they haven't" => array( null, __("Make sure the users fill this field as per the selected validation and warn them when they haven't", "forminator" ), ), // src/form/components/fields/phone.js:43
564
  "National" => array( null, __("National", "forminator" ), ), // src/form/components/fields/phone.js:62
565
  "Select the country to validate phone number for" => array( null, __("Select the country to validate phone number for", "forminator" ), ), // src/form/components/fields/phone.js:69
@@ -596,11 +600,11 @@ To continue where you left off, click the link below or copy the link to your we
596
  "Add a border to this section." => array( null, __("Add a border to this section.", "forminator" ), ), // src/form/components/fields/section.js:55
597
  "Signature Filetype" => array( null, __("Signature Filetype", "forminator" ), ), // src/form/components/fields/signature.js:30
598
  "Choose the filetype to save your users' signature in." => array( null, __("Choose the filetype to save your users' signature in.", "forminator" ), ), // src/form/components/fields/signature.js:32
599
- "PNG" => array( null, __("PNG", "forminator" ), ), // src/form/components/fields/signature.js:45
600
- "JPG" => array( null, __("JPG", "forminator" ), ), // src/form/components/fields/signature.js:46
601
- "Choose the height of your signature field. The default value is 180px." => array( null, __("Choose the height of your signature field. The default value is 180px.", "forminator" ), ), // src/form/components/fields/signature.js:54
602
- "Stroke Thickness" => array( null, __("Stroke Thickness", "forminator" ), ), // src/form/components/fields/signature.js:72
603
- "Choose the thickness in pixels for signature strokes. The default value is 2px." => array( null, __("Choose the thickness in pixels for signature strokes. The default value is 2px.", "forminator" ), ), // src/form/components/fields/signature.js:74
604
  "Note: Pass comma-separated values for this query parameter to pre-populate multiple options." => array( null, __("Note: Pass comma-separated values for this query parameter to pre-populate multiple options.", "forminator" ), ), // src/form/components/fields/singlevalue.js:32
605
  "Search" => array( null, __("Search", "forminator" ), ), // src/form/components/fields/singlevalue.js:112
606
  "Display the search box in a dropdown" => array( null, __("Display the search box in a dropdown", "forminator" ), ), // src/form/components/fields/singlevalue.js:120
@@ -893,26 +897,27 @@ To continue where you left off, click the link below or copy the link to your we
893
  "Please fill required fields" => array( null, __("Please fill required fields", "forminator" ), ), // src/form/components/modals/settings.js:149
894
  "Calculation values are required!" => array( null, __("Calculation values are required!", "forminator" ), ), // src/form/components/modals/settings.js:167
895
  "Option labels are required!" => array( null, __("Option labels are required!", "forminator" ), ), // src/form/components/modals/settings.js:176
896
- "Please add a placeholder or select a default option." => array( null, __("Please add a placeholder or select a default option.", "forminator" ), ), // src/form/components/modals/settings.js:188
897
- "At least one of Title, Content, or Excerpt must be enabled for post data to be submitted." => array( null, __("At least one of Title, Content, or Excerpt must be enabled for post data to be submitted.", "forminator" ), ), // src/form/components/modals/settings.js:198
898
- "Please, connect your Stripe account first!" => array( null, __("Please, connect your Stripe account first!", "forminator" ), ), // src/form/components/modals/settings.js:206
899
- "You need at least one payment!" => array( null, __("You need at least one payment!", "forminator" ), ), // src/form/components/modals/settings.js:211
900
- "Please select an email address for payment receipt." => array( null, __("Please select an email address for payment receipt.", "forminator" ), ), // src/form/components/modals/settings.js:216
901
- "Empty labels are not allowed for meta values!" => array( null, __("Empty labels are not allowed for meta values!", "forminator" ), ), // src/form/components/modals/settings.js:227
902
- "Please connect your PayPal account first!" => array( null, __("Please connect your PayPal account first!", "forminator" ), ), // src/form/components/modals/settings.js:240
903
- "Please enter PayPal payment amount!" => array( null, __("Please enter PayPal payment amount!", "forminator" ), ), // src/form/components/modals/settings.js:245
904
- "Please select PayPal payment variable field!" => array( null, __("Please select PayPal payment variable field!", "forminator" ), ), // src/form/components/modals/settings.js:250
905
- "Calculation formula is required!" => array( null, __("Calculation formula is required!", "forminator" ), ), // src/form/components/modals/settings.js:260
906
- "Limit Min value should be less than Max value." => array( null, __("Limit Min value should be less than Max value.", "forminator" ), ), // src/form/components/modals/settings.js:268
907
- "Please enter API keys." => array( null, __("Please enter API keys.", "forminator" ), ), // src/form/components/modals/settings.js:291
908
- "Please select a valid end time limit." => array( null, __("Please select a valid end time limit.", "forminator" ), ), // src/form/components/modals/settings.js:383
909
- "Please fix the Default time error." => array( null, __("Please fix the Default time error.", "forminator" ), ), // src/form/components/modals/settings.js:389
910
- "Please fix the Start or End time." => array( null, __("Please fix the Start or End time.", "forminator" ), ), // src/form/components/modals/settings.js:403
911
- "Please fix the limit Start or End date." => array( null, __("Please fix the limit Start or End date.", "forminator" ), ), // src/form/components/modals/settings.js:538
912
- "Calculations" => array( null, __("Calculations", "forminator" ), ), // src/form/components/modals/settings.js:667
913
- "Styling" => array( null, __("Styling", "forminator" ), ), // src/form/components/modals/settings.js:687
914
- "Customize" => array( null, __("Customize", "forminator" ), ), // src/form/components/modals/settings.js:697
915
- "Visibility" => array( null, __("Visibility", "forminator" ), ), // src/form/components/modals/settings.js:707
 
916
  "Shortcode has been copied successfully." => array( null, __("Shortcode has been copied successfully.", "forminator" ), ), // src/form/components/modals/shortcode.js:22
917
  "Ready to go!" => array( null, __("Ready to go!", "forminator" ), ), // src/form/components/modals/shortcode.js:46
918
  "Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!" => array( null, __("Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!", "forminator" ), ), // src/form/components/modals/shortcode.js:50
@@ -1056,36 +1061,36 @@ To continue where you left off, click the link below or copy the link to your we
1056
  "Font Size" => array( null, __("Font Size", "forminator" ), ), // src/form/components/settings/fonts.js:108
1057
  "Font Weight" => array( null, __("Font Weight", "forminator" ), ), // src/form/components/settings/fonts.js:116
1058
  "Select font weight" => array( null, __("Select font weight", "forminator" ), ), // src/form/components/settings/fonts.js:117
1059
- "Start & End date" => array( null, __("Start & End date", "forminator" ), ), // src/form/components/settings/limits.js:55
1060
- "Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}." => array( null, __("Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}.", "forminator" ), ), // src/form/components/settings/limits.js:59
1061
- "Start Date" => array( null, __("Start Date", "forminator" ), ), // src/form/components/settings/limits.js:82
1062
- "No limit" => array( null, __("No limit", "forminator" ), ), // src/form/components/settings/limits.js:87
1063
- "Specific date" => array( null, __("Specific date", "forminator" ), ), // src/form/components/settings/limits.js:88
1064
- "Date fields" => array( null, __("Date fields", "forminator" ), ), // src/form/components/settings/limits.js:91
1065
- "Offset (optional)" => array( null, __("Offset (optional)", "forminator" ), ), // src/form/components/settings/limits.js:127
1066
- "+" => array( null, __("+", "forminator" ), ), // src/form/components/settings/limits.js:141
1067
- "-" => array( null, __("-", "forminator" ), ), // src/form/components/settings/limits.js:142
1068
- "days" => array( null, __("days", "forminator" ), ), // src/form/components/settings/limits.js:162
1069
- "weeks" => array( null, __("weeks", "forminator" ), ), // src/form/components/settings/limits.js:163
1070
- "months" => array( null, __("months", "forminator" ), ), // src/form/components/settings/limits.js:164
1071
- "years" => array( null, __("years", "forminator" ), ), // src/form/components/settings/limits.js:165
1072
- "End Date" => array( null, __("End Date", "forminator" ), ), // src/form/components/settings/limits.js:183
1073
- "Days of the week" => array( null, __("Days of the week", "forminator" ), ), // src/form/components/settings/limits.js:281
1074
- "Choose which days of the week should be available on the calendar." => array( null, __("Choose which days of the week should be available on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:285
1075
- "All days" => array( null, __("All days", "forminator" ), ), // src/form/components/settings/limits.js:296
1076
- "Selected days" => array( null, __("Selected days", "forminator" ), ), // src/form/components/settings/limits.js:302
1077
- "Sunday" => array( null, __("Sunday", "forminator" ), ), // src/form/components/settings/limits.js:314
1078
- "Wednesday" => array( null, __("Wednesday", "forminator" ), ), // src/form/components/settings/limits.js:322
1079
- "Saturday" => array( null, __("Saturday", "forminator" ), ), // src/form/components/settings/limits.js:330
1080
- "Monday" => array( null, __("Monday", "forminator" ), ), // src/form/components/settings/limits.js:342
1081
- "Thursday" => array( null, __("Thursday", "forminator" ), ), // src/form/components/settings/limits.js:350
1082
- "Tuesday" => array( null, __("Tuesday", "forminator" ), ), // src/form/components/settings/limits.js:362
1083
- "Friday" => array( null, __("Friday", "forminator" ), ), // src/form/components/settings/limits.js:370
1084
- "Disable dates" => array( null, __("Disable dates", "forminator" ), ), // src/form/components/settings/limits.js:388
1085
- "Use this setting to disable specific dates on the calendar." => array( null, __("Use this setting to disable specific dates on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:390
1086
- "Disable date ranges" => array( null, __("Disable date ranges", "forminator" ), ), // src/form/components/settings/limits.js:405
1087
- "Use this setting to disable specific dates ranges on the calendar." => array( null, __("Use this setting to disable specific dates ranges on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:407
1088
- "Choose an error message to be used when visitor enters a date that is disabled." => array( null, __("Choose an error message to be used when visitor enters a date that is disabled.", "forminator" ), ), // src/form/components/settings/limits.js:424
1089
  "Select a Field" => array( null, __("Select a Field", "forminator" ), ), // src/form/components/settings/metadata-option.js:78
1090
  "Delete MetaData" => array( null, __("Delete MetaData", "forminator" ), ), // src/form/components/settings/metadata-option.js:97
1091
  "Add Custom Meta" => array( null, __("Add Custom Meta", "forminator" ), ), // src/form/components/settings/metadata-value.js:131
@@ -1099,9 +1104,9 @@ To continue where you left off, click the link below or copy the link to your we
1099
  "Miss" => array( null, __("Miss", "forminator" ), ), // src/form/components/settings/multi-name.js:62
1100
  "Dr." => array( null, __("Dr.", "forminator" ), ), // src/form/components/settings/multi-name.js:63
1101
  "Prof." => array( null, __("Prof.", "forminator" ), ), // src/form/components/settings/multi-name.js:64
1102
- "Delete option" => array( null, __("Delete option", "forminator" ), ), // src/form/components/settings/multi-option.js:210
1103
- "Toggle" => array( null, __("Toggle", "forminator" ), ), // src/form/components/settings/multi-option.js:214
1104
- "Submission limit" => array( null, __("Submission limit", "forminator" ), ), // src/form/components/settings/multi-option.js:240
1105
  "The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer." => array( null, __("The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer.", "forminator" ), ), // src/form/components/settings/multi-value.js:154
1106
  "Whoops, only .csv filetype is allowed." => array( null, __("Whoops, only .csv filetype is allowed.", "forminator" ), ), // src/form/components/settings/multi-value.js:187
1107
  "Importing this will replace your current options. Click import to continue." => array( null, __("Importing this will replace your current options. Click import to continue.", "forminator" ), ), // src/form/components/settings/multi-value.js:196
@@ -1395,8 +1400,8 @@ To continue where you left off, click the link below or copy the link to your we
1395
  "Page/Post URL" => array( null, __("Page/Post URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:68
1396
  "Site URL" => array( null, __("Site URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:71
1397
  "Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media." => array( null, __("Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media.", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:84
1398
- "Correct Answer" => array( null, __("Correct Answer", "forminator" ), ), // src/quiz/global/components/builder/answer.js:106
1399
- "Select Personality" => array( null, __("Select Personality", "forminator" ), ), // src/quiz/global/components/builder/answer.js:117
1400
  "Add Question" => array( null, __("Add Question", "forminator" ), ), // src/quiz/global/components/builder/questions.js:102
1401
  "A quiz without questions is not going to be very useful… Add your questions above!" => array( null, __("A quiz without questions is not going to be very useful… Add your questions above!", "forminator" ), ), // src/quiz/global/components/builder/questions.js:108
1402
  "Edit Quiz" => array( null, __("Edit Quiz", "forminator" ), ), // src/quiz/global/components/header.js:13
1
  <?php
2
  /* THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. */
3
  $forminator_admin_locale = array(
4
+ "Appearance" => array( null, __("Appearance", "forminator" ), ), // src/form/components/appearance.js:63
5
+ "Apply Preset" => array( null, __("Apply Preset", "forminator" ), ), // src/form/components/appearance.js:70
6
+ "Fields" => array( null, __("Fields", "forminator" ), ), // src/form/components/appearance.js:98
7
+ "Behavior" => array( null, __("Behavior", "forminator" ), ), // src/form/components/appearance.js:107
8
+ "User Registration" => array( null, __("User Registration", "forminator" ), ), // src/form/components/appearance.js:115
9
+ "User Login" => array( null, __("User Login", "forminator" ), ), // src/form/components/appearance.js:123
10
  "Colors" => array( null, __("Colors", "forminator" ), ), // src/form/components/appearance/colors.js:212
11
  "Adjust the default color combinations to match your theme styling." => array( null, __("Adjust the default color combinations to match your theme styling.", "forminator" ), ), // src/form/components/appearance/colors.js:213
12
  "Use Default Colors" => array( null, __("Use Default Colors", "forminator" ), ), // src/form/components/appearance/colors.js:227
120
  "Text" => array( null, __("Text", "forminator" ), ), // src/form/components/appearance/design/basic.js:22
121
  "Button" => array( null, __("Button", "forminator" ), ), // src/form/components/appearance/design/basic.js:25
122
  "You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS." => array( null, __("You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS.", "forminator" ), ), // src/form/components/appearance/design/none.js:28
123
+ "Radius" => array( null, __("Radius", "forminator" ), ), // src/form/components/appearance/field-container/border-custom.js:20
124
+ "in px" => array( null, __("in px", "forminator" ), ), // src/form/components/appearance/field-container/border-custom.js:21
125
+ "Thickness" => array( null, __("Thickness", "forminator" ), ), // src/form/components/appearance/field-container/border-custom.js:30
126
+ "Field Container" => array( null, __("Field Container", "forminator" ), ), // src/form/components/appearance/fields-container.js:14
127
+ "Customize the field container's border." => array( null, __("Customize the field container's border.", "forminator" ), ), // src/form/components/appearance/fields-container.js:16
128
+ "Add an border style around the field." => array( null, __("Add an border style around the field.", "forminator" ), ), // src/form/components/appearance/fields-container.js:26
129
  "Fonts" => array( null, __("Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:147
130
  "By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts." => array( null, __("By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts.", "forminator" ), ), // src/form/components/appearance/fonts.js:148
131
  "Use Theme Fonts" => array( null, __("Use Theme Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:163
155
  "Choose how much spacing you want between each form field." => array( null, __("Choose how much spacing you want between each form field.", "forminator" ), ), // src/form/components/appearance/form-container.js:65
156
  "Comfortable" => array( null, __("Comfortable", "forminator" ), ), // src/form/components/appearance/form-container.js:69
157
  "Compact" => array( null, __("Compact", "forminator" ), ), // src/form/components/appearance/form-container.js:72
 
 
 
158
  "Style" => array( null, __("Style", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:43
159
  "Solid" => array( null, __("Solid", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:46
160
  "Dashed" => array( null, __("Dashed", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:49
324
  "Enter Placeholder" => array( null, __("Enter Placeholder", "forminator" ), ), // src/form/components/fields/address.js:108
325
  "Description (optional)" => array( null, __("Description (optional)", "forminator" ), ), // src/form/components/fields/address.js:123
326
  "Enter description" => array( null, __("Enter description", "forminator" ), ), // src/form/components/fields/address.js:124
327
+ "At least one field must be enabled" => array( null, __("At least one field must be enabled", "forminator" ), ), // src/form/components/fields/address.js:229
328
  "Field Type" => array( null, __("Field Type", "forminator" ), ), // src/form/components/fields/calculation.js:69
329
  "By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form." => array( null, __("By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form.", "forminator" ), ), // src/form/components/fields/calculation.js:77
330
  "Read-only" => array( null, __("Read-only", "forminator" ), ), // src/form/components/fields/calculation.js:88
486
  "Validate Field" => array( null, __("Validate Field", "forminator" ), ), // src/form/components/fields/password.js:192
487
  "Validation message" => array( null, __("Validation message", "forminator" ), ), // src/form/components/fields/password.js:198
488
  "Enter validation message" => array( null, __("Enter validation message", "forminator" ), ), // src/form/components/fields/password.js:200
489
+ "In %s" => array( null, __("In %s", "forminator" ), ), // src/form/components/fields/paypal.js:82
490
+ "You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field." => array( null, __("You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field.", "forminator" ), ), // src/form/components/fields/paypal.js:114
491
+ "Mode of payment" => array( null, __("Mode of payment", "forminator" ), ), // src/form/components/fields/paypal.js:138
492
+ "We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode." => array( null, __("We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode.", "forminator" ), ), // src/form/components/fields/paypal.js:141
493
+ "Sandbox" => array( null, __("Sandbox", "forminator" ), ), // src/form/components/fields/paypal.js:151
494
+ "Live" => array( null, __("Live", "forminator" ), ), // src/form/components/fields/paypal.js:152
495
+ "Charge currency" => array( null, __("Charge currency", "forminator" ), ), // src/form/components/fields/paypal.js:158
496
+ "It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers." => array( null, __("It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers.", "forminator" ), ), // src/form/components/fields/paypal.js:160
497
+ "Payment amount" => array( null, __("Payment amount", "forminator" ), ), // src/form/components/fields/paypal.js:176
498
+ "Fixed" => array( null, __("Fixed", "forminator" ), ), // src/form/components/fields/paypal.js:183
499
+ "Fixed amount" => array( null, __("Fixed amount", "forminator" ), ), // src/form/components/fields/paypal.js:193
500
+ "E.g. 20.00" => array( null, __("E.g. 20.00", "forminator" ), ), // src/form/components/fields/paypal.js:195
501
+ "Enter an amount or choose a form field." => array( null, __("Enter an amount or choose a form field.", "forminator" ), ), // src/form/components/fields/paypal.js:197
502
+ "Variable" => array( null, __("Variable", "forminator" ), ), // src/form/components/fields/paypal.js:206
503
+ "Variable amount" => array( null, __("Variable amount", "forminator" ), ), // src/form/components/fields/paypal.js:216
504
+ "Select field" => array( null, __("Select field", "forminator" ), ), // src/form/components/fields/paypal.js:227
505
+ "A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula." => array( null, __("A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula.", "forminator" ), ), // src/form/components/fields/paypal.js:240
506
+ "Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels." => array( null, __("Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels.", "forminator" ), ), // src/form/components/fields/paypal.js:262
507
+ "PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color." => array( null, __("PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color.", "forminator" ), ), // src/form/components/fields/paypal.js:281
508
+ "Gold" => array( null, __("Gold", "forminator" ), ), // src/form/components/fields/paypal.js:287
509
+ "Blue" => array( null, __("Blue", "forminator" ), ), // src/form/components/fields/paypal.js:288
510
+ "Silver" => array( null, __("Silver", "forminator" ), ), // src/form/components/fields/paypal.js:289
511
+ "White" => array( null, __("White", "forminator" ), ), // src/form/components/fields/paypal.js:290
512
+ "Black" => array( null, __("Black", "forminator" ), ), // src/form/components/fields/paypal.js:291
513
+ "Width" => array( null, __("Width", "forminator" ), ), // src/form/components/fields/paypal.js:296
514
+ "E.g. 250" => array( null, __("E.g. 250", "forminator" ), ), // src/form/components/fields/paypal.js:313
515
+ "px" => array( null, __("px", "forminator" ), ), // src/form/components/fields/paypal.js:319
516
+ "Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit." => array( null, __("Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit.", "forminator" ), ), // src/form/components/fields/paypal.js:322
517
+ "Height" => array( null, __("Height", "forminator" ), ), // src/form/components/fields/paypal.js:334
518
+ "Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px" => array( null, __("Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px", "forminator" ), ), // src/form/components/fields/paypal.js:358
519
+ "Shape" => array( null, __("Shape", "forminator" ), ), // src/form/components/fields/paypal.js:369
520
+ "Choose your preferred shape from your PayPal Smart Buttons." => array( null, __("Choose your preferred shape from your PayPal Smart Buttons.", "forminator" ), ), // src/form/components/fields/paypal.js:372
521
+ "Rectangular" => array( null, __("Rectangular", "forminator" ), ), // src/form/components/fields/paypal.js:377
522
+ "Pill" => array( null, __("Pill", "forminator" ), ), // src/form/components/fields/paypal.js:378
523
+ "We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}." => array( null, __("We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}.", "forminator" ), ), // src/form/components/fields/paypal.js:388
524
+ "Tagline" => array( null, __("Tagline", "forminator" ), ), // src/form/components/fields/paypal.js:407
525
+ "Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button." => array( null, __("Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button.", "forminator" ), ), // src/form/components/fields/paypal.js:410
526
+ "Disable Funding Sources" => array( null, __("Disable Funding Sources", "forminator" ), ), // src/form/components/fields/paypal.js:432
527
+ "PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors." => array( null, __("PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:439
528
+ "Credit or debit cards" => array( null, __("Credit or debit cards", "forminator" ), ), // src/form/components/fields/paypal.js:453
529
+ "PayPal Credit" => array( null, __("PayPal Credit", "forminator" ), ), // src/form/components/fields/paypal.js:460
530
+ "Bancontact" => array( null, __("Bancontact", "forminator" ), ), // src/form/components/fields/paypal.js:467
531
+ "BLIK" => array( null, __("BLIK", "forminator" ), ), // src/form/components/fields/paypal.js:474
532
+ "eps" => array( null, __("eps", "forminator" ), ), // src/form/components/fields/paypal.js:481
533
+ "giropay" => array( null, __("giropay", "forminator" ), ), // src/form/components/fields/paypal.js:488
534
+ "iDEAL" => array( null, __("iDEAL", "forminator" ), ), // src/form/components/fields/paypal.js:495
535
+ "Mercado Pago" => array( null, __("Mercado Pago", "forminator" ), ), // src/form/components/fields/paypal.js:504
536
+ "MyBank" => array( null, __("MyBank", "forminator" ), ), // src/form/components/fields/paypal.js:511
537
+ "Przelewy24" => array( null, __("Przelewy24", "forminator" ), ), // src/form/components/fields/paypal.js:518
538
+ "SEPA-Lastschrift" => array( null, __("SEPA-Lastschrift", "forminator" ), ), // src/form/components/fields/paypal.js:525
539
+ "Sofort" => array( null, __("Sofort", "forminator" ), ), // src/form/components/fields/paypal.js:532
540
+ "Venmo" => array( null, __("Venmo", "forminator" ), ), // src/form/components/fields/paypal.js:539
541
+ "Disable Card Options" => array( null, __("Disable Card Options", "forminator" ), ), // src/form/components/fields/paypal.js:550
542
+ "PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors." => array( null, __("PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:557
543
+ "Visa" => array( null, __("Visa", "forminator" ), ), // src/form/components/fields/paypal.js:571
544
+ "Mastercard" => array( null, __("Mastercard", "forminator" ), ), // src/form/components/fields/paypal.js:578
545
+ "American Express" => array( null, __("American Express", "forminator" ), ), // src/form/components/fields/paypal.js:585
546
+ "Discover" => array( null, __("Discover", "forminator" ), ), // src/form/components/fields/paypal.js:592
547
+ "JCB" => array( null, __("JCB", "forminator" ), ), // src/form/components/fields/paypal.js:601
548
+ "Elo" => array( null, __("Elo", "forminator" ), ), // src/form/components/fields/paypal.js:608
549
+ "Hiper" => array( null, __("Hiper", "forminator" ), ), // src/form/components/fields/paypal.js:615
550
+ "Pre-fill Billing Details" => array( null, __("Pre-fill Billing Details", "forminator" ), ), // src/form/components/fields/paypal.js:626
551
+ "Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again." => array( null, __("Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again.", "forminator" ), ), // src/form/components/fields/paypal.js:633
552
+ "Enable" => array( null, __("Enable", "forminator" ), ), // src/form/components/fields/paypal.js:654
553
+ "Customer name (optional)" => array( null, __("Customer name (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:661
554
+ "Select a name field" => array( null, __("Select a name field", "forminator" ), ), // src/form/components/fields/paypal.js:670
555
+ "Customer email address (optional)" => array( null, __("Customer email address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:685
556
+ "Select an email field" => array( null, __("Select an email field", "forminator" ), ), // src/form/components/fields/paypal.js:694
557
+ "Billing address (optional)" => array( null, __("Billing address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:712
558
+ "Select an address field" => array( null, __("Select an address field", "forminator" ), ), // src/form/components/fields/paypal.js:721
559
+ "Ensure the Country option is enabled and required for {{strong}}%(fieldName)s{{/strong}} to process Paypal’s transaction successfully." => array( null, __("Ensure the Country option is enabled and required for {{strong}}%(fieldName)s{{/strong}} to process Paypal’s transaction successfully.", "forminator" ), ), // src/form/components/fields/paypal.js:750
560
+ "Disable" => array( null, __("Disable", "forminator" ), ), // src/form/components/fields/paypal.js:777
561
+ "Shipping Address" => array( null, __("Shipping Address", "forminator" ), ), // src/form/components/fields/paypal.js:787
562
+ "If you are selling a product that doesn't need to be shipped, you can choose to disable and hide the shipping address fields from the PayPal payment page." => array( null, __("If you are selling a product that doesn't need to be shipped, you can choose to disable and hide the shipping address fields from the PayPal payment page.", "forminator" ), ), // src/form/components/fields/paypal.js:794
563
+ "By default, PayPal detects the language for the visitors based on their geolocation and browser preferences. It is recommended to pass this parameter only if you need the PayPal buttons to render in the same language as the rest of your site. {{link}}Supported locale codes.{{/link}}" => array( null, __("By default, PayPal detects the language for the visitors based on their geolocation and browser preferences. It is recommended to pass this parameter only if you need the PayPal buttons to render in the same language as the rest of your site. {{link}}Supported locale codes.{{/link}}", "forminator" ), ), // src/form/components/fields/paypal.js:824
564
+ "Eg. en_US" => array( null, __("Eg. en_US", "forminator" ), ), // src/form/components/fields/paypal.js:843
565
+ "Debug Mode" => array( null, __("Debug Mode", "forminator" ), ), // src/form/components/fields/paypal.js:853
566
+ "PayPal debug mode helps troubleshoot any issues. However, it's recommended to disable this in production as it causes a significant increase in the script size and performance decrease." => array( null, __("PayPal debug mode helps troubleshoot any issues. However, it's recommended to disable this in production as it causes a significant increase in the script size and performance decrease.", "forminator" ), ), // src/form/components/fields/paypal.js:860
567
  "Make sure the users fill this field as per the selected validation and warn them when they haven't" => array( null, __("Make sure the users fill this field as per the selected validation and warn them when they haven't", "forminator" ), ), // src/form/components/fields/phone.js:43
568
  "National" => array( null, __("National", "forminator" ), ), // src/form/components/fields/phone.js:62
569
  "Select the country to validate phone number for" => array( null, __("Select the country to validate phone number for", "forminator" ), ), // src/form/components/fields/phone.js:69
600
  "Add a border to this section." => array( null, __("Add a border to this section.", "forminator" ), ), // src/form/components/fields/section.js:55
601
  "Signature Filetype" => array( null, __("Signature Filetype", "forminator" ), ), // src/form/components/fields/signature.js:30
602
  "Choose the filetype to save your users' signature in." => array( null, __("Choose the filetype to save your users' signature in.", "forminator" ), ), // src/form/components/fields/signature.js:32
603
+ "PNG" => array( null, __("PNG", "forminator" ), ), // src/form/components/fields/signature.js:46
604
+ "JPG" => array( null, __("JPG", "forminator" ), ), // src/form/components/fields/signature.js:47
605
+ "Choose the height of your signature field. The default value is 180px." => array( null, __("Choose the height of your signature field. The default value is 180px.", "forminator" ), ), // src/form/components/fields/signature.js:55
606
+ "Stroke Thickness" => array( null, __("Stroke Thickness", "forminator" ), ), // src/form/components/fields/signature.js:73
607
+ "Choose the thickness in pixels for signature strokes. The default value is 2px." => array( null, __("Choose the thickness in pixels for signature strokes. The default value is 2px.", "forminator" ), ), // src/form/components/fields/signature.js:75
608
  "Note: Pass comma-separated values for this query parameter to pre-populate multiple options." => array( null, __("Note: Pass comma-separated values for this query parameter to pre-populate multiple options.", "forminator" ), ), // src/form/components/fields/singlevalue.js:32
609
  "Search" => array( null, __("Search", "forminator" ), ), // src/form/components/fields/singlevalue.js:112
610
  "Display the search box in a dropdown" => array( null, __("Display the search box in a dropdown", "forminator" ), ), // src/form/components/fields/singlevalue.js:120
897
  "Please fill required fields" => array( null, __("Please fill required fields", "forminator" ), ), // src/form/components/modals/settings.js:149
898
  "Calculation values are required!" => array( null, __("Calculation values are required!", "forminator" ), ), // src/form/components/modals/settings.js:167
899
  "Option labels are required!" => array( null, __("Option labels are required!", "forminator" ), ), // src/form/components/modals/settings.js:176
900
+ "Please add a placeholder or select a default option." => array( null, __("Please add a placeholder or select a default option.", "forminator" ), ), // src/form/components/modals/settings.js:189
901
+ "Please select a default option." => array( null, __("Please select a default option.", "forminator" ), ), // src/form/components/modals/settings.js:194
902
+ "At least one of Title, Content, or Excerpt must be enabled for post data to be submitted." => array( null, __("At least one of Title, Content, or Excerpt must be enabled for post data to be submitted.", "forminator" ), ), // src/form/components/modals/settings.js:205
903
+ "Please, connect your Stripe account first!" => array( null, __("Please, connect your Stripe account first!", "forminator" ), ), // src/form/components/modals/settings.js:213
904
+ "You need at least one payment!" => array( null, __("You need at least one payment!", "forminator" ), ), // src/form/components/modals/settings.js:218
905
+ "Please select an email address for payment receipt." => array( null, __("Please select an email address for payment receipt.", "forminator" ), ), // src/form/components/modals/settings.js:223
906
+ "Empty labels are not allowed for meta values!" => array( null, __("Empty labels are not allowed for meta values!", "forminator" ), ), // src/form/components/modals/settings.js:234
907
+ "Please connect your PayPal account first!" => array( null, __("Please connect your PayPal account first!", "forminator" ), ), // src/form/components/modals/settings.js:247
908
+ "Please enter PayPal payment amount!" => array( null, __("Please enter PayPal payment amount!", "forminator" ), ), // src/form/components/modals/settings.js:252
909
+ "Please select PayPal payment variable field!" => array( null, __("Please select PayPal payment variable field!", "forminator" ), ), // src/form/components/modals/settings.js:257
910
+ "Calculation formula is required!" => array( null, __("Calculation formula is required!", "forminator" ), ), // src/form/components/modals/settings.js:267
911
+ "Limit Min value should be less than Max value." => array( null, __("Limit Min value should be less than Max value.", "forminator" ), ), // src/form/components/modals/settings.js:275
912
+ "Please enter API keys." => array( null, __("Please enter API keys.", "forminator" ), ), // src/form/components/modals/settings.js:298
913
+ "Please select a valid end time limit." => array( null, __("Please select a valid end time limit.", "forminator" ), ), // src/form/components/modals/settings.js:390
914
+ "Please fix the Default time error." => array( null, __("Please fix the Default time error.", "forminator" ), ), // src/form/components/modals/settings.js:396
915
+ "Please fix the Start or End time." => array( null, __("Please fix the Start or End time.", "forminator" ), ), // src/form/components/modals/settings.js:410
916
+ "Please fix the limit Start or End date." => array( null, __("Please fix the limit Start or End date.", "forminator" ), ), // src/form/components/modals/settings.js:545
917
+ "Calculations" => array( null, __("Calculations", "forminator" ), ), // src/form/components/modals/settings.js:674
918
+ "Styling" => array( null, __("Styling", "forminator" ), ), // src/form/components/modals/settings.js:694
919
+ "Customize" => array( null, __("Customize", "forminator" ), ), // src/form/components/modals/settings.js:704
920
+ "Visibility" => array( null, __("Visibility", "forminator" ), ), // src/form/components/modals/settings.js:714
921
  "Shortcode has been copied successfully." => array( null, __("Shortcode has been copied successfully.", "forminator" ), ), // src/form/components/modals/shortcode.js:22
922
  "Ready to go!" => array( null, __("Ready to go!", "forminator" ), ), // src/form/components/modals/shortcode.js:46
923
  "Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!" => array( null, __("Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!", "forminator" ), ), // src/form/components/modals/shortcode.js:50
1061
  "Font Size" => array( null, __("Font Size", "forminator" ), ), // src/form/components/settings/fonts.js:108
1062
  "Font Weight" => array( null, __("Font Weight", "forminator" ), ), // src/form/components/settings/fonts.js:116
1063
  "Select font weight" => array( null, __("Select font weight", "forminator" ), ), // src/form/components/settings/fonts.js:117
1064
+ "Start & End date" => array( null, __("Start & End date", "forminator" ), ), // src/form/components/settings/limits.js:67
1065
+ "Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}." => array( null, __("Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}.", "forminator" ), ), // src/form/components/settings/limits.js:71
1066
+ "Start Date" => array( null, __("Start Date", "forminator" ), ), // src/form/components/settings/limits.js:94
1067
+ "No limit" => array( null, __("No limit", "forminator" ), ), // src/form/components/settings/limits.js:99
1068
+ "Specific date" => array( null, __("Specific date", "forminator" ), ), // src/form/components/settings/limits.js:100
1069
+ "Date fields" => array( null, __("Date fields", "forminator" ), ), // src/form/components/settings/limits.js:103
1070
+ "Offset (optional)" => array( null, __("Offset (optional)", "forminator" ), ), // src/form/components/settings/limits.js:139
1071
+ "+" => array( null, __("+", "forminator" ), ), // src/form/components/settings/limits.js:153
1072
+ "-" => array( null, __("-", "forminator" ), ), // src/form/components/settings/limits.js:154
1073
+ "days" => array( null, __("days", "forminator" ), ), // src/form/components/settings/limits.js:174
1074
+ "weeks" => array( null, __("weeks", "forminator" ), ), // src/form/components/settings/limits.js:175
1075
+ "months" => array( null, __("months", "forminator" ), ), // src/form/components/settings/limits.js:176
1076
+ "years" => array( null, __("years", "forminator" ), ), // src/form/components/settings/limits.js:177
1077
+ "End Date" => array( null, __("End Date", "forminator" ), ), // src/form/components/settings/limits.js:195
1078
+ "Days of the week" => array( null, __("Days of the week", "forminator" ), ), // src/form/components/settings/limits.js:293
1079
+ "Choose which days of the week should be available on the calendar." => array( null, __("Choose which days of the week should be available on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:297
1080
+ "All days" => array( null, __("All days", "forminator" ), ), // src/form/components/settings/limits.js:308
1081
+ "Selected days" => array( null, __("Selected days", "forminator" ), ), // src/form/components/settings/limits.js:314
1082
+ "Sunday" => array( null, __("Sunday", "forminator" ), ), // src/form/components/settings/limits.js:326
1083
+ "Wednesday" => array( null, __("Wednesday", "forminator" ), ), // src/form/components/settings/limits.js:334
1084
+ "Saturday" => array( null, __("Saturday", "forminator" ), ), // src/form/components/settings/limits.js:342
1085
+ "Monday" => array( null, __("Monday", "forminator" ), ), // src/form/components/settings/limits.js:354
1086
+ "Thursday" => array( null, __("Thursday", "forminator" ), ), // src/form/components/settings/limits.js:362
1087
+ "Tuesday" => array( null, __("Tuesday", "forminator" ), ), // src/form/components/settings/limits.js:374
1088
+ "Friday" => array( null, __("Friday", "forminator" ), ), // src/form/components/settings/limits.js:382
1089
+ "Disable dates" => array( null, __("Disable dates", "forminator" ), ), // src/form/components/settings/limits.js:400
1090
+ "Use this setting to disable specific dates on the calendar." => array( null, __("Use this setting to disable specific dates on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:402
1091
+ "Disable date ranges" => array( null, __("Disable date ranges", "forminator" ), ), // src/form/components/settings/limits.js:417
1092
+ "Use this setting to disable specific dates ranges on the calendar." => array( null, __("Use this setting to disable specific dates ranges on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:419
1093
+ "Choose an error message to be used when visitor enters a date that is disabled." => array( null, __("Choose an error message to be used when visitor enters a date that is disabled.", "forminator" ), ), // src/form/components/settings/limits.js:436
1094
  "Select a Field" => array( null, __("Select a Field", "forminator" ), ), // src/form/components/settings/metadata-option.js:78
1095
  "Delete MetaData" => array( null, __("Delete MetaData", "forminator" ), ), // src/form/components/settings/metadata-option.js:97
1096
  "Add Custom Meta" => array( null, __("Add Custom Meta", "forminator" ), ), // src/form/components/settings/metadata-value.js:131
1104
  "Miss" => array( null, __("Miss", "forminator" ), ), // src/form/components/settings/multi-name.js:62
1105
  "Dr." => array( null, __("Dr.", "forminator" ), ), // src/form/components/settings/multi-name.js:63
1106
  "Prof." => array( null, __("Prof.", "forminator" ), ), // src/form/components/settings/multi-name.js:64
1107
+ "Delete option" => array( null, __("Delete option", "forminator" ), ), // src/form/components/settings/multi-option.js:212
1108
+ "Toggle" => array( null, __("Toggle", "forminator" ), ), // src/form/components/settings/multi-option.js:216
1109
+ "Submission limit" => array( null, __("Submission limit", "forminator" ), ), // src/form/components/settings/multi-option.js:242
1110
  "The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer." => array( null, __("The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer.", "forminator" ), ), // src/form/components/settings/multi-value.js:154
1111
  "Whoops, only .csv filetype is allowed." => array( null, __("Whoops, only .csv filetype is allowed.", "forminator" ), ), // src/form/components/settings/multi-value.js:187
1112
  "Importing this will replace your current options. Click import to continue." => array( null, __("Importing this will replace your current options. Click import to continue.", "forminator" ), ), // src/form/components/settings/multi-value.js:196
1400
  "Page/Post URL" => array( null, __("Page/Post URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:68
1401
  "Site URL" => array( null, __("Site URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:71
1402
  "Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media." => array( null, __("Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media.", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:84
1403
+ "Correct Answer" => array( null, __("Correct Answer", "forminator" ), ), // src/quiz/global/components/builder/answer.js:105
1404
+ "Select Personality" => array( null, __("Select Personality", "forminator" ), ), // src/quiz/global/components/builder/answer.js:116
1405
  "Add Question" => array( null, __("Add Question", "forminator" ), ), // src/quiz/global/components/builder/questions.js:102
1406
  "A quiz without questions is not going to be very useful… Add your questions above!" => array( null, __("A quiz without questions is not going to be very useful… Add your questions above!", "forminator" ), ), // src/quiz/global/components/builder/questions.js:108
1407
  "Edit Quiz" => array( null, __("Edit Quiz", "forminator" ), ), // src/quiz/global/components/header.js:13
admin/pages/entries-page.php CHANGED
@@ -10,14 +10,6 @@ if ( ! defined( 'ABSPATH' ) ) {
10
  */
11
  class Forminator_Entries_Page extends Forminator_Admin_Page {
12
 
13
- /**
14
- * Available Modules
15
- *
16
- * @since 1.0.5
17
- * @var array
18
- */
19
- private $modules = array();
20
-
21
  /**
22
  * Merged default parameter with superglobal REQUEST
23
  *
@@ -42,28 +34,6 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
42
  */
43
  private $form_model = null;
44
 
45
- /**
46
- * Populating Modules that available on Plugin
47
- *
48
- * @since 1.0.5
49
- */
50
- public function populate_modules() {
51
- $modules[] = array(
52
- 'name' => __( 'Forms', 'forminator' ),
53
- 'model' => Forminator_Form_Model::model(),
54
- );
55
- $modules[] = array(
56
- 'name' => __( 'Polls', 'forminator' ),
57
- 'model' => Forminator_Poll_Model::model(),
58
- );
59
- $modules[] = array(
60
- 'name' => __( 'Quizzes', 'forminator' ),
61
- 'model' => Forminator_Quiz_Model::model(),
62
- );
63
-
64
- $this->modules = apply_filters( 'forminator_entries_page_modules', $modules );
65
- }
66
-
67
  /**
68
  * Populating Current Page Parameters
69
  *
@@ -83,7 +53,6 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
83
  */
84
  public function before_render() {
85
  $this->populate_screen_params();
86
- $this->populate_modules();
87
  $this->prepare_entries_page();
88
  $this->enqueue_entries_scripts();
89
  }
@@ -96,14 +65,7 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
96
  * @return mixed
97
  */
98
  public function get_form_types() {
99
- $form_types = array();
100
- foreach ( $this->modules as $module ) {
101
- /** @var Forminator_Base_Form_Model $model */
102
- $model = $module['model'];
103
- $name = $module['name'];
104
-
105
- $form_types[ $model->get_post_type() ] = $name;
106
- }
107
 
108
  return apply_filters( 'forminator_entries_page_modules', $form_types );
109
  }
@@ -149,29 +111,6 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
149
  }
150
  }
151
 
152
- /**
153
- * Get Form Model if current requested form_id available and matched form_type
154
- *
155
- * @since 1.0.5
156
- *
157
- * @return bool|Forminator_Base_Form_Model|null
158
- */
159
- private function get_form_model() {
160
- if ( $this->get_current_form_id() ) {
161
- $form_model = forminator_get_model_from_id( $this->get_current_form_id() );
162
- if ( ! $form_model instanceof Forminator_Base_Form_Model ) {
163
- return null;
164
- }
165
- if ( $form_model->get_post_type() !== $this->get_current_form_type() ) {
166
- return null;
167
- }
168
-
169
- return $form_model;
170
- }
171
-
172
- return null;
173
- }
174
-
175
  /**
176
  * Return rendered entries page
177
  *
@@ -184,7 +123,7 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
184
  }
185
 
186
  /**
187
- * Render Form switcher / select based on current form_type
188
  *
189
  * @since 1.0.5
190
  */
10
  */
11
  class Forminator_Entries_Page extends Forminator_Admin_Page {
12
 
 
 
 
 
 
 
 
 
13
  /**
14
  * Merged default parameter with superglobal REQUEST
15
  *
34
  */
35
  private $form_model = null;
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  /**
38
  * Populating Current Page Parameters
39
  *
53
  */
54
  public function before_render() {
55
  $this->populate_screen_params();
 
56
  $this->prepare_entries_page();
57
  $this->enqueue_entries_scripts();
58
  }
65
  * @return mixed
66
  */
67
  public function get_form_types() {
68
+ $form_types = $this->modules_form_type();
 
 
 
 
 
 
 
69
 
70
  return apply_filters( 'forminator_entries_page_modules', $form_types );
71
  }
111
  }
112
  }
113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  /**
115
  * Return rendered entries page
116
  *
123
  }
124
 
125
  /**
126
+ * Render Form switcher / select based on current form_type
127
  *
128
  * @since 1.0.5
129
  */
admin/pages/reports-page.php ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die();
4
+ }
5
+
6
+ /**
7
+ * Class Forminator_Reports_Page
8
+ *
9
+ * @since 1.18.0
10
+ */
11
+ class Forminator_Reports_Page extends Forminator_Admin_Page {
12
+
13
+ /**
14
+ * Merged default parameter with superglobal REQUEST
15
+ *
16
+ * @since 1.18.0
17
+ * @var array
18
+ */
19
+ private $screen_params = array();
20
+
21
+ /**
22
+ * Get Form types based on available modules
23
+ *
24
+ * @return mixed
25
+ * @since 1.18.0
26
+ *
27
+ */
28
+ public function get_form_types() {
29
+ $form_types = $this->modules_form_type();
30
+
31
+ return apply_filters( 'forminator_reports_page_modules', $form_types );
32
+ }
33
+
34
+ /**
35
+ * Render Form switcher / select based on current form_type
36
+ *
37
+ * @since 1.18.0
38
+ */
39
+ public static function render_form_switcher( $form_type = 'forminator_forms', $form_id = 0 ) {
40
+ $classes = 'sui-select';
41
+ if ( 0 !== $form_id ) {
42
+ $classes .= ' sui-select-sm sui-select-inline';
43
+ }
44
+
45
+ $empty_option = __( 'Choose a Form', 'forminator' );
46
+ $method = 'get_forms';
47
+ $model = 'Forminator_Form_Model';
48
+
49
+ if ( $form_type === Forminator_Poll_Model::model()->get_post_type() ) {
50
+ $empty_option = __( 'Choose a Poll', 'forminator' );
51
+ $method = 'get_polls';
52
+ $model = 'Forminator_Poll_Model';
53
+ } elseif ( $form_type === Forminator_Quiz_Model::model()->get_post_type() ) {
54
+ $empty_option = __( 'Choose a Quiz', 'forminator' );
55
+ $method = 'get_quizzes';
56
+ $model = 'Forminator_Quiz_Model';
57
+ }
58
+
59
+ echo '<select name="form_id" data-allow-search="1" data-minimum-results-for-search="0" class="' . esc_attr( $classes ) . '" data-search="true" data-search="true" data-placeholder="' . esc_attr( $empty_option ) . '">';
60
+ echo '<option><option>';
61
+
62
+ $forms = Forminator_API::$method( null, 1, 999, $model::STATUS_PUBLISH );
63
+ $forms = apply_filters( 'forminator_reports_get_forms', $forms, $form_type );
64
+
65
+ foreach ( $forms as $form ) {
66
+ /**@var Forminator_Base_Form_Model $form */
67
+ $title = ! empty( $form->settings['formName'] ) ? $form->settings['formName'] : $form->raw->post_title;
68
+ echo '<option value="' . esc_attr( $form->id ) . '" ' . selected( $form->id, $form_id, false ) . '>' . esc_html( $title ) . '</option>';
69
+ }
70
+ echo '</select>';
71
+ }
72
+
73
+ /**
74
+ * Executed Action before render the page
75
+ *
76
+ * @since 1.18.0
77
+ */
78
+ public function before_render() {
79
+ $this->populate_screen_params();
80
+ $this->prepare_reports_page();
81
+ $this->enqueue_reports_scripts();
82
+ }
83
+
84
+ /**
85
+ * Populating Current Page Parameters
86
+ *
87
+ * @since 1.18.0
88
+ */
89
+ public function populate_screen_params() {
90
+ $this->screen_params = array(
91
+ 'form_type' => Forminator_Core::sanitize_text_field( 'form_type', 'forminator_forms' ),
92
+ 'form_id' => Forminator_Core::sanitize_text_field( 'form_id', 0 ),
93
+ );
94
+ }
95
+
96
+ /**
97
+ * Prepare Reports Page
98
+ *
99
+ * @since 1.18.0
100
+ */
101
+ private function prepare_reports_page() {
102
+ $this->form_model = $this->get_form_model();
103
+ // Form not found.
104
+ if ( ! $this->form_model instanceof Forminator_Base_Form_Model ) {
105
+ // if form_id available remove it from request, and redirect.
106
+ if ( $this->get_current_form_id() ) {
107
+ $url = remove_query_arg( 'form_id' );
108
+ if ( wp_safe_redirect( $url ) ) {
109
+ exit;
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Get current form type
117
+ *
118
+ * @return mixed
119
+ */
120
+ public function get_current_form_type() {
121
+ return $this->screen_params['form_type'];
122
+ }
123
+
124
+ /**
125
+ * Get current form id
126
+ *
127
+ * @return mixed
128
+ */
129
+ public function get_current_form_id() {
130
+ return $this->screen_params['form_id'];
131
+ }
132
+
133
+ /**
134
+ * Custom scripts that only used on submissions page
135
+ *
136
+ * @since 1.18.0
137
+ */
138
+ public function enqueue_reports_scripts() {
139
+
140
+ $this->forminator_daterange_script();
141
+
142
+ $this->forminator_report_chart_script();
143
+
144
+ add_filter( 'forminator_l10n', array( $this, 'add_l10n' ) );
145
+
146
+ }
147
+
148
+ /**
149
+ * Daterange script
150
+ */
151
+ public function forminator_daterange_script() {
152
+ wp_enqueue_script(
153
+ 'forminator-reports-datepicker-range',
154
+ forminator_plugin_url() . 'assets/js/library/daterangepicker.min.js',
155
+ array( 'moment' ),
156
+ '3.0.3',
157
+ true
158
+ );
159
+
160
+ $daterangepicker_ranges
161
+ = sprintf(
162
+ "
163
+ var forminator_reports_datepicker_ranges = {
164
+ '%s': [moment(), moment()],
165
+ '%s': [moment().subtract(6,'days'), moment()],
166
+ '%s': [moment().startOf('month'), moment().endOf('month')],
167
+ '%s': [moment().subtract(29,'days'), moment()],
168
+ '%s': [moment().startOf('year'), moment().endOf('year')],
169
+ };",
170
+ __( 'Today', 'forminator' ),
171
+ __( 'Last 7 Days', 'forminator' ),
172
+ __( 'This Month', 'forminator' ),
173
+ __( 'Last 30 Days', 'forminator' ),
174
+ __( 'This Year', 'forminator' )
175
+ );
176
+
177
+ /**
178
+ * Filter ranges to be used on reports date range
179
+ *
180
+ * @param string $daterangepicker_ranges
181
+ *
182
+ * @since 1.18.0
183
+ *
184
+ */
185
+ $daterangepicker_ranges = apply_filters( 'forminator_reports_datepicker_ranges', $daterangepicker_ranges );
186
+
187
+ wp_add_inline_script( 'forminator-reports-datepicker-range', $daterangepicker_ranges );
188
+ }
189
+
190
+ /**
191
+ * Chart script
192
+ */
193
+ public function forminator_report_chart_script() {
194
+ $form_id = $this->get_current_form_id();
195
+ $chart_data = Forminator_Admin_Report_Page::get_instance()->forminator_report_chart_data( $form_id );
196
+
197
+ $chart_vars
198
+ = sprintf(
199
+ "
200
+ var chart_label = '%s',
201
+ chart_form_id = %d,
202
+ monthDays = ['%s'],
203
+ submissions = [%s],
204
+ canvas_spacing = %s;",
205
+ __( 'Submissions', 'forminator' ),
206
+ $form_id,
207
+ wp_kses_post( implode( "', '", $chart_data['monthDays'] ) ),
208
+ esc_html( implode( ', ', $chart_data['submissions'] ) ),
209
+ $chart_data['canvas_spacing']
210
+ );
211
+
212
+ /**
213
+ * Filter chart vars to be used on reports
214
+ *
215
+ * @param string $chart_vars
216
+ *
217
+ * @since 1.18.0
218
+ *
219
+ */
220
+ $chart_vars = apply_filters( 'forminator_reports_chart', $chart_vars );
221
+
222
+ wp_add_inline_script( 'forminator-chartjs', $chart_vars );
223
+
224
+ return $chart_vars;
225
+
226
+ }
227
+
228
+ /**
229
+ * Hook into forminator_l10n
230
+ *
231
+ * Allow to modify `daterangepicker` locale
232
+ *
233
+ * @param $l10n
234
+ *
235
+ * @return mixed
236
+ */
237
+ public function add_l10n( $l10n ) {
238
+ $daterangepicker_lang = array(
239
+ 'daysOfWeek' => Forminator_Admin_L10n::get_short_days_names(),
240
+ 'monthNames' => Forminator_Admin_L10n::get_months_names(),
241
+ );
242
+
243
+ /**
244
+ * Filter daterangepicker locale to be used
245
+ *
246
+ * @param array $daterangepicker_lang
247
+ *
248
+ * @since 1.18.0
249
+ *
250
+ */
251
+ $daterangepicker_lang = apply_filters( 'forminator_l10n_daterangepicker', $daterangepicker_lang );
252
+ $l10n['daterangepicker'] = $daterangepicker_lang;
253
+
254
+ return $l10n;
255
+ }
256
+
257
+ /**
258
+ * Override scripts to be loaded
259
+ *
260
+ * @param $hook
261
+ *
262
+ */
263
+ public function enqueue_scripts( $hook ) {
264
+ parent::enqueue_scripts( $hook );
265
+
266
+ wp_enqueue_script(
267
+ 'forminator-chartjs',
268
+ forminator_plugin_url() . 'assets/js/front/Chart.min.js',
269
+ array( 'jquery' ),
270
+ '2.8.0',
271
+ false
272
+ );
273
+ $save_global_color = "if (typeof window !== 'undefined' && typeof window.Color !== 'undefined') {window.notChartColor = window.Color;}";
274
+ $restore_global_color = "if (typeof window !== 'undefined' && typeof window.notChartColor !== 'undefined') {window.Color = window.notChartColor;}";
275
+ wp_add_inline_script( 'forminator-chartjs', $save_global_color, 'before' );
276
+ wp_add_inline_script( 'forminator-chart', $save_global_color, 'before' );
277
+ wp_add_inline_script( 'forminator-chartjs', $restore_global_color );
278
+ wp_add_inline_script( 'forminator-chart', $restore_global_color );
279
+
280
+ // LOAD: Datalabels plugin for ChartJS.
281
+ wp_enqueue_script(
282
+ 'chartjs-plugin-datalabels',
283
+ forminator_plugin_url() . 'assets/js/front/chartjs-plugin-datalabels.min.js',
284
+ array( 'jquery' ),
285
+ '0.6.0',
286
+ false
287
+ );
288
+
289
+ $this->forminator_report_chart_script();
290
+ }
291
+ }
admin/pages/settings-page.php CHANGED
@@ -161,6 +161,10 @@ class Forminator_Settings_Page extends Forminator_Admin_Page {
161
  'form-border-width',
162
  'form-border-style',
163
 
 
 
 
 
164
  'fields-style',
165
 
166
  'use-custom-css',
161
  'form-border-width',
162
  'form-border-style',
163
 
164
+ 'field-border',
165
+ 'field-border-radius',
166
+ 'field-border-width',
167
+
168
  'fields-style',
169
 
170
  'use-custom-css',
admin/views/addons/action-button.php CHANGED
@@ -25,9 +25,6 @@ if ( isset( $compound ) && true === is_bool( $compound ) ) {
25
  echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
26
  }
27
  }
28
- if ( isset( $disabled ) && $disabled ) {
29
- echo 'disabled="' . esc_attr( $disabled ) . '"';
30
- }
31
  ?>
32
  >
33
 
@@ -60,9 +57,6 @@ if ( isset( $compound ) && true === is_bool( $compound ) ) {
60
  echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
61
  }
62
  }
63
- if ( isset( $disabled ) && $disabled ) {
64
- echo 'disabled="' . esc_attr( $disabled ) . '"';
65
- }
66
  ?>
67
  >
68
 
25
  echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
26
  }
27
  }
 
 
 
28
  ?>
29
  >
30
 
57
  echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
58
  }
59
  }
 
 
 
60
  ?>
61
  >
62
 
admin/views/addons/addons-list.php CHANGED
@@ -224,8 +224,8 @@ if ( FORMINATOR_PRO ) {
224
  'data-modal-title' => esc_html__( 'Deactivate Add-ons', 'forminator' ),
225
  'data-modal-content' => sprintf( __( 'You are trying to deactivate <strong>%s</strong> which is being used by the following forms. This can break the functionality of the forms. Are you sure you want to proceed?', 'forminator' ), esc_html( $addons->name ) ),
226
  'data-addon-slug' => esc_attr( $addons_slug ),
 
227
  ),
228
- 'disabled' => ( $is_network_active ),
229
  )
230
  );
231
  } else {
224
  'data-modal-title' => esc_html__( 'Deactivate Add-ons', 'forminator' ),
225
  'data-modal-content' => sprintf( __( 'You are trying to deactivate <strong>%s</strong> which is being used by the following forms. This can break the functionality of the forms. Are you sure you want to proceed?', 'forminator' ), esc_html( $addons->name ) ),
226
  'data-addon-slug' => esc_attr( $addons_slug ),
227
+ 'data-is_network' => $is_network_active,
228
  ),
 
229
  )
230
  );
231
  } else {
admin/views/common/entries/content.php CHANGED
@@ -13,7 +13,7 @@ if ( $count > 0 ) {
13
  update_option( 'forminator_submissions_form_id', $form_id );
14
  }
15
 
16
- $form_type = get_option( 'forminator_submissions_form_type' );
17
  $form_id = get_option( 'forminator_submissions_form_id' );
18
  ?>
19
 
13
  update_option( 'forminator_submissions_form_id', $form_id );
14
  }
15
 
16
+ $form_type = get_option( 'forminator_submissions_form_type', 'forminator_forms' );
17
  $form_id = get_option( 'forminator_submissions_form_id' );
18
  ?>
19
 
admin/views/common/popup/import.php CHANGED
@@ -22,6 +22,26 @@ $nonce = wp_create_nonce( 'forminator_save_import_' . $slug );
22
 
23
  </div>
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  </div>
26
 
27
  <div class="sui-box-footer">
22
 
23
  </div>
24
 
25
+ <div class="sui-form-field">
26
+
27
+ <label for="change-recipients" class="sui-checkbox">
28
+
29
+ <input
30
+ type="checkbox"
31
+ id="change-recipients"
32
+ aria-labelledby="change-recipients-label"
33
+ name="change_recipients"
34
+ value="checked"
35
+ />
36
+
37
+ <span aria-hidden="true"></span>
38
+
39
+ <span id="change-recipients-label"><?php esc_html_e( 'Change all recipients in this form to current user email.', 'forminator' ); ?></span>
40
+
41
+ </label>
42
+
43
+ </div>
44
+
45
  </div>
46
 
47
  <div class="sui-box-footer">
admin/views/common/reports/chart-content.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( empty( $args['reports'] ) ) {
3
+ return;
4
+ }
5
+ $reports = $args['reports']; ?>
6
+ <div class="sui-box">
7
+ <div class="sui-accordion sui-accordion-block">
8
+ <div class="sui-accordion-item sui-accordion-item--open">
9
+ <div class="sui-accordion-item-header sui-accordion-item-action">
10
+ <div class="sui-accordion-item-title">
11
+ <?php esc_html_e( 'Overview', 'forminator' ); ?>
12
+ <div class="sui-accordion-item-subtitle forminator-chart-date"><?php printf( __( 'Showing report from %s - %s', 'forminator' ),
13
+ date( 'F d, Y', strtotime( $args['start_date'] ) ),
14
+ date( 'F d, Y', strtotime( $args['end_date'] ) )
15
+ ); ?></div>
16
+ </div>
17
+ </div>
18
+ <div class="sui-accordion-item-body forminator-reports-chart">
19
+ <ul class="sui-accordion-item-data">
20
+ <li data-col="large">
21
+ <strong><?php esc_html_e( 'Last Submission', 'forminator' ); ?></strong>
22
+ <span><?php echo esc_html( $args['last_entry_time'] ); ?></span>
23
+ </li>
24
+ <li data-col="small" class="chart-views">
25
+ <strong><?php esc_html_e( 'Views', 'forminator' ); ?></strong>
26
+ <span><?php echo intval( $reports['views']['selected'] ); ?></span>
27
+ </li>
28
+ <li data-col="small" class="chart-entries">
29
+ <strong><?php esc_html_e( 'Submissions', 'forminator' ); ?></strong>
30
+ <span><?php echo intval( $reports['entries']['selected'] ); ?></span>
31
+ </li>
32
+ <li data-col="small" class="chart-conversion">
33
+ <strong><?php esc_html_e( 'Conversion Rate', 'forminator' ); ?></strong>
34
+ <span><?php echo esc_html( $reports['conversion']['selected'] ); ?></span>
35
+ </li>
36
+ </ul>
37
+ <div class="sui-chartjs sui-chartjs-animated sui-chartjs-loaded forminator-stats-chart"
38
+ data-chart-id="<?php echo esc_attr( $args['form_id'] ); ?>">
39
+ <div class="sui-chartjs-message sui-chartjs-message--empty"
40
+ style="<?php echo 0 < $reports['views'] ? 'display:none;' : ''; ?>">
41
+ <p><i class="sui-icon-info"
42
+ aria-hidden="true"></i>
43
+ <?php esc_html_e( 'No data to display! Please check later.', 'forminator' ); ?>
44
+ </p>
45
+ </div>
46
+ <div class="sui-chartjs-message sui-chartjs-message--loading">
47
+ <p><span class="sui-icon-loader sui-loading" aria-hidden="true"></span>
48
+ <?php esc_html_e( 'Loading data...', 'forminator'); ?>
49
+ </p>
50
+ </div>
51
+ <div class="sui-chartjs-canvas">
52
+ <canvas id="forminator-module-<?php echo esc_attr( $args['form_id'] ); ?>-stats"></canvas>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ </div>
admin/views/common/reports/content-none.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="sui-box sui-message">
2
+
3
+ <?php if ( forminator_is_show_branding() ) : ?>
4
+ <img src="<?php echo esc_url( forminator_plugin_url() . 'assets/img/' . $args['image'] ); ?>"
5
+ srcset="<?php echo esc_url( forminator_plugin_url() . 'assets/img/' . $args['image'] ); ?> 1x,
6
+ <?php echo esc_url( forminator_plugin_url() . 'assets/img/' . $args['image_x2'] ); ?> 2x"
7
+ alt="<?php esc_html_e( 'Forminator', 'forminator' ); ?>"
8
+ class="sui-image"
9
+ aria-hidden="true"/>
10
+ <?php endif; ?>
11
+
12
+ <div class="sui-message-content">
13
+ <h2><?php echo esc_html( $args['title'] ); ?></h2>
14
+ <p><?php echo esc_html( $args['description'] ); ?></p>
15
+ </div>
16
+
17
+ </div>
admin/views/common/reports/content.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $section = Forminator_Core::sanitize_text_field( 'section', 'dashboard' );
3
+ ?>
4
+ <div id="forminator-reports" class="sui-row-with-sidenav">
5
+ <div class="sui-sidenav">
6
+ <ul class="sui-vertical-tabs sui-sidenav-hide-md">
7
+ <li class="sui-vertical-tab <?php echo esc_attr( 'dashboard' === $section ? 'current' : '' ); ?>">
8
+ <a href="#" data-nav="dashboard"><?php esc_html_e( 'Dashboard', 'forminator' ); ?></a>
9
+ </li>
10
+ <li class="sui-vertical-tab <?php echo esc_attr( 'notification' === $section ? 'current' : '' ); ?>">
11
+ <a data-nav="notification" disabled>
12
+ <?php esc_html_e( 'Notification', 'forminator' ); ?>
13
+ <span class="sui-tag sui-tag-blue sui-tag-sm sui-tag-uppercase">Coming Soon</span>
14
+ </a>
15
+ </li>
16
+ </ul>
17
+ <div class="sui-sidenav-settings">
18
+ <div class="sui-form-field sui-sidenav-hide-lg">
19
+ <label class="sui-label"><?php esc_html_e( 'Navigate', 'forminator' ); ?></label>
20
+ <select id="forminator-sidenav" class="sui-select sui-mobile-nav">
21
+ <option value="dashboard"><?php esc_html_e( 'Dashboard', 'forminator' ); ?></option>
22
+ </select>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <?php $this->template( 'common/reports/tab-dashboard' ); ?>
27
+ </div>
admin/views/common/reports/header.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <header class="sui-header">
2
+ <h1 class="sui-header-title"><?php esc_html_e( 'Reports', 'forminator' ); ?></h1>
3
+
4
+ <div class="sui-actions-right">
5
+ <?php if ( forminator_is_show_documentation_link() ) : ?>
6
+ <a href="https://wpmudev.com/docs/wpmu-dev-plugins/forminator/#reports" target="_blank" class="sui-button sui-button-ghost">
7
+ <i class="sui-icon-academy"></i> <?php esc_html_e( 'View Documentation', 'forminator' ); ?>
8
+ </a>
9
+ <?php endif; ?>
10
+ </div>
11
+ </header>
admin/views/common/reports/integration-report.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="sui-box">
2
+ <div class="sui-box__message sui-box__message--loading">
3
+ <p><span class="sui-icon-loader sui-loading" aria-hidden="true"></span>
4
+ <?php esc_html_e( 'Fetching latest data...', 'forminator'); ?>
5
+ </p>
6
+ </div>
7
+
8
+ <div class="sui-box-header">
9
+ <h3 class="sui-box-title">
10
+ <i class="sui-icon-sitemap" aria-hidden="true"></i>
11
+ <?php esc_html_e( 'Apps', 'forminator' ); ?>
12
+ </h3>
13
+ <div class="sui-actions-right">
14
+ <a href="<?php echo esc_html( $app_link ); ?>"
15
+ target="_blank">
16
+ <?php esc_html_e( 'Manage Apps', 'forminator' ); ?>
17
+ <span class="sui-icon-arrow-right sui-sm" aria-hidden="true"></span>
18
+ </a>
19
+ </div>
20
+ </div>
21
+
22
+ <div class="sui-box-body">
23
+ <p><?php esc_html_e( 'Data sent to third party apps over the selected period.', 'forminator' ); ?></p>
24
+ <?php if ( empty( $integrations ) ) { ?>
25
+ <div class="sui-notice">
26
+ <div class="sui-notice-content">
27
+ <div class="sui-notice-message">
28
+ <i aria-hidden="true" class="sui-notice-icon sui-icon-info sui-md"></i>
29
+ <p><?php printf(
30
+ __( 'No third-party app connected. %1$sConnect a third-party app%2$s to view data in this report.', 'forminator' ),
31
+ '<a href="' . admin_url( 'admin.php?page=forminator-integrations' ) . '" target=_blank>',
32
+ '</a>' ); ?>
33
+ </p>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ <?php } ?>
38
+ </div>
39
+ <?php if ( ! empty( $integrations ) ) { ?>
40
+ <table class="sui-table sui-table-flushed fui-table--apps">
41
+ <thead>
42
+ <tr>
43
+ <th><?php esc_html_e( 'Apps', 'forminator' ); ?></th>
44
+ <th colspan="1" width="25%"><?php esc_html_e( 'Data', 'forminator' ); ?></th>
45
+ <th colspan="1" width="25%"><?php esc_html_e( 'Previous', 'forminator' ); ?></th>
46
+ </tr>
47
+ </thead>
48
+
49
+ <tbody>
50
+ <?php foreach ( $integrations as $key => $integration ) { ?>
51
+ <tr>
52
+ <td class="sui-table-item-title">
53
+ <div class="fui-app--wrapper">
54
+ <img src="<?php echo esc_html( $integration['image'] ); ?>"
55
+ alt="<?php echo esc_html( $integration['short_title'] ); ?>" class="sui-image"
56
+ aria-hidden="true">
57
+ <span><?php echo esc_html( $integration['title'] ); ?></span>
58
+ </div>
59
+ </td>
60
+ <td colspan="1" width="25%">
61
+ <strong class="selected-<?php echo esc_html( $key ); ?>"><?php echo absint( $integration['selected'] ); ?></strong>
62
+ <?php $arrow_color = 'high' === $integration['difference'] ? 'green' : 'red';
63
+ $arrow_icon = 'high' === $integration['difference'] ? 'up' : 'down'; ?>
64
+ <span class="fui-trend fui-trend-<?php echo esc_html( $arrow_color ); ?> increment-<?php echo esc_attr( $key ); ?>">
65
+ <?php if ( $integration['increment'] > 0 ) { ?>
66
+ <i class="sui-icon-arrow-<?php echo esc_html( $arrow_icon ); ?> sui-sm" aria-hidden="true"></i>
67
+ <?php echo esc_html( $integration['increment'] );
68
+ } ?>
69
+ </span>
70
+ </td>
71
+ <td colspan="1" width="25%" class="previous-<?php echo esc_html( $key ); ?>">
72
+ <?php echo absint( $integration['previous'] ); ?>
73
+ </td>
74
+ </tr>
75
+ <?php } ?>
76
+ </tbody>
77
+ </table>
78
+ <?php } ?>
79
+ </div>
admin/views/common/reports/report-content.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( empty( $args['reports'] ) ) {
3
+ return;
4
+ }
5
+ $reports = $args['reports'];
6
+ $report_data = Forminator_Admin_Report_Page::get_instance()->forminator_report_array( $reports, $args['form_id'] );
7
+ ?>
8
+ <div class="sui-tab-content">
9
+ <?php $chart_data = array(
10
+ 'form_id' => $args['form_id'],
11
+ 'last_entry_time' => $reports['last_entry_time'],
12
+ 'start_date' => $reports['start_date'],
13
+ 'end_date' => $reports['end_date'],
14
+ 'reports' => $report_data
15
+ );
16
+ $this->template( 'common/reports/chart-content', $chart_data ); ?>
17
+ <div class="sui-row forminator-reports-box">
18
+ <div class="sui-col-md-6">
19
+ <?php
20
+ // Views box
21
+ Forminator_Admin_Addons_page::get_instance()->render_template(
22
+ 'admin/views/common/reports/single-report',
23
+ array(
24
+ 'title' => esc_html__( 'Views', 'forminator' ),
25
+ 'description' => esc_html__( 'Views for the selected period.', 'forminator' ),
26
+ 'data_class' => 'views',
27
+ 'icon' => 'sui-icon-eye',
28
+ 'attrs' => $report_data['views'],
29
+ )
30
+ );
31
+
32
+ // Conversion rate box
33
+ Forminator_Admin_Addons_page::get_instance()->render_template(
34
+ 'admin/views/common/reports/single-report',
35
+ array(
36
+ 'title' => esc_html__( 'Conversion Rate', 'forminator' ),
37
+ 'description' => esc_html__( 'Conversion rate for the selected period.', 'forminator' ),
38
+ 'icon' => 'sui-icon-conversion',
39
+ 'data_class' => 'conversion',
40
+ 'attrs' => $report_data['conversion'],
41
+ )
42
+ );
43
+
44
+ // Payment box
45
+ if ( 'forminator_forms' === $args['form_type'] ) {
46
+ Forminator_Admin_Addons_page::get_instance()->render_template(
47
+ 'admin/views/common/reports/single-report',
48
+ array(
49
+ 'title' => esc_html__( 'Payments', 'forminator' ),
50
+ 'description' => esc_html__( 'Payments collected over the selected period.', 'forminator' ),
51
+ 'icon' => 'sui-icon-payment',
52
+ 'data_class' => 'payment',
53
+ 'attrs' => $report_data['payment'],
54
+ 'has_payment' => Forminator_Admin_Report_Page::has_live_payments( $args['form_id'] ),
55
+ )
56
+ );
57
+ }
58
+ // Submission box
59
+ if ( isset( $report_data['leads'] ) && ! empty( $report_data['leads'] ) ) {
60
+ Forminator_Admin_Addons_page::get_instance()->render_template(
61
+ 'admin/views/common/reports/single-report',
62
+ array(
63
+ 'title' => esc_html__( 'Leads', 'forminator' ),
64
+ 'description' => esc_html__( 'Leads generated within the selected period.', 'forminator' ),
65
+ 'icon' => 'sui-icon-clipboard-notes',
66
+ 'data_class' => 'leads',
67
+ 'attrs' => $report_data['leads'],
68
+ )
69
+ );
70
+ } ?>
71
+ </div>
72
+ <div class="sui-col-md-6">
73
+ <?php
74
+ // Submission box
75
+ Forminator_Admin_Addons_page::get_instance()->render_template(
76
+ 'admin/views/common/reports/single-report',
77
+ array(
78
+ 'title' => esc_html__( 'Submissions', 'forminator' ),
79
+ 'description' => esc_html__( 'Submissions for the selected period.', 'forminator' ),
80
+ 'icon' => 'sui-icon-clipboard-notes',
81
+ 'data_class' => 'entries',
82
+ 'title_text' => esc_html__( 'View submissions', 'forminator' ),
83
+ 'title_link' => esc_url( admin_url( 'admin.php?page=forminator-entries&form_type=' . forminator_get_prefix( $args['form_type'], 'post_type' ) . '&form_id=' . $args['form_id'] ) ),
84
+ 'attrs' => $report_data['entries'],
85
+ )
86
+ );
87
+
88
+ // Integration box
89
+ Forminator_Admin_Addons_page::get_instance()->render_template(
90
+ 'admin/views/common/reports/integration-report',
91
+ array(
92
+ 'form_id' => $args['form_id'],
93
+ 'integrations' => ! empty( $report_data['integration'] ) ? $report_data['integration'] : array(),
94
+ 'app_link' => Forminator_Admin_Report_Page::get_instance()->get_app_link_module_id( $args['form_id'], $args['form_type'] )
95
+ )
96
+ );
97
+ ?>
98
+ </div>
99
+ </div>
100
+ </div>
admin/views/common/reports/single-report.php ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="sui-box">
2
+ <div class="sui-box__message sui-box__message--loading">
3
+ <p><span class="sui-icon-loader sui-loading" aria-hidden="true"></span>
4
+ <?php esc_html_e( 'Fetching latest data...', 'forminator' );?>
5
+ </p>
6
+ </div>
7
+
8
+ <div class="sui-box-header">
9
+ <h3 class="sui-box-title">
10
+ <i class="<?php echo esc_html( $icon ); ?>" aria-hidden="true"></i>
11
+ <?php echo esc_html( $title ); ?>
12
+ </h3>
13
+ <?php if ( isset( $title_link ) ) { ?>
14
+ <div class="sui-actions-right">
15
+ <a href="<?php echo esc_url( $title_link ); ?>" target="_blank"
16
+ class="sui-link-blue"><?php echo esc_html( $title_text ); ?>
17
+ <span class="sui-icon-arrow-right sui-sm" aria-hidden="true"></span>
18
+ </a>
19
+ </div>
20
+ <?php } ?>
21
+ </div>
22
+
23
+ <div class="sui-box-body">
24
+ <p><?php echo esc_html( $description ); ?></p>
25
+ <?php if ( isset( $has_payment ) && ! $has_payment ) { ?>
26
+ <div class="sui-notice">
27
+ <div class="sui-notice-content">
28
+ <div class="sui-notice-message">
29
+ <i aria-hidden="true" class="sui-notice-icon sui-icon-info sui-md"></i>
30
+ <p><?php esc_html_e( 'No payment field found. Add a PayPal or a Stripe field to your form to start collecting payments.', 'forminator' ); ?>
31
+ </p>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <?php } ?>
36
+ </div>
37
+ <?php if ( ! isset( $has_payment ) || ( isset( $has_payment ) && $has_payment ) ) { ?>
38
+ <div class="sui-flushed">
39
+ <table class="sui-table sui-table-flushed report-<?php echo esc_attr( $data_class ); ?>">
40
+ <tbody>
41
+ <tr>
42
+ <td>
43
+ <div class="fui-table-title">
44
+ <?php echo esc_html( $title ); ?>
45
+ </div>
46
+ <div class="fui-table-content">
47
+ <san class="selected-<?php echo esc_attr( $data_class ); ?>">
48
+ <?php echo esc_html( $attrs['selected'] ); ?>
49
+ </san>
50
+ <?php
51
+ $arrow_color = 'high' === $attrs['difference'] ? 'fui-trend-green' : 'fui-trend-red';
52
+ $arrow_icon = 'high' === $attrs['difference'] ? 'sui-icon-arrow-up' : 'sui-icon-arrow-down'; ?>
53
+ <span class="fui-trend <?php echo esc_html( $arrow_color ); ?> increment-<?php echo esc_attr( $data_class ); ?>">
54
+ <?php if ( $attrs['increment'] > 0 ) { ?>
55
+ <i class="<?php echo esc_html( $arrow_icon ); ?> sui-sm" aria-hidden="true"></i>
56
+ <?php echo esc_html( $attrs['increment'] );
57
+ } ?>
58
+ </span>
59
+
60
+ </div>
61
+ </td>
62
+ <td>
63
+ <div class="fui-table-title"><?php esc_html_e( 'previous period', '' ); ?>
64
+ <button class="sui-button-icon sui-tooltip sui-tooltip-top-center sui-tooltip-constrained sui-tooltip-top-right-mobile"
65
+ data-tooltip="<?php esc_html_e( 'Displays the statistics for the same previous period you selected.', 'forminator' ); ?>">
66
+ <span class="sui-icon-info" aria-hidden="true"></span>
67
+ </button>
68
+ </div>
69
+ <div class="fui-table-content previous-<?php echo esc_attr( $data_class ); ?>">
70
+ <?php echo esc_html( $attrs['previous'] ) ?>
71
+ </div>
72
+ </td>
73
+ </tr>
74
+ <?php if ( isset( $has_payment ) && $has_payment ) { ?>
75
+ <tr>
76
+ <td>
77
+ <div class="fui-table-title"><?php esc_html_e( 'stripe', 'forminator' ); ?></div>
78
+ <div class="fui-table-content stripe-report">
79
+ <?php echo esc_html( $attrs['stripe'] ); ?>
80
+ </div>
81
+ </td>
82
+ <td>
83
+ <div class="fui-table-title"><?php esc_html_e( 'paypal', 'forminator' ); ?></div>
84
+ <div class="fui-table-content paypal-report">
85
+ <?php echo esc_html( $attrs['paypal'] ); ?>
86
+ </div>
87
+ </td>
88
+ </tr>
89
+ <?php } ?>
90
+ </tbody>
91
+ </table>
92
+ </div>
93
+ <?php if ( isset( $attrs['average'] ) ) { ?>
94
+ <div class="sui-box-footer">
95
+ <strong><?php esc_html_e( 'Monthly average', 'forminator' ); ?></strong>
96
+ <div class="sui-actions-right">
97
+ <p class="average-<?php echo esc_attr( $data_class ); ?>">
98
+ <?php echo esc_html( $attrs['average'] ); ?>
99
+ </p>
100
+ </div>
101
+ </div>
102
+ <?php }
103
+ } ?>
104
+ </div>
admin/views/common/reports/tab-dashboard.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $count = forminator_total_forms( 'publish' );
3
+ if ( $count > 0 ) {
4
+ $section = Forminator_Core::sanitize_text_field( 'section', 'dashboard' );
5
+ $nonce = wp_create_nonce( 'forminator_save_dashboard_settings' );
6
+ $form_id = filter_input( INPUT_GET, 'form_id', FILTER_VALIDATE_INT );
7
+ $form_type = Forminator_Core::sanitize_text_field( 'form_type' );
8
+ if ( empty( $form_type ) ) {
9
+ $form_type = 'forminator_forms';
10
+ }
11
+ $reports = Forminator_Admin_Report_Page::get_instance()->forminator_report_data( $form_id, $form_type );
12
+ ?>
13
+ <div>
14
+ <div class="sui-box sui-box-sticky" data-nav="dashboard"
15
+ style="<?php echo esc_attr( 'dashboard' !== $section ? 'display: none;' : '' ); ?>">
16
+ <div class="fui-entries-bar">
17
+ <div class="fui-bar-selectors">
18
+ <form method="get" name="bulk-action-form">
19
+ <input type="hidden" name="page" value="forminator-reports"/>
20
+ <select
21
+ name="form_type"
22
+ onchange="submit()"
23
+ class="sui-select sui-select-sm fui-bar-selectors__module"
24
+ data-placeholder="<?php esc_html_e( 'Type', 'forminator' ); ?>"
25
+ data-search="false"
26
+ >
27
+ <option></option>
28
+ <?php foreach ( $this->get_form_types() as $post_type => $name ) { ?>
29
+ <option value="<?php echo esc_attr( $post_type ); ?>" <?php echo selected( $post_type, $form_type ); ?>><?php echo esc_html( $name ); ?></option>
30
+ <?php } ?>
31
+ </select>
32
+ <?php static::render_form_switcher( $form_type, $form_id ); ?>
33
+ <button class="sui-button sui-button-blue view-reports"
34
+ onclick="submit()"><?php esc_html_e( 'View Reports', 'forminator' ); ?></button>
35
+ </form>
36
+ </div>
37
+
38
+ <div class="sui-actions-right">
39
+ <div class="sui-form-field">
40
+ <label for="unique-id" id="unique-id--label"
41
+ class="sui-label"><?php esc_html_e( 'Date range', 'forminator' ); ?></label>
42
+
43
+ <div class="sui-control-with-icon">
44
+ <input type="text"
45
+ placeholder="<?php esc_html_e( 'Select date range', 'forminator' ); ?>"
46
+ id="forminator-forms-filter--by-date"
47
+ name="date_range"
48
+ autocomplete="off"
49
+ data-id="<?php echo intval( $form_id ); ?>"
50
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_filter_report_data' ) ); ?>"
51
+ class="sui-form-control forminator-reports-filter-date"/>
52
+ <span class="sui-icon-calendar" aria-hidden="true"></span>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ <?php if ( ! empty( $form_id ) ) {
59
+ $report_args = array(
60
+ 'form_id' => $form_id,
61
+ 'form_type' => $form_type,
62
+ 'reports' => $reports
63
+ );
64
+ $this->template( 'common/reports/report-content', $report_args );
65
+ } else {
66
+ $data_arg = array(
67
+ 'title' => 'Almost there!',
68
+ 'description' => esc_html__( 'Select a form, poll, or quiz to view its report.', 'forminator' ),
69
+ 'image' => 'forminator-info.png',
70
+ 'image_x2' => 'forminator-info@2x.png'
71
+ );
72
+ $this->template( 'common/reports/content-none', $data_arg );
73
+ } ?>
74
+ </div>
75
+
76
+ <?php } else {
77
+ $data_arg = array(
78
+ 'title' => 'Oops! Nothing to show',
79
+ 'description' => esc_html__( 'You haven\'t created any forms, polls, or quizzes yet. When you do, you\'ll be able to view their reports here.', 'forminator' ),
80
+ 'image' => 'forminator-warning.png',
81
+ 'image_x2' => 'forminator-warning@2x.png'
82
+ );
83
+ $this->template( 'common/reports/content-none', $data_arg );
84
+ } ?>
admin/views/custom-form/entries/content.php CHANGED
@@ -388,7 +388,7 @@ if ( $this->total_entries() > 0 ) :
388
  } elseif ( 'number' === $detail_item['type'] || 'currency' === $detail_item['type'] || ( 'calculation' === $detail_item['type'] && is_numeric( $detail_item['value'] ) ) ) {
389
  $separator = isset( $detail_item['separator'] ) ? $detail_item['separator'] : '';
390
  $point = isset( $detail_item['point'] ) ? $detail_item['point'] : '';
391
- $precision = isset( $detail_item['precision'] ) ? $detail_item['precision'] : 0;
392
  ?>
393
 
394
  <span class="sui-description" data-inputmask="'alias': 'decimal','rightAlign': false, 'digitsOptional': false, 'groupSeparator': '<?php echo esc_attr( $separator ); ?>', 'radixPoint': '<?php echo esc_attr( $point ); ?>', 'digits': '<?php echo esc_attr( $precision ); ?>'"><?php echo wp_kses_post( $detail_item['value'] ); ?></span>
388
  } elseif ( 'number' === $detail_item['type'] || 'currency' === $detail_item['type'] || ( 'calculation' === $detail_item['type'] && is_numeric( $detail_item['value'] ) ) ) {
389
  $separator = isset( $detail_item['separator'] ) ? $detail_item['separator'] : '';
390
  $point = isset( $detail_item['point'] ) ? $detail_item['point'] : '';
391
+ $precision = isset( $detail_item['precision'] ) ? $detail_item['precision'] : 2;
392
  ?>
393
 
394
  <span class="sui-description" data-inputmask="'alias': 'decimal','rightAlign': false, 'digitsOptional': false, 'groupSeparator': '<?php echo esc_attr( $separator ); ?>', 'radixPoint': '<?php echo esc_attr( $point ); ?>', 'digits': '<?php echo esc_attr( $precision ); ?>'"><?php echo wp_kses_post( $detail_item['value'] ); ?></span>
admin/views/custom-form/popup/import-cf7.php CHANGED
@@ -41,7 +41,7 @@ $image_empty2x = forminator_plugin_url() . 'assets/images/forminator-summary@2x.
41
 
42
  <ol class="fui-dismiss-list">
43
  <li><?php printf( esc_html__( "%1\$s1. Quiz field:%2\$s Forminator doesn't have a built-in quiz field, however, you can enable CAPTCHA and Honeypot protection on your imported forms.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
44
- <li><?php printf( esc_html__( "%1\$s2. ConstantContact:%2\$s Forminator doesn't integrate directly with ConstantContact. However, you can use %3\$sZapier integration%4\$s to send your leads to ConstantContact.", 'forminator' ), '<strong>', '</strong>', '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">', '</a>' ); ?></li>
45
  <li><?php printf( esc_html__( "%1\$s3. reCAPTCHA v3 integration:%2\$s At this stage, Forminator can't import your existing reCAPTCHA integration. You can set this up manually on your imported forms once they are transferred.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
46
  <li><?php printf( esc_html__( "%1\$s4. Additional settings:%2\$s Forminator doesn't support CF7’s additional form settings.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
47
  <li><?php printf( esc_html__( '%1$s5. Custom field IDs:%2$s Forminator creates a unique ID for each field, and the conditional logic relies on them. However, you can provide a custom CSS class for each field.', 'forminator' ), '<strong>', '</strong>' ); ?></li>
41
 
42
  <ol class="fui-dismiss-list">
43
  <li><?php printf( esc_html__( "%1\$s1. Quiz field:%2\$s Forminator doesn't have a built-in quiz field, however, you can enable CAPTCHA and Honeypot protection on your imported forms.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
44
+ <li><?php printf( esc_html__( "%1\$s2. ConstantContact:%2\$s Forminator doesn't integrate directly with ConstantContact. However, you can use %3\$sWebhook integration%4\$s to send your leads to ConstantContact.", 'forminator' ), '<strong>', '</strong>', '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">', '</a>' ); ?></li>
45
  <li><?php printf( esc_html__( "%1\$s3. reCAPTCHA v3 integration:%2\$s At this stage, Forminator can't import your existing reCAPTCHA integration. You can set this up manually on your imported forms once they are transferred.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
46
  <li><?php printf( esc_html__( "%1\$s4. Additional settings:%2\$s Forminator doesn't support CF7’s additional form settings.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
47
  <li><?php printf( esc_html__( '%1$s5. Custom field IDs:%2$s Forminator creates a unique ID for each field, and the conditional logic relies on them. However, you can provide a custom CSS class for each field.', 'forminator' ), '<strong>', '</strong>' ); ?></li>
admin/views/dashboard/content.php CHANGED
@@ -27,7 +27,7 @@
27
  </div>
28
 
29
  <?php
30
- $notice_dismissed = get_option( 'forminator_dismiss_feature_1170', false );
31
  $version_upgraded = get_option( 'forminator_version_upgraded', false );
32
 
33
  if ( ! $notice_dismissed && $version_upgraded && forminator_is_show_documentation_link() && ! isset( $_GET['createnew'] ) ) {
27
  </div>
28
 
29
  <?php
30
+ $notice_dismissed = get_option( 'forminator_dismiss_feature_1180', false );
31
  $version_upgraded = get_option( 'forminator_version_upgraded', false );
32
 
33
  if ( ! $notice_dismissed && $version_upgraded && forminator_is_show_documentation_link() && ! isset( $_GET['createnew'] ) ) {
admin/views/dashboard/new-feature-notice.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
- $current_user = wp_get_current_user();
3
- $banner_1x = forminator_plugin_url() . 'assets/images/Feature_highlight_17.png';
4
- $banner_2x = forminator_plugin_url() . 'assets/images/Feature_highlight_17@2x.png';
5
  ?>
6
 
7
  <div class="sui-modal sui-modal-md">
@@ -15,7 +15,7 @@ $banner_2x = forminator_plugin_url() . 'assets/images/Feature_highlight_17@2x
15
  aria-labelledby="forminator-new-feature__title"
16
  >
17
 
18
- <div class="sui-box forminator-feature-modal" data-prop="forminator_dismiss_feature_1170" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
19
 
20
  <div class="sui-box-header sui-flatten sui-content-center">
21
 
@@ -29,36 +29,34 @@ $banner_2x = forminator_plugin_url() . 'assets/images/Feature_highlight_17@2x
29
 
30
  <button class="sui-button-icon sui-button-white sui-button-float--right forminator-dismiss-new-feature" data-modal-close>
31
  <span class="sui-icon-close sui-md" aria-hidden="true"></span>
32
- <span class="sui-screen-reader-text">Close this dialog.</span>
33
  </button>
34
 
35
- <h3 class="sui-box-title sui-lg" style="overflow: initial; white-space: initial; text-overflow: initial;"><?php esc_html_e( 'Introducing! Save form as Draft', 'forminator' ); ?></h3>
36
 
37
- <p class="sui-description"><?php printf( esc_html__( 'Hey! %s, Do you have a multi-page or lengthy form? If you do, you\'ve probably already received complaints from visitors about how long it takes them to fill it out. Now, with the latest version of Forminator, your visitors can save a form as a draft and come back later to finish and submit it.', 'forminator' ), esc_html( ucfirst( $current_user->display_name ) ) ); ?></p>
 
 
 
38
 
39
  </div>
40
 
41
- <!--<div class="sui-box-body sui-spacing-top--0">
42
 
43
- <ul>
44
 
45
- <li style="margin-bottom: 15px;">
46
- <p class="sui-description" style="margin-bottom: 5px;"><strong><?php esc_html_e( 'Conditional After Submission Behavior', 'forminator' ); ?></strong></p>
47
- <p class="sui-description"><?php esc_html_e( 'After submission behaviors have a great new feature: you can now choose what happens after users successfully submit a form based on the data they provide. For example, you can redirect users to specific pages or display different submission messages.', 'forminator' ); ?></p>
48
- </li>
49
-
50
- <li>
51
- <p class="sui-description" style="margin-bottom: 5px;"><strong><?php esc_html_e( 'Support for hCaptcha', 'forminator' ); ?></strong></p>
52
- <p class="sui-description"><?php esc_html_e( 'In the latest release, you can choose between reCAPTCHA and hCaptcha to stop pesky robots from submitting form data.', 'forminator' ); ?></p>
53
  </li>
54
 
55
  </ul>
56
 
57
- </div>-->
58
 
59
  <div class="sui-box-footer sui-flatten sui-content-center">
60
 
61
- <button class="sui-button forminator-dismiss-new-feature" data-modal-close><?php esc_html_e( 'Ok, Got it!', 'forminator' ); ?></button>
62
 
63
  </div>
64
 
1
  <?php
2
+ $url = add_query_arg( array( 'page' => 'forminator-reports' ) );
3
+ $banner_1x = forminator_plugin_url() . 'assets/images/new-feature-18.png';
4
+ $banner_2x = forminator_plugin_url() . 'assets/images/new-feature-18@2x.png';
5
  ?>
6
 
7
  <div class="sui-modal sui-modal-md">
15
  aria-labelledby="forminator-new-feature__title"
16
  >
17
 
18
+ <div class="sui-box forminator-feature-modal" data-prop="forminator_dismiss_feature_1180" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
19
 
20
  <div class="sui-box-header sui-flatten sui-content-center">
21
 
29
 
30
  <button class="sui-button-icon sui-button-white sui-button-float--right forminator-dismiss-new-feature" data-modal-close>
31
  <span class="sui-icon-close sui-md" aria-hidden="true"></span>
32
+ <span class="sui-screen-reader-text"><?php esc_html_e( 'Close this dialog.', 'forminator' ); ?></span>
33
  </button>
34
 
35
+ <h3 class="sui-box-title sui-lg" style="overflow: initial; white-space: initial; text-overflow: initial;"><?php esc_html_e( 'New! Reports and Automation Webhooks', 'forminator' ); ?></h3>
36
 
37
+ <p class="sui-description">
38
+ <?php esc_html_e( 'Want to track the performance of your forms, quizzes, and polls? We are happy to introduce Forminator\'s Reports feature! It lets you track the total number of views and submissions, conversion rates, collected payments, and data sent to third-party apps.', 'forminator' ); ?>
39
+ <a href="<?php echo esc_url( $url ); ?>" target="_blank"><?php esc_html_e( 'View reports.', 'forminator' ); ?></a>
40
+ </p>
41
 
42
  </div>
43
 
44
+ <div class="sui-box-body sui-spacing-top--20">
45
 
46
+ <ul style="margin: 0 0 0 20px; list-style: disc;">
47
 
48
+ <li style="margin-bottom: 0;">
49
+ <h4 style="margin-bottom: 0;"><?php esc_html_e( 'Webhook integration', 'forminator' ); ?></h4>
50
+ <p class="sui-description" style="margin-left: -20px;"><?php esc_html_e( 'Now you can integrate automation tools into your forms, quizzes, and polls using webhooks. This allows you to send submission data to any automation tool that supports webhooks.', 'forminator' ); ?></p>
 
 
 
 
 
51
  </li>
52
 
53
  </ul>
54
 
55
+ </div>
56
 
57
  <div class="sui-box-footer sui-flatten sui-content-center">
58
 
59
+ <button class="sui-button forminator-dismiss-new-feature" data-modal-close><?php esc_html_e( 'Got it', 'forminator' ); ?></button>
60
 
61
  </div>
62
 
admin/views/dashboard/promote-free-plan.php ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $banner_1x = forminator_plugin_url() . 'assets/images/promote-free-plan.png';
3
+ $banner_2x = forminator_plugin_url() . 'assets/images/promote-free-plan@2x.png';
4
+ ?>
5
+
6
+ <div class="sui-modal sui-modal-lg">
7
+
8
+ <div
9
+ role="dialog"
10
+ id="forminator-promote-popup"
11
+ class="sui-modal-content"
12
+ aria-live="polite"
13
+ aria-modal="true"
14
+ aria-labelledby="forminator-promote-popup__title"
15
+ >
16
+
17
+ <div class="sui-box forminator-promote-modal">
18
+
19
+ <div class="sui-box-header sui-flatten sui-content-center">
20
+
21
+ <figure class="sui-box-banner" aria-hidden="true" style="margin-bottom: 30px;">
22
+ <img
23
+ src="<?php echo esc_url( $banner_1x ); ?>"
24
+ srcset="<?php echo esc_url( $banner_1x ); ?> 1x, <?php echo esc_url( $banner_2x ); ?> 2x"
25
+ alt=""
26
+ />
27
+ </figure>
28
+
29
+ <button class="sui-button-icon sui-button-white sui-button-float--right" data-modal-close>
30
+ <span class="sui-icon-close sui-md" aria-hidden="true"></span>
31
+ <span class="sui-screen-reader-text"><?php esc_html_e( 'Close this dialog.', 'forminator' ); ?></span>
32
+ </button>
33
+
34
+ <h3 class="sui-box-title sui-lg" id="forminator-promote-popup__title" style="overflow: initial; white-space: initial; text-overflow: initial;"><?php esc_html_e( 'Claim your free WPMU DEV gift', 'forminator' ); ?></h3>
35
+
36
+ <p class="sui-description"><?php esc_html_e( 'Over 50K web developers use WPMU DEV for fast and convenient site management. Here’s what you get completely free:', 'forminator' ); ?></p>
37
+
38
+ </div>
39
+
40
+ <div class="sui-box-body" style="padding: 20px 60px 0">
41
+
42
+ <ul>
43
+
44
+ <li>
45
+ <span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
46
+ <strong><?php esc_html_e( 'The Hub - effortlessly manage unlimited sites from one dashboard', 'forminator' ); ?></strong>
47
+ <hr style="margin: 10px 0">
48
+ </li>
49
+
50
+ <li>
51
+ <span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
52
+ <strong><?php esc_html_e( 'Uptime monitor - instant downtime alerts and helpful site analytics', 'forminator' ); ?></strong>
53
+ <hr style="margin: 10px 0">
54
+ </li>
55
+
56
+ <li>
57
+ <span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
58
+ <strong><?php esc_html_e( 'White label reports - custom website health reports for clients', 'forminator' ); ?></strong>
59
+ <hr style="margin: 10px 0">
60
+ </li>
61
+
62
+ <li>
63
+ <span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
64
+ <strong><?php esc_html_e( 'Client billing - a full payment solution for your business', 'forminator' ); ?></strong>
65
+ <hr style="margin: 10px 0">
66
+ </li>
67
+
68
+ <li>
69
+ <span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
70
+ <strong><?php esc_html_e( 'Auto updates - schedule safe updates for all your plugins and themes', 'forminator' ); ?></strong>
71
+ <hr style="margin: 10px 0">
72
+ </li>
73
+
74
+ <li>
75
+ <span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
76
+ <strong><?php esc_html_e( 'Secure site backups - including 1GB free WPMU DEV storage', 'forminator' ); ?></strong>
77
+ </li>
78
+
79
+ </ul>
80
+
81
+ </div>
82
+
83
+ <div class="sui-box-body sui-content-center" style="padding-top: 0">
84
+ <strong><?php esc_html_e( 'Plus many more membership perks and benefits!', 'forminator' ); ?></strong>
85
+ </div>
86
+
87
+ <div class="sui-box-footer sui-flatten sui-content-center" style="flex-direction: column; padding-bottom: 50px;">
88
+
89
+ <a href="https://wpmudev.com/register/?free_hub&utm_source=forminator&utm_medium=referral&utm_campaign=wp_admin_free_plan_2" target="_blank" class="sui-button sui-button-blue" style="margin-bottom: 10px;">
90
+ <?php esc_html_e( 'Try the free plan', 'forminator' ); ?>
91
+ </a>
92
+
93
+ <div><p class="sui-description"><?php esc_html_e( 'No credit card required.', 'forminator' ); ?></p></div>
94
+ </div>
95
+
96
+ </div>
97
+
98
+ </div>
99
+
100
+ </div>
101
+
102
+ <script type="text/javascript">
103
+ // Find out more.
104
+ jQuery( '#forminator-promote-popup-open' ).on( 'click', function( e ) {
105
+ SUI.openModal(
106
+ 'forminator-promote-popup',
107
+ 'wpbody-content'
108
+ );
109
+ });
110
+
111
+ // Remind me later.
112
+ jQuery( '#forminator-promote-remind-later' ).on( 'click', function( e ) {
113
+ e.preventDefault();
114
+
115
+ var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
116
+ var $notice = jQuery( '[data-notice-slug="forminator_promote_free_plan"]' );
117
+
118
+ jQuery.post(
119
+ ajaxUrl,
120
+ {
121
+ action: 'forminator_promote_remind_later',
122
+ _ajax_nonce: jQuery( this ).data('nonce')
123
+ }
124
+ ).always( function() {
125
+ $notice.hide();
126
+ });
127
+ });
128
+ </script>
admin/views/integrations/addon.php CHANGED
@@ -77,7 +77,7 @@ if ( ! empty( $show_pro_info ) && $show_pro_info ) {
77
 
78
  $advertising = false;
79
 
80
- if ( 'zapier' === $addon['slug'] ) {
81
  $advertising = true;
82
  }
83
 
77
 
78
  $advertising = false;
79
 
80
+ if ( 'webhook' === $addon['slug'] ) {
81
  $advertising = true;
82
  }
83
 
admin/views/quiz/entries/content.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- /** @var Forminator_Quiz_Renderer_Entries $this */
3
  $plugin_path = forminator_plugin_url();
4
  $count = $this->filtered_total_entries();
5
  $entries_per_page = $this->get_per_page();
1
  <?php
2
+ /** @var Forminator_Quiz_Renderer $this */
3
  $plugin_path = forminator_plugin_url();
4
  $count = $this->filtered_total_entries();
5
  $entries_per_page = $this->get_per_page();
assets/forminator-ui/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
  # Change Log
2
 
 
 
 
 
 
 
 
 
 
 
3
  ## [1.10.3](https://github.com/wpmudev/shared-ui/compare/v1.10.2...v1.10.3) (2022-07-14)
4
 
5
  #### 🐛 Bug Fixes
1
  # Change Log
2
 
3
+ ## [1.10.4](https://github.com/wpmudev/shared-ui/compare/v1.10.3...v1.10.4) (2022-08-31)
4
+
5
+ #### 🐛 Bug Fixes
6
+ - `forms`
7
+ - Text field description removes spaces from before a tag. [#34](https://github.com/wpmudev/forminator-ui/pull/34) ([FOR-1739](https://incsub.atlassian.net/browse/FOR-1739)) ([@creador-dev](https://github.com/creador-dev))
8
+ - Replace select search default "null" placeholder with "Search". [#35](https://github.com/wpmudev/forminator-ui/pull/35) ([FOR-2555](https://incsub.atlassian.net/browse/FOR-2555)) ([@creador-dev](https://github.com/creador-dev))
9
+
10
+ #### Committers: 1
11
+ - Pawan Kumar ([@creador-dev](https://github.com/creador-dev))
12
+
13
  ## [1.10.3](https://github.com/wpmudev/shared-ui/compare/v1.10.2...v1.10.3) (2022-07-14)
14
 
15
  #### 🐛 Bug Fixes
assets/forminator-ui/css/forminator-forms.min.css CHANGED
@@ -2,4 +2,4 @@
2
  * WPMU DEV Forminator UI
3
  * Copyright 2019 Incsub (https://incsub.com)
4
  * Licensed under GPL v3 (http://www.gnu.org/licenses/gpl-3.0.html)
5
- */.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.select2-container{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{height:28px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{min-height:32px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-selection--multiple .select2-selection__rendered{overflow:hidden;display:inline-block;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{margin-top:5px;padding:0;border:none;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:100%}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-dropdown{width:100%;display:block;position:absolute;z-index:1051;left:-100000px;border:1px solid #aaa;border-radius:4px;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-results{display:block}.select2-results__options{margin:0;padding:0;list-style:none}.select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:6px}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{width:100%;padding:4px;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{width:auto;min-width:100%;height:auto;min-height:100%;opacity:0;-khtml-opacity:0;display:block;position:fixed;z-index:99;margin:0;padding:0;border:0;left:0;top:0;background-color:#fff}.select2-container--default .select2-selection--single{border:1px solid #aaa;border-radius:4px;background-color:#fff}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{width:20px;height:26px;position:absolute;top:1px;right:1px}.select2-container--default .select2-selection--single .select2-selection__arrow b{width:0;height:0;position:absolute;top:50%;left:50%;margin-left:-4px;margin-top:-2px;border-width:5px 4px 0 4px;border-style:solid;border-color:#888 transparent transparent transparent}.select2-container--default .select2-selection--multiple{cursor:text;border:1px solid #aaa;border-radius:4px;background-color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__rendered{width:100%;margin:0;padding:0 5px;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{float:left;margin-top:5px;color:#999}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:5px;margin-right:10px;font-weight:700}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;border:1px solid #aaa;border-radius:4px;background-color:#e4e4e4}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{cursor:pointer;display:inline-block;margin-right:2px;color:#999;font-weight:700}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{border:none;background:0 0;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-right:auto;margin-left:5px}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-right:auto;margin-left:2px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default.select2-container--disabled .select2-selection--single{cursor:default;background-color:#eee}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{cursor:default;background-color:#eee}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee));background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;margin-right:10px;font-weight:700}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#ddd;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc));background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{width:0;height:0;position:absolute;top:50%;left:50%;margin-top:-2px;margin-left:-4px;border-width:5px 4px 0 4px;border-style:solid;border-color:#888 transparent transparent transparent}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple{cursor:text;border:1px solid #aaa;border-radius:4px;outline:0;background-color:#fff}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{margin:0;padding:0 5px;list-style:none}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;border:1px solid #aaa;border-radius:4px;background-color:#e4e4e4}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{cursor:pointer;display:inline-block;margin-right:2px;color:#888;font-weight:700}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;-webkit-box-shadow:none;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{right:auto;left:1px;border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.select2-container--classic[dir=rtl] .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-right:auto;margin-left:5px}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-right:auto;margin-left:2px}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{border:none;background:0 0}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-width:0 4px 5px 4px;border-color:transparent transparent #888 transparent}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),color-stop(50%,#eee));background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#fff));background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=default]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:first-child,.forminator-ui.forminator-custom-form[data-design=default]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:last-child,.forminator-ui.forminator-custom-form[data-design=default]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message{margin:0 0 20px;padding:15px 20px 15px 22px;border-radius:2px;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-border,.forminator-ui.forminator-custom-form[data-design=default] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:1.7em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=default] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-description,.forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-description,.forminator-ui.forminator-custom-form[data-design=default] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message{display:none;padding:2px 10px;border-radius:2px;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:9px;border-width:1px;border-style:solid;border-radius:2px;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:9px;border-width:1px;border-style:solid;border-radius:2px;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:1px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet:before{content:" ";width:10px;height:10px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:3px;border-width:2px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:1px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:3px;border-width:2px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button{width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:2px;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.6);box-shadow:0 1px 4px 0 rgba(0,0,0,.6)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]){width:120%;padding:120% 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=default] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-]{display:block;position:absolute;top:50%;left:10px;font-size:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-]:before{color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon .forminator-input{padding-left:35px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-input{padding-right:60px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-suffix{display:block;position:absolute;top:50%;right:0;padding:0 10px;-webkit-transform:translateY(-50%);transform:translateY(-50%);line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container{padding:1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone.iti--allow-dropdown .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone.iti--allow-dropdown .forminator-input{padding-left:51px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .forminator-input{padding-right:51px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag{width:31px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap{left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap{left:30px}.iti-mobile .iti--container{z-index:999991}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span{overflow:hidden;display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span:not(:last-child){margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:0;border:0;border-radius:2px;font-size:14px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-]{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-]:before{display:block;color:inherit}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child){margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete{margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload{-ms-flex-wrap:wrap;flex-wrap:wrap}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload{display:block;margin:0;padding:29px;border-width:1px;border-style:dashed;border-radius:2px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]{width:30px;height:30px;display:block;margin:0 auto 5px;color:inherit;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before{display:block;color:inherit;font-size:30px;line-height:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p{display:block;margin:0;padding:0;border:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:hover{margin:0;padding:0;border:0;outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:underline;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files{display:block;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files li,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files li{padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files.forminator-has-files,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files.forminator-has-files{margin-top:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--content,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--content{direction:ltr;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview{width:36px;height:36px;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;padding:0;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image{overflow:hidden;position:relative;border-width:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image [role=image]{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center;background-repeat:no-repeat;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-width:1px;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before{display:block;color:inherit;font-size:16px;line-height:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text{min-width:1px;-webkit-box-flex:1;-ms-flex:1;flex:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p{margin:0 0 4px;padding:0;border:0;text-align:left;letter-spacing:normal;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-]{width:12px;margin:0 9px 0 0;font-size:12px;line-height:12px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--delete{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:3px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-error-message{display:none!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image{border-width:1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image]{top:-1px;right:-1px;bottom:-1px;left:-1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-error-message{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect{width:100%;height:auto;max-height:210px;overflow-x:hidden;overflow-y:auto;display:block;padding:4px;border-width:1px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option{cursor:pointer;display:block;position:relative;margin:5px 0;padding:10px;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:first-child{margin-top:0;border-top-right-radius:2px;border-top-left-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.ui-datepicker.forminator-calendar--default{width:auto;z-index:20000000;margin:0;padding:1px 0;border:0;border-radius:0;background-color:transparent!important}.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *{-webkit-box-sizing:border-box;box-sizing:border-box}.ui-datepicker.forminator-calendar--default:before{content:" ";display:block;position:absolute;z-index:1;top:1px;right:0;bottom:1px;left:0;border-width:1px;border-style:solid;border-radius:2px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header{display:block;position:relative;z-index:1;padding:10px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:11px;border-radius:2px;font-size:14px;-webkit-transition:.2s ease;transition:.2s ease}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all:focus,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev{right:unset;left:10px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{content:"❮"}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next{right:10px;left:unset}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before{content:"❯"}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 40px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select{height:30px;cursor:pointer;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 5px;padding:0 9px;border-width:1px;border-style:solid;border-radius:2px;font-size:14px;line-height:28px;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:focus,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:first-child{margin-left:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:last-child{margin-right:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-header+.ui-datepicker-calendar{padding-top:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar{width:auto;table-layout:fixed;position:relative;z-index:1;margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;font-family:inherit}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr{margin:0;padding:0;border:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th{margin:0;padding:5px;border:0;text-align:center;font-family:inherit}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th span{width:30px;display:block;padding:2px;border:0;border-radius:60px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a{text-decoration:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:visited{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:visited{font-weight:400}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:hover{font-weight:600}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td:first-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th:first-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td:first-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th:first-child{padding-left:14px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td:last-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th:last-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td:last-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th:last-child{padding-right:14px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th{font-size:12px;font-weight:600}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th span{display:block;line-height:1.4em}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td{font-size:13px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td span{border-width:1px;border-style:solid;border-radius:2px;line-height:24px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled span{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.3;-khtml-opacity:.3}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month span{cursor:default}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child tbody:last-child tr:last-child td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child tbody:last-child tr:last-child th,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child thead:last-child tr:last-child td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child thead:last-child tr:last-child th{padding-bottom:14px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar+.ui-datepicker-buttonpane{padding-top:8px}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-timepicker .forminator-row,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-timepicker .forminator-row{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message{display:none}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message{display:block}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select{min-width:100%;max-width:100%;display:block;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single{height:auto;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border-width:1px;border-style:solid}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered{min-width:10px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:8px 5px 8px 14px;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow{width:38px;height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]{display:block;margin:0 auto;font-size:12px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before{display:block;color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:hover,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:focus,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:hover,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:focus,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open{display:block;z-index:999}.forminator-select.forminator-select-dropdown-container--open *{-webkit-box-sizing:border-box;box-sizing:border-box;font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown{display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search{display:block;margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input{width:100%;max-width:100%;display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:focus,.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search.select2-search--hide{display:none!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results{display:block;margin:0;padding:0;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options{max-height:200px;overflow-y:auto;display:block;margin:0;padding:0;border:0;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;margin:0;border:0;line-height:35px;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option.select2-results__message{position:relative;margin:0 15px;padding:15px 20px;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option:not(.select2-results__option--selected){cursor:pointer}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default{padding:9px 0;border-width:1px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search{margin:0 0 9px;padding:0 9px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search input{padding:9px;border-width:1px;border-style:solid;border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option.select2-results__message{border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat{padding:10px 0;border-width:0;border-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search{margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search input{padding:10px;border-width:0;border-style:none;border-radius:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-results .select2-results__options .select2-results__option{padding:5px 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold{padding:7px 0;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search{margin:0 0 7px;padding:0 7px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search input{padding:7px;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-results .select2-results__options .select2-results__option{padding:5px 4px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material{padding:10px 0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-search input{padding:0 0 10px;border-width:0;border-bottom-width:1px;border-style:solid;background:none transparent;background-color:transparent!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.sui-dialog-content .forminator-select.forminator-select-dropdown-container--open{margin-top:1px}body.admin-bar>.forminator-select.forminator-select-dropdown-container--open{margin-top:33px}body.forminator-hustle-dropdown-fix .forminator-select.forminator-select-dropdown-container--open{z-index:999999}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal{display:block;position:relative;z-index:1;width:100%;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:unset!important;-ms-flex:unset!important;flex:unset!important;margin-bottom:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons>iframe,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons>iframe{width:100%!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature{width:auto;max-width:100%;cursor:crosshair;overflow:hidden;display:inline-block;position:relative;margin:0;padding:0;border-width:1px;border-radius:2px;border-style:solid;background-color:transparent;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature *,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature *{-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--placeholder{pointer-events:none;display:block;position:absolute;top:9px;right:29px;left:9px;line-height:1.4;letter-spacing:normal;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container canvas,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container canvas{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div{width:20px!important;height:20px!important;cursor:pointer;overflow:hidden;position:absolute!important;top:7px;right:7px;margin:0!important;padding:2px;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div img,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div img{width:16px!important;height:16px!important;float:none!important;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li{margin:0;padding:0;border:0;list-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:before{content:unset}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li{display:none;visibility:hidden}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li.forminator-current,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li.forminator-current{display:block;visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer{display:block;margin:20px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button{width:100%;display:block;margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button:last-child{margin-bottom:0}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button{margin-right:0;margin-bottom:10px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:30px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer button,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer a,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer button{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child{margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button{width:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:20px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{padding:10px 0;margin:0 auto 0 0;text-align:right;line-height:22px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{width:100%;text-align:center;margin:0 0 10px;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break{width:1px;height:30px;display:block;margin:0 7px;position:relative;z-index:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:before{content:" ";width:3px;height:100%;display:block;position:absolute;top:0;left:-1px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:last-child{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step{height:15px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;text-transform:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:1.6em;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-right:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-dot{width:15px;height:15px;display:block;-webkit-box-flex:0;-ms-flex:0 0 15px;flex:0 0 15px;border-width:1px;border-style:solid;border-radius:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{height:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before{width:100%;height:3px;top:-1px;left:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child{display:block}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break{width:auto;height:1px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:7px 0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-top:5px;margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:unset;text-align:center;text-overflow:unset;white-space:normal;word-break:normal}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{width:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step{width:15px;height:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:unset;-ms-flex-pack:unset;justify-content:unset}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;line-height:2.2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar{height:8px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative;border-radius:8px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar span{height:8px;display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:15px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=flat]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:first-child,.forminator-ui.forminator-custom-form[data-design=flat]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message{margin:0 0 20px;padding:15px 10px;border-radius:0;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-border,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:1.7em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-description,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-description,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message{display:none;padding:2px 10px;border-radius:0;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:10px;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:0;border-style:none;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet:before{content:" ";width:10px;height:10px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:5px;border-width:0;border-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:0;border-style:none;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:5px;border-width:0;border-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button{width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.6);box-shadow:0 1px 4px 0 rgba(0,0,0,.6)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]){width:120%;padding:120% 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-]{display:block;position:absolute;top:50%;left:10px;font-size:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-]:before{color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon .forminator-input{padding-left:36px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-input{padding-right:60px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-suffix{display:block;position:absolute;top:50%;right:0;padding:0 10px;-webkit-transform:translateY(-50%);transform:translateY(-50%);line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container{padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone.iti--allow-dropdown .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone.iti--allow-dropdown .forminator-input{padding-left:50px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .forminator-input{padding-right:50px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag{width:31px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap{left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap{left:30px}.iti-mobile .iti--container{z-index:999991}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span{overflow:hidden;display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span:not(:last-child){margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete{width:20px;height:20px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:0;border:0;border-radius:100%;font-size:14px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-]{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-]:before{display:block;color:inherit}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child){margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete{margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload{-ms-flex-wrap:wrap;flex-wrap:wrap}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload{display:block;margin:0;padding:30px;border:0;border-radius:0;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]{width:30px;height:30px;display:block;margin:0 auto 5px;color:inherit;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before{display:block;color:inherit;font-size:30px;line-height:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p{display:block;margin:0;padding:0;border:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:hover{margin:0;padding:0;border:0;outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:underline;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files{display:block;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files li,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files li{padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files.forminator-has-files,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files.forminator-has-files{margin-top:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--content,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--content{direction:ltr;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview{width:36px;height:36px;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;padding:0;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image{overflow:hidden;position:relative;border-width:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image [role=image]{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center;background-repeat:no-repeat;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-width:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before{display:block;color:inherit;font-size:16px;line-height:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text{min-width:1px;-webkit-box-flex:1;-ms-flex:1;flex:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p{margin:0 0 4px;padding:0;border:0;text-align:left;letter-spacing:normal;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-]{width:12px;margin:0 9px 0 0;font-size:12px;line-height:12px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--delete{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:3px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-error-message{display:none!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file.forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file.forminator-has_error .forminator-error-message{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect{width:100%;height:auto;max-height:210px;overflow-x:hidden;overflow-y:auto;display:block;padding:5px;border-width:0;border-style:none;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option{cursor:pointer;display:block;position:relative;margin:5px 0;padding:10px;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:last-child{margin-bottom:0}.ui-datepicker.forminator-calendar--flat{width:auto;z-index:20000000;margin:0;padding:1px 0;border:0;border-radius:0;background-color:transparent!important}.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *{-webkit-box-sizing:border-box;box-sizing:border-box}.ui-datepicker.forminator-calendar--flat:before{content:" ";display:block;position:absolute;z-index:1;top:1px;right:0;bottom:1px;left:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header{display:block;position:relative;z-index:1;padding:10px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:11px;border-radius:100%;font-size:14px;-webkit-transition:.2s ease;transition:.2s ease}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all:focus,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev{right:unset;left:10px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{content:"❮"}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next{right:10px;left:unset}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before{content:"❯"}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 40px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select{height:30px;cursor:pointer;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 5px;padding:0 10px;border-width:0;border-style:none;border-radius:0;font-size:14px;line-height:30px;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:focus,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:first-child{margin-left:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:last-child{margin-right:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header+.ui-datepicker-calendar{padding-top:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar{width:auto;table-layout:fixed;position:relative;z-index:1;margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;font-family:inherit}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr{margin:0;padding:0;border:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th{margin:0;padding:5px;border:0;text-align:center;font-family:inherit}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th span{width:30px;display:block;padding:2px;border:0;border-radius:60px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a{text-decoration:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:visited{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:visited{font-weight:400}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:hover{font-weight:600}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td:first-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th:first-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td:first-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th:first-child{padding-left:15px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td:last-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th:last-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td:last-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th:last-child{padding-right:15px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th{font-size:12px;font-weight:600}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th span{display:block;line-height:1.4em}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td{font-size:13px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td span{border-width:0;border-style:none;border-radius:0;line-height:26px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled span{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.3;-khtml-opacity:.3}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month span{cursor:default}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child tbody:last-child tr:last-child td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child tbody:last-child tr:last-child th,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child thead:last-child tr:last-child td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child thead:last-child tr:last-child th{padding-bottom:15px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar+.ui-datepicker-buttonpane{padding-top:8px}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-timepicker .forminator-row,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-timepicker .forminator-row{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message{display:none}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message{display:block}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select{min-width:100%;max-width:100%;display:block;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single{height:auto;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border-width:0;border-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered{min-width:10px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:8px 5px 8px 14px;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow{width:38px;height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]{display:block;margin:0 auto;font-size:12px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before{display:block;color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:hover,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:focus,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:hover,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:focus,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open{display:block;z-index:999}.forminator-select.forminator-select-dropdown-container--open *{-webkit-box-sizing:border-box;box-sizing:border-box;font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown{display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search{display:block;margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input{width:100%;max-width:100%;display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:focus,.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search.select2-search--hide{display:none!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results{display:block;margin:0;padding:0;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options{max-height:200px;overflow-y:auto;display:block;margin:0;padding:0;border:0;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;margin:0;border:0;line-height:35px;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option.select2-results__message{position:relative;margin:0 15px;padding:15px 20px;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option:not(.select2-results__option--selected){cursor:pointer}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default{padding:9px 0;border-width:1px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search{margin:0 0 9px;padding:0 9px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search input{padding:9px;border-width:1px;border-style:solid;border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option.select2-results__message{border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat{padding:10px 0;border-width:0;border-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search{margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search input{padding:10px;border-width:0;border-style:none;border-radius:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-results .select2-results__options .select2-results__option{padding:5px 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold{padding:7px 0;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search{margin:0 0 7px;padding:0 7px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search input{padding:7px;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-results .select2-results__options .select2-results__option{padding:5px 4px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material{padding:10px 0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-search input{padding:0 0 10px;border-width:0;border-bottom-width:1px;border-style:solid;background:none transparent;background-color:transparent!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.sui-dialog-content .forminator-select.forminator-select-dropdown-container--open{margin-top:1px}body.admin-bar>.forminator-select.forminator-select-dropdown-container--open{margin-top:33px}body.forminator-hustle-dropdown-fix .forminator-select.forminator-select-dropdown-container--open{z-index:999999}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal{display:block;position:relative;z-index:1;width:100%;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:unset!important;-ms-flex:unset!important;flex:unset!important;margin-bottom:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons>iframe,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons>iframe{width:100%!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature{width:auto;max-width:100%;cursor:crosshair;overflow:hidden;display:inline-block;position:relative;margin:0;padding:0;border-width:0;border-radius:0;border-style:solid;background-color:transparent;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature *,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature *{-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--placeholder{pointer-events:none;display:block;position:absolute;top:10px;right:10px;left:10px;line-height:1.4;letter-spacing:normal;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container canvas,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container canvas{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div{width:20px!important;height:20px!important;cursor:pointer;overflow:hidden;position:absolute!important;top:7px;right:7px;margin:0!important;padding:2px;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div img,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div img{width:16px!important;height:16px!important;float:none!important;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li{margin:0;padding:0;border:0;list-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:before{content:unset}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li{display:none;visibility:hidden}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li.forminator-current,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li.forminator-current{display:block;visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer{display:block;margin:20px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button{width:100%;display:block;margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button:last-child{margin-bottom:0}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button{margin-right:0;margin-bottom:10px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:30px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer button,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer a,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer button{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child{margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button{width:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:20px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{padding:10px 0;margin:0 auto 0 0;text-align:right;line-height:22px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{width:100%;text-align:center;margin:0 0 10px;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break{width:1px;height:24px;display:block;margin:0 6px;position:relative;z-index:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:before{content:" ";width:3px;height:100%;display:block;position:absolute;top:0;left:-1px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:last-child{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step{height:12px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;text-transform:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:1.6em;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-right:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-dot{width:12px;height:12px;display:block;-webkit-box-flex:0;-ms-flex:0 0 12px;flex:0 0 12px;border-width:0;border-style:none;border-radius:24px;-webkit-transform:scale(1.3);transform:scale(1.3);-webkit-transform-origin:center;transform-origin:center;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{height:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-step .forminator-step-dot{-webkit-transform:scale(1);transform:scale(1)}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before{width:100%;height:3px;top:-1px;left:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child{display:block}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break{width:auto;height:1px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:6px 0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-top:5px;margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:unset;text-align:center;text-overflow:unset;white-space:normal;word-break:normal}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{width:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step{width:12px;height:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:unset;-ms-flex-pack:unset;justify-content:unset}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;line-height:2.2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar{height:8px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar span{height:8px;display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:15px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=bold]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:first-child,.forminator-ui.forminator-custom-form[data-design=bold]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message{margin:0 0 20px;padding:15px 20px 15px 22px;border-radius:0;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-border,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:1.7em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-description,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-description,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message{display:none;padding:2px 10px;border-radius:0;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:7px;border-width:3px;border-style:solid;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:7px;border-width:3px;border-style:solid;border-radius:0;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:3px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet:before{content:" ";width:7px;height:7px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:2px;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:2px;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button{width:auto;min-width:120px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:13px 15px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.6);box-shadow:0 1px 4px 0 rgba(0,0,0,.6)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]){width:120%;padding:120% 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-]{display:block;position:absolute;top:50%;left:10px;font-size:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-]:before{color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon .forminator-input{padding-left:33px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-input{padding-right:60px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-suffix{display:block;position:absolute;top:50%;right:0;padding:0 10px;-webkit-transform:translateY(-50%);transform:translateY(-50%);line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container{padding:3px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone.iti--allow-dropdown .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone.iti--allow-dropdown .forminator-input{padding-left:53px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .forminator-input{padding-right:53px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag{width:31px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap{left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap{left:30px}.iti-mobile .iti--container{z-index:999991}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span{overflow:hidden;display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span:not(:last-child){margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:0;border:0;border-radius:100%;font-size:14px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-]{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-]:before{display:block;color:inherit}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child){margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete{margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload{-ms-flex-wrap:wrap;flex-wrap:wrap}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload{display:block;margin:0;padding:27px;border-width:3px;border-style:dashed;border-radius:0;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]{width:30px;height:30px;display:block;margin:0 auto 5px;color:inherit;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before{display:block;color:inherit;font-size:30px;line-height:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p{display:block;margin:0;padding:0;border:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:hover{margin:0;padding:0;border:0;outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:underline;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files{display:block;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files li,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files li{padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files.forminator-has-files,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files.forminator-has-files{margin-top:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--content,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--content{direction:ltr;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview{width:36px;height:36px;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;padding:0;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image{overflow:hidden;position:relative;border-width:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image [role=image]{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center;background-repeat:no-repeat;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-width:3px;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before{display:block;color:inherit;font-size:16px;line-height:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text{min-width:1px;-webkit-box-flex:1;-ms-flex:1;flex:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p{margin:0 0 4px;padding:0;border:0;text-align:left;letter-spacing:normal;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-]{width:12px;margin:0 9px 0 0;font-size:12px;line-height:12px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--delete{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:3px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-error-message{display:none!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image{border-width:3px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image]{top:-3px;right:-3px;bottom:-3px;left:-3px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-error-message{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect{width:100%;height:auto;max-height:210px;overflow-x:hidden;overflow-y:auto;display:block;padding:5px;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option{cursor:pointer;display:block;position:relative;margin:5px 0;padding:10px;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:last-child{margin-bottom:0}.ui-datepicker.forminator-calendar--bold{width:auto;z-index:20000000;margin:0;padding:1px 0;border:0;border-radius:0;background-color:transparent!important}.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *{-webkit-box-sizing:border-box;box-sizing:border-box}.ui-datepicker.forminator-calendar--bold:before{content:" ";display:block;position:absolute;z-index:1;top:1px;right:0;bottom:1px;left:0;border-width:3px;border-style:solid;border-radius:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header{display:block;position:relative;z-index:1;padding:10px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:11px;border-radius:0;font-size:14px;-webkit-transition:.2s ease;transition:.2s ease}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all:focus,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev{right:unset;left:10px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{content:"❮"}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next{right:10px;left:unset}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before{content:"❯"}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 40px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select{height:30px;cursor:pointer;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 5px;border-width:3px;border-style:solid;border-radius:0;padding:0 7px;font-size:14px;line-height:24px;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:focus,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:first-child{margin-left:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:last-child{margin-right:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header+.ui-datepicker-calendar{padding-top:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar{width:auto;table-layout:fixed;position:relative;z-index:1;margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;font-family:inherit}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr{margin:0;padding:0;border:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th{margin:0;padding:5px;border:0;text-align:center;font-family:inherit}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th span{width:30px;display:block;padding:2px;border:0;border-radius:60px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a{text-decoration:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:visited{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:visited{font-weight:400}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:hover{font-weight:600}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td:first-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th:first-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td:first-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th:first-child{padding-left:12px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td:last-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th:last-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td:last-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th:last-child{padding-right:12px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th{font-size:12px;font-weight:600}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th span{display:block;line-height:1.4em}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td{font-size:13px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td span{border-width:3px;border-style:solid;border-radius:0;line-height:20px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled span{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.3;-khtml-opacity:.3}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month span{cursor:default}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child tbody:last-child tr:last-child td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child tbody:last-child tr:last-child th,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child thead:last-child tr:last-child td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child thead:last-child tr:last-child th{padding-bottom:12px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar+.ui-datepicker-buttonpane{padding-top:8px}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-timepicker .forminator-row,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-timepicker .forminator-row{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message{display:none}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message{display:block}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select{min-width:100%;max-width:100%;display:block;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single{height:auto;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border-width:3px;border-style:solid}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered{min-width:10px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:4px 5px 4px 14px;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow{width:38px;height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]{display:block;margin:0 auto;font-size:12px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before{display:block;color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:hover,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:focus,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:hover,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:focus,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open{display:block;z-index:999}.forminator-select.forminator-select-dropdown-container--open *{-webkit-box-sizing:border-box;box-sizing:border-box;font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown{display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search{display:block;margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input{width:100%;max-width:100%;display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:focus,.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search.select2-search--hide{display:none!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results{display:block;margin:0;padding:0;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options{max-height:200px;overflow-y:auto;display:block;margin:0;padding:0;border:0;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;margin:0;border:0;line-height:35px;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option.select2-results__message{position:relative;margin:0 15px;padding:15px 20px;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option:not(.select2-results__option--selected){cursor:pointer}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default{padding:9px 0;border-width:1px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search{margin:0 0 9px;padding:0 9px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search input{padding:9px;border-width:1px;border-style:solid;border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option.select2-results__message{border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat{padding:10px 0;border-width:0;border-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search{margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search input{padding:10px;border-width:0;border-style:none;border-radius:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-results .select2-results__options .select2-results__option{padding:5px 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold{padding:7px 0;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search{margin:0 0 7px;padding:0 7px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search input{padding:7px;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-results .select2-results__options .select2-results__option{padding:5px 4px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material{padding:10px 0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-search input{padding:0 0 10px;border-width:0;border-bottom-width:1px;border-style:solid;background:none transparent;background-color:transparent!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.sui-dialog-content .forminator-select.forminator-select-dropdown-container--open{margin-top:1px}body.admin-bar>.forminator-select.forminator-select-dropdown-container--open{margin-top:33px}body.forminator-hustle-dropdown-fix .forminator-select.forminator-select-dropdown-container--open{z-index:999999}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal{display:block;position:relative;z-index:1;width:100%;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:unset!important;-ms-flex:unset!important;flex:unset!important;margin-bottom:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons>iframe,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons>iframe{width:100%!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature{width:auto;max-width:100%;cursor:crosshair;overflow:hidden;display:inline-block;position:relative;margin:0;padding:0;border-width:3px;border-style:solid;background-color:transparent;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature *,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature *{-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--placeholder{pointer-events:none;display:block;position:absolute;top:7px;right:27px;left:7px;line-height:1.4;letter-spacing:normal;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container canvas,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container canvas{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div{width:20px!important;height:20px!important;cursor:pointer;overflow:hidden;position:absolute!important;top:7px;right:7px;margin:0!important;padding:2px;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div img,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div img{width:16px!important;height:16px!important;float:none!important;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li{margin:0;padding:0;border:0;list-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:before{content:unset}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li{display:none;visibility:hidden}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li.forminator-current,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li.forminator-current{display:block;visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer{display:block;margin:20px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button{width:100%;display:block;margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button:last-child{margin-bottom:0}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button{margin-right:0;margin-bottom:10px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:30px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer button,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer a,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer button{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child{margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button{width:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:20px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{padding:10px 0;margin:0 auto 0 0;text-align:right;line-height:22px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{width:100%;text-align:center;margin:0 0 10px;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break{width:3px;height:40px;display:block;margin:0 8.5px;position:relative;z-index:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:last-child{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step{height:20px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;text-transform:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:1.6em;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-right:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-dot{width:20px;height:20px;display:block;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;border-width:3px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{height:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before{width:100%;left:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child{display:block}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break{width:auto;height:3px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:8.5px 0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-top:5px;margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:unset;text-align:center;text-overflow:unset;white-space:normal;word-break:normal}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{width:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step{width:20px;height:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:unset;-ms-flex-pack:unset;justify-content:unset}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;line-height:2.2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar{height:12px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar span{height:12px;display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:15px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=material]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:first-child,.forminator-ui.forminator-custom-form[data-design=material]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:last-child,.forminator-ui.forminator-custom-form[data-design=material]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message{margin:0 0 20px;padding:15px 20px 15px 22px;border-radius:2px;background-color:#fff;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.3);box-shadow:1px 1px 4px rgba(0,0,0,.3);text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:hover{outline:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-border,.forminator-ui.forminator-custom-form[data-design=material] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=material] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] [class*=forminator-floating-],.forminator-ui.forminator-custom-form[data-design=material] [class*=forminator-floating-]{pointer-events:none;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input{-webkit-transform:translateY(30px);transform:translateY(30px)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_icon,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_icon{padding-left:26px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone.iti--allow-dropdown,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone.iti--allow-dropdown{padding-left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone:not(.iti--allow-dropdown),.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone:not(.iti--allow-dropdown){padding-left:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input{-webkit-transform:translateY(0);transform:translateY(0)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-input-with-phone .flag-container,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-input-with-phone .flag-container,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-input-with-phone .flag-container,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-input-with-phone .flag-container{top:-61px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input:not(.forminator-has_phone),.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input:not(.forminator-has_phone){padding-left:0!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea{width:100%;max-height:140px;overflow-y:hidden;position:absolute;z-index:1;padding:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea{padding-top:10px!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-description,.forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-description,.forminator-ui.forminator-custom-form[data-design=material] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message{display:none;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:10px 0 9px;border-width:0;border-bottom-width:1px;border-style:solid;border-radius:0;background-color:transparent!important;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap{display:block;position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap:after{content:" ";height:2px;display:block;position:absolute;right:50%;bottom:0;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-input--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-input--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-input--wrap:after{right:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:0 9px 9px;border-width:1px;border-style:solid;border-radius:2px;line-height:20px;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap:after{content:" ";width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;position:absolute;z-index:1;top:0;left:0;border-width:2px;border-style:solid;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;opacity:0;-khtml-opacity:0;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-textarea--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-textarea--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-textarea--wrap:after{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked:focus+.forminator-radio-bullet:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked:focus+.forminator-radio-bullet:after{-webkit-animation-name:click-animation;animation-name:click-animation}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:after{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked~.forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked~.forminator-radio-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:2px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:before{content:" ";width:10px;height:10px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:after{content:" ";opacity:0;-khtml-opacity:0;width:20px;height:20px;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transform-origin:center;transform-origin:center;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image{position:relative;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-width:0;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.3);box-shadow:0 1px 1px 0 rgba(0,0,0,.3);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:hover .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:hover .forminator-radio-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked:focus+.forminator-checkbox-box:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked:focus+.forminator-checkbox-box:after{-webkit-animation-name:click-animation;animation-name:click-animation}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:after{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked~.forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked~.forminator-checkbox-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:2px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:after{content:" ";opacity:0;-khtml-opacity:0;width:20px;height:20px;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transform-origin:center;transform-origin:center;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image{position:relative;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-width:0;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.3);box-shadow:0 1px 1px 0 rgba(0,0,0,.3);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}@media (max-width:960px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.3);box-shadow:0 1px 1px 0 rgba(0,0,0,.3)}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button{width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;overflow:hidden;display:inline-block;position:relative;z-index:1;margin:0 10px 0 0;padding:10px;border:0;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=material] .forminator-button span[aria-hidden]:not([class*=forminator-icon-]){width:0;position:absolute;z-index:1;top:50%;left:50%;padding:0;border-radius:100%;background-color:rgba(0,0,0,.12);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:width 450ms cubic-bezier(.23,1,.32,1),.2s ease-out;transition:width 450ms cubic-bezier(.23,1,.32,1),.2s ease-out}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button span:not([aria-hidden]):not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=material] .forminator-button span:not([aria-hidden]):not([class*=forminator-icon-]){position:relative;z-index:2}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:hover{outline:0;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=material] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow
2
  * WPMU DEV Forminator UI
3
  * Copyright 2019 Incsub (https://incsub.com)
4
  * Licensed under GPL v3 (http://www.gnu.org/licenses/gpl-3.0.html)