Version Description
- Tweak: Vertical Scroll performance enhanced on all devices.
- Fixed: Security bugs fixed.
Download this release
Release Info
Developer | leap13 |
Plugin | ![]() |
Version | 3.7.1 |
Comparing to | |
See all releases |
Code changes from version 3.7.0 to 3.7.1
- admin/assets/js/admin.js +4 -1
- admin/includes/version-control.php +19 -16
- admin/settings/maps.php +23 -20
- admin/settings/modules-setting.php +4 -1
- assets/frontend/css/premium-addons.css +3 -0
- assets/frontend/js/lib/iscroll.js +2172 -0
- assets/frontend/js/lib/jquery.slimscroll.js +474 -0
- assets/frontend/js/premium-addons.js +4 -3
- assets/frontend/js/premium-vscroll.js +112 -63
- includes/class-addons-integration.php +15 -15
- premium-addons-for-elementor.php +3 -3
- readme.txt +6 -1
- widgets/premium-blog.php +38 -34
- widgets/premium-grid.php +10 -2
- widgets/premium-vscroll.php +12 -12
admin/assets/js/admin.js
CHANGED
@@ -34,7 +34,8 @@
|
|
34 |
url: settings.ajaxurl,
|
35 |
type: 'post',
|
36 |
data: {
|
37 |
-
|
|
|
38 |
fields: $( 'form#pa-settings' ).serialize(),
|
39 |
},
|
40 |
success: function( response ) {
|
@@ -61,6 +62,7 @@
|
|
61 |
type: 'post',
|
62 |
data: {
|
63 |
action: 'pa_maps_save_settings',
|
|
|
64 |
fields: $('form#pa-maps').serialize(),
|
65 |
},
|
66 |
success: function (response){
|
@@ -87,6 +89,7 @@
|
|
87 |
type: 'post',
|
88 |
data: {
|
89 |
action: 'pa_beta_save_settings',
|
|
|
90 |
fields: $('form#pa-beta-form').serialize(),
|
91 |
},
|
92 |
success: function (response){
|
34 |
url: settings.ajaxurl,
|
35 |
type: 'post',
|
36 |
data: {
|
37 |
+
action: 'pa_save_admin_addons_settings',
|
38 |
+
security: settings.nonce,
|
39 |
fields: $( 'form#pa-settings' ).serialize(),
|
40 |
},
|
41 |
success: function( response ) {
|
62 |
type: 'post',
|
63 |
data: {
|
64 |
action: 'pa_maps_save_settings',
|
65 |
+
security: settings.nonce,
|
66 |
fields: $('form#pa-maps').serialize(),
|
67 |
},
|
68 |
success: function (response){
|
89 |
type: 'post',
|
90 |
data: {
|
91 |
action: 'pa_beta_save_settings',
|
92 |
+
security: settings.nonce,
|
93 |
fields: $('form#pa-beta-form').serialize(),
|
94 |
},
|
95 |
success: function (response){
|
admin/includes/version-control.php
CHANGED
@@ -44,7 +44,8 @@ class Version_Control {
|
|
44 |
public function pa_version_page() {
|
45 |
|
46 |
$js_info = array(
|
47 |
-
|
|
|
48 |
);
|
49 |
|
50 |
wp_localize_script( 'pa-admin-js', 'settings', $js_info );
|
@@ -91,7 +92,7 @@ class Version_Control {
|
|
91 |
<tr class="pa-roll-row">
|
92 |
<th><?php echo __('Rollback Version', 'premium-addons-for-elementor'); ?></th>
|
93 |
<td>
|
94 |
-
<div><?php echo sprintf( '<a target="_blank" href="%1$s" class="button pa-btn pa-rollback-button elementor-button-spinner">%2$s</a>', wp_nonce_url( admin_url( 'admin-post.php?action=premium_addons_rollback' ), 'premium_addons_rollback' ), __('Reinstall Version 3.
|
95 |
<p class="pa-roll-desc">
|
96 |
<span><?php echo __('Warning: Please backup your database before making the rollback.', 'premium-addons-for-elementor'); ?></span>
|
97 |
</p>
|
@@ -122,19 +123,21 @@ class Version_Control {
|
|
122 |
|
123 |
public function pa_beta_save_settings() {
|
124 |
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
$this->pa_beta_settings = array(
|
132 |
-
'is-beta-tester' => intval( $settings['is-beta-tester'] ? 1 : 0 ),
|
133 |
-
);
|
134 |
-
|
135 |
-
update_option( 'pa_beta_save_settings', $this->pa_beta_settings );
|
136 |
-
|
137 |
-
return true;
|
138 |
-
die();
|
139 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
}
|
44 |
public function pa_version_page() {
|
45 |
|
46 |
$js_info = array(
|
47 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
48 |
+
'nonce' => wp_create_nonce('premium-addons-for-elementor'),
|
49 |
);
|
50 |
|
51 |
wp_localize_script( 'pa-admin-js', 'settings', $js_info );
|
92 |
<tr class="pa-roll-row">
|
93 |
<th><?php echo __('Rollback Version', 'premium-addons-for-elementor'); ?></th>
|
94 |
<td>
|
95 |
+
<div><?php echo sprintf( '<a target="_blank" href="%1$s" class="button pa-btn pa-rollback-button elementor-button-spinner">%2$s</a>', wp_nonce_url( admin_url( 'admin-post.php?action=premium_addons_rollback' ), 'premium_addons_rollback' ), __('Reinstall Version 3.7.0', 'premium-addons-for-elementor') ); ?></div>
|
96 |
<p class="pa-roll-desc">
|
97 |
<span><?php echo __('Warning: Please backup your database before making the rollback.', 'premium-addons-for-elementor'); ?></span>
|
98 |
</p>
|
123 |
|
124 |
public function pa_beta_save_settings() {
|
125 |
|
126 |
+
check_ajax_referer('premium-addons-for-elementor', 'security');
|
127 |
+
|
128 |
+
if( isset( $_POST['fields'] ) ) {
|
129 |
+
parse_str( $_POST['fields'], $settings );
|
130 |
+
} else {
|
131 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
}
|
133 |
+
|
134 |
+
$this->pa_beta_settings = array(
|
135 |
+
'is-beta-tester' => intval( $settings['is-beta-tester'] ? 1 : 0 ),
|
136 |
+
);
|
137 |
+
|
138 |
+
update_option( 'pa_beta_save_settings', $this->pa_beta_settings );
|
139 |
+
|
140 |
+
return true;
|
141 |
+
die();
|
142 |
+
}
|
143 |
}
|
admin/settings/maps.php
CHANGED
@@ -40,7 +40,8 @@ class Maps {
|
|
40 |
public function pa_maps_page() {
|
41 |
|
42 |
$js_info = array(
|
43 |
-
|
|
|
44 |
);
|
45 |
|
46 |
wp_localize_script( 'pa-admin-js', 'settings', $js_info );
|
@@ -91,7 +92,7 @@ class Maps {
|
|
91 |
<h4 class="pa-api-title"><?php echo __('Google Maps API Key:', 'premium-addons-for-elementor'); ?></h4>
|
92 |
</td>
|
93 |
<td>
|
94 |
-
<input name="premium-map-api" id="premium-map-api" type="text" placeholder="API Key" value="<?php echo $settings['premium-map-api']; ?>">
|
95 |
</td>
|
96 |
</tr>
|
97 |
<tr>
|
@@ -108,7 +109,7 @@ class Maps {
|
|
108 |
$selected = 'selected="selected" ';
|
109 |
}
|
110 |
?>
|
111 |
-
<option value="<?php echo $key; ?>" <?php echo $selected; ?>><?php echo esc_attr( $value ); ?></option>
|
112 |
<?php } ?>
|
113 |
</select>
|
114 |
</td>
|
@@ -158,22 +159,24 @@ class Maps {
|
|
158 |
|
159 |
public function pa_save_maps_settings() {
|
160 |
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
$this->pa_maps_settings = array(
|
168 |
-
'premium-map-api' => $settings['premium-map-api'],
|
169 |
-
'premium-map-disable-api' => intval( $settings['premium-map-disable-api'] ? 1 : 0 ),
|
170 |
-
'premium-map-cluster' => intval( $settings['premium-map-cluster'] ? 1 : 0 ),
|
171 |
-
'premium-map-locale' => $settings['premium-map-locale']
|
172 |
-
);
|
173 |
-
|
174 |
-
update_option( 'pa_maps_save_settings', $this->pa_maps_settings );
|
175 |
-
|
176 |
-
return true;
|
177 |
-
die();
|
178 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
179 |
}
|
40 |
public function pa_maps_page() {
|
41 |
|
42 |
$js_info = array(
|
43 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
44 |
+
'nonce' => wp_create_nonce('premium-addons-for-elementor'),
|
45 |
);
|
46 |
|
47 |
wp_localize_script( 'pa-admin-js', 'settings', $js_info );
|
92 |
<h4 class="pa-api-title"><?php echo __('Google Maps API Key:', 'premium-addons-for-elementor'); ?></h4>
|
93 |
</td>
|
94 |
<td>
|
95 |
+
<input name="premium-map-api" id="premium-map-api" type="text" placeholder="API Key" value="<?php echo esc_attr( $settings['premium-map-api'] ); ?>">
|
96 |
</td>
|
97 |
</tr>
|
98 |
<tr>
|
109 |
$selected = 'selected="selected" ';
|
110 |
}
|
111 |
?>
|
112 |
+
<option value="<?php echo esc_attr( $key ); ?>" <?php echo $selected; ?>><?php echo esc_attr( $value ); ?></option>
|
113 |
<?php } ?>
|
114 |
</select>
|
115 |
</td>
|
159 |
|
160 |
public function pa_save_maps_settings() {
|
161 |
|
162 |
+
check_ajax_referer('premium-addons-for-elementor', 'security');
|
163 |
+
|
164 |
+
if( isset( $_POST['fields'] ) ) {
|
165 |
+
parse_str( $_POST['fields'], $settings );
|
166 |
+
}else {
|
167 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
168 |
}
|
169 |
+
|
170 |
+
$this->pa_maps_settings = array(
|
171 |
+
'premium-map-api' => $settings['premium-map-api'],
|
172 |
+
'premium-map-disable-api' => intval( $settings['premium-map-disable-api'] ? 1 : 0 ),
|
173 |
+
'premium-map-cluster' => intval( $settings['premium-map-cluster'] ? 1 : 0 ),
|
174 |
+
'premium-map-locale' => $settings['premium-map-locale']
|
175 |
+
);
|
176 |
+
|
177 |
+
update_option( 'pa_maps_save_settings', $this->pa_maps_settings );
|
178 |
+
|
179 |
+
return true;
|
180 |
+
die();
|
181 |
+
}
|
182 |
}
|
admin/settings/modules-setting.php
CHANGED
@@ -141,7 +141,8 @@ class Modules_Settings {
|
|
141 |
$theme_slug = Helper_Functions::get_installed_theme();
|
142 |
|
143 |
$js_info = array(
|
144 |
-
|
|
|
145 |
'theme' => $theme_slug
|
146 |
);
|
147 |
|
@@ -698,6 +699,8 @@ class Modules_Settings {
|
|
698 |
|
699 |
public function pa_save_settings() {
|
700 |
|
|
|
|
|
701 |
if( isset( $_POST['fields'] ) ) {
|
702 |
parse_str( $_POST['fields'], $settings );
|
703 |
} else {
|
141 |
$theme_slug = Helper_Functions::get_installed_theme();
|
142 |
|
143 |
$js_info = array(
|
144 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
145 |
+
'nonce' => wp_create_nonce('premium-addons-for-elementor'),
|
146 |
'theme' => $theme_slug
|
147 |
);
|
148 |
|
699 |
|
700 |
public function pa_save_settings() {
|
701 |
|
702 |
+
check_ajax_referer('premium-addons-for-elementor', 'security');
|
703 |
+
|
704 |
if( isset( $_POST['fields'] ) ) {
|
705 |
parse_str( $_POST['fields'], $settings );
|
706 |
} else {
|
assets/frontend/css/premium-addons.css
CHANGED
@@ -3526,6 +3526,9 @@
|
|
3526 |
text-size-adjust: none;
|
3527 |
*/
|
3528 |
}
|
|
|
|
|
|
|
3529 |
/************ Premium Image Scroll ***************/
|
3530 |
/*************************************************/
|
3531 |
.premium-image-scroll-section, .premium-image-scroll-container {
|
3526 |
text-size-adjust: none;
|
3527 |
*/
|
3528 |
}
|
3529 |
+
.premium-vscroll-temp .slimScrollBar {
|
3530 |
+
visibility: hidden;
|
3531 |
+
}
|
3532 |
/************ Premium Image Scroll ***************/
|
3533 |
/*************************************************/
|
3534 |
.premium-image-scroll-section, .premium-image-scroll-container {
|
assets/frontend/js/lib/iscroll.js
ADDED
@@ -0,0 +1,2172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|