Version Description
FREE = * [change] More portable inclusion method for files * [change] Banners folder can now be moved more easily * [change] Reports folder can now be moved more easily * [fix] Number of expired adverts showing correctly on info page * [fix] Variable missing for disabled adverts * [i18n] Added Indonesian Translation
Download this release
Release Info
Developer | adegans |
Plugin | ![]() |
Version | 4.2 |
Comparing to | |
See all releases |
Code changes from version 4.1 to 4.2
- adrotate-manage-publisher.php +1 -1
- adrotate-setup.php +2 -2
- adrotate.php +11 -10
- dashboard/info.php +36 -34
- dashboard/publisher/adverts-disabled.php +1 -1
- dashboard/publisher/adverts-edit.php +4 -26
- images/clicksor.png +0 -0
- images/medianet-large-1.jpg +0 -0
- images/medianet-large-2.jpg +0 -0
- images/medianet-large-3.jpg +0 -0
- images/medianet-small-1.jpg +0 -0
- images/medianet-small-2.jpg +0 -0
- images/medianet-small-3.jpg +0 -0
- images/medianet.jpg +0 -0
- images/viglink.png +0 -0
- language/adrotate-id_ID.mo +0 -0
- language/adrotate-id_ID.po +4328 -0
- readme.txt +29 -29
adrotate-manage-publisher.php
CHANGED
@@ -118,7 +118,7 @@ function adrotate_insert_input() {
|
|
118 |
$image = $image_field;
|
119 |
} else if(strlen($image_dropdown) > 1) {
|
120 |
$imagetype = "dropdown";
|
121 |
-
$image =
|
122 |
} else {
|
123 |
$imagetype = "";
|
124 |
$image = "";
|
118 |
$image = $image_field;
|
119 |
} else if(strlen($image_dropdown) > 1) {
|
120 |
$imagetype = "dropdown";
|
121 |
+
$image = WP_CONTENT_URL."/banners/".$image_dropdown;
|
122 |
} else {
|
123 |
$imagetype = "";
|
124 |
$image = "";
|
adrotate-setup.php
CHANGED
@@ -86,8 +86,8 @@ function adrotate_activate_setup() {
|
|
86 |
}
|
87 |
|
88 |
// Attempt to make the some folders
|
89 |
-
if(!is_dir(
|
90 |
-
if(!is_dir(
|
91 |
}
|
92 |
}
|
93 |
}
|
86 |
}
|
87 |
|
88 |
// Attempt to make the some folders
|
89 |
+
if(!is_dir(WP_CONTENT_DIR.'/banners')) mkdir(WP_CONTENT_DIR.'/banners', 0755);
|
90 |
+
if(!is_dir(WP_CONTENT_DIR.'/reports')) mkdir(WP_CONTENT_DIR.'/reports', 0755);
|
91 |
}
|
92 |
}
|
93 |
}
|
adrotate.php
CHANGED
@@ -7,7 +7,7 @@ Author URI: http://ajdg.solutions/?utm_campaign=homepage&utm_medium=plugin-info&
|
|
7 |
Description: The popular choice for monetizing your website with adverts while keeping things simple. Start making money today!
|
8 |
Text Domain: adrotate
|
9 |
Domain Path: /languages/
|
10 |
-
Version: 4.
|
11 |
License: GPLv3
|
12 |
*/
|
13 |
|
@@ -22,23 +22,24 @@ License: GPLv3
|
|
22 |
------------------------------------------------------------------------------------ */
|
23 |
|
24 |
/*--- AdRotate values ---------------------------------------*/
|
25 |
-
define("ADROTATE_DISPLAY", '4.
|
26 |
define("ADROTATE_VERSION", 389);
|
27 |
define("ADROTATE_DB_VERSION", 63);
|
|
|
28 |
/*-----------------------------------------------------------*/
|
29 |
|
30 |
/*--- Load Files --------------------------------------------*/
|
31 |
-
include_once(
|
32 |
-
include_once(
|
33 |
-
include_once(
|
34 |
-
include_once(
|
35 |
-
include_once(
|
36 |
-
include_once(
|
37 |
-
include_once(
|
38 |
/*-----------------------------------------------------------*/
|
39 |
|
40 |
/*--- Check and Load config ---------------------------------*/
|
41 |
-
load_plugin_textdomain('adrotate', false, basename(
|
42 |
$adrotate_config = get_option('adrotate_config');
|
43 |
$adrotate_crawlers = get_option('adrotate_crawlers');
|
44 |
$adrotate_version = get_option("adrotate_version");
|
7 |
Description: The popular choice for monetizing your website with adverts while keeping things simple. Start making money today!
|
8 |
Text Domain: adrotate
|
9 |
Domain Path: /languages/
|
10 |
+
Version: 4.2
|
11 |
License: GPLv3
|
12 |
*/
|
13 |
|
22 |
------------------------------------------------------------------------------------ */
|
23 |
|
24 |
/*--- AdRotate values ---------------------------------------*/
|
25 |
+
define("ADROTATE_DISPLAY", '4.2');
|
26 |
define("ADROTATE_VERSION", 389);
|
27 |
define("ADROTATE_DB_VERSION", 63);
|
28 |
+
$plugin_folder = plugin_dir_path(__FILE__);
|
29 |
/*-----------------------------------------------------------*/
|
30 |
|
31 |
/*--- Load Files --------------------------------------------*/
|
32 |
+
include_once($plugin_folder.'/adrotate-setup.php');
|
33 |
+
include_once($plugin_folder.'/adrotate-manage-publisher.php');
|
34 |
+
include_once($plugin_folder.'/adrotate-functions.php');
|
35 |
+
include_once($plugin_folder.'/adrotate-statistics.php');
|
36 |
+
include_once($plugin_folder.'/adrotate-export.php');
|
37 |
+
include_once($plugin_folder.'/adrotate-output.php');
|
38 |
+
include_once($plugin_folder.'/adrotate-widget.php');
|
39 |
/*-----------------------------------------------------------*/
|
40 |
|
41 |
/*--- Check and Load config ---------------------------------*/
|
42 |
+
load_plugin_textdomain('adrotate', false, basename($plugin_folder) . '/language');
|
43 |
$adrotate_config = get_option('adrotate_config');
|
44 |
$adrotate_crawlers = get_option('adrotate_crawlers');
|
45 |
$adrotate_version = get_option("adrotate_version");
|
dashboard/info.php
CHANGED
@@ -13,6 +13,9 @@ $banners = $groups = 0;
|
|
13 |
$banners = $wpdb->get_var("SELECT COUNT(*) FROM `{$wpdb->prefix}adrotate` WHERE `type` != 'empty' AND `type` != 'a_empty';");
|
14 |
$groups = $wpdb->get_var("SELECT COUNT(*) FROM `{$wpdb->prefix}adrotate_groups` WHERE `name` != '';");
|
15 |
$data = get_option("adrotate_advert_status");
|
|
|
|
|
|
|
16 |
?>
|
17 |
|
18 |
<div id="dashboard-widgets-wrap">
|
@@ -35,7 +38,7 @@ $data = get_option("adrotate_advert_status");
|
|
35 |
<tbody>
|
36 |
<tr class="first">
|
37 |
<td class="first b"><a href="admin.php?page=adrotate-ads"><?php echo $banners; ?> <?php _e('Adverts', 'adrotate'); ?></a></td>
|
38 |
-
<td class="b"><a href="admin.php?page=adrotate-ads"><?php echo $data['expiressoon']; ?> <?php _e('(Almost) Expired', 'adrotate'); ?></a></td>
|
39 |
</tr>
|
40 |
<tr>
|
41 |
<td class="first b"><a href="admin.php?page=adrotate-groups"><?php echo $groups; ?> <?php _e('Groups', 'adrotate'); ?></a></td>
|
@@ -47,9 +50,6 @@ $data = get_option("adrotate_advert_status");
|
|
47 |
<p><?php _e('Consider writing a review if you like AdRotate. Also follow my Facebook page for updates about me and my plugins. Thank you!', 'adrotate'); ?><br />
|
48 |
<center><a class="button-primary" href="https://paypal.me/arnandegans/10usd" target="_blank">Donate $10 via Paypal</a> <a class="button" target="_blank" href="https://wordpress.org/support/plugin/adrotate/reviews/?rate=5#new-post">Write review on WordPress.org</a></center><br />
|
49 |
<a href="http://www.arnan.me/?pk_campaign=adrotate-free&pk_kwd=infopage" title="arnan.me - Nomadic in the Philippines"><img src="<?php echo plugins_url('/images/arnan-credits.jpg', dirname(__FILE__)); ?>" alt="Arnan de Gans" align="center" class="ajdg-photo" width="100%" /></a></p>
|
50 |
-
|
51 |
-
<p><strong><?php _e('Get paid as a publisher', 'adrotate'); ?></strong></p>
|
52 |
-
<p><a href='http://ajdg.link/medianet'><img alt="Media.net" height="125" src="<?php echo plugins_url('/images/medianet.jpg', dirname(__FILE__)); ?>" /></a> <a href="http://ajdg.link/clicksor" target="_blank"><img alt="Clicksor" height="125"src="<?php echo plugins_url('/images/clicksor.png', dirname(__FILE__)); ?>"></a> <a href="http://ajdg.link/viglink"><img alt="VigLink" height="125" src="<?php echo plugins_url('/images/viglink.png', dirname(__FILE__)); ?>" /></a></p>
|
53 |
</td>
|
54 |
</tr>
|
55 |
</tbody>
|
@@ -57,6 +57,25 @@ $data = get_option("adrotate_advert_status");
|
|
57 |
</div>
|
58 |
</div>
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
<h3><?php _e('Buy AdRotate Professional', 'adrotate'); ?></h3>
|
61 |
<div class="postbox-ajdg">
|
62 |
<div class="inside">
|
@@ -78,39 +97,22 @@ $data = get_option("adrotate_advert_status");
|
|
78 |
</div>
|
79 |
</div>
|
80 |
|
81 |
-
|
82 |
-
</div>
|
83 |
-
|
84 |
-
<div id="postbox-container-3" class="postbox-container" style="width:50%;">
|
85 |
-
<div id="side-sortables" class="meta-box-sortables ui-sortable">
|
86 |
-
|
87 |
-
<h3><?php _e('AdRotate News', 'adrotate'); ?></h3>
|
88 |
<div class="postbox-ajdg">
|
89 |
<div class="inside">
|
90 |
-
<?php
|
91 |
-
|
92 |
-
'items' => 3,
|
93 |
-
'show_summary' => 1,
|
94 |
-
'show_author' => 0,
|
95 |
-
'show_date' => 1)
|
96 |
-
);
|
97 |
-
?>
|
98 |
-
</div>
|
99 |
-
</div>
|
100 |
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
<p
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
'show_date' => 1)
|
112 |
-
);
|
113 |
-
?>
|
114 |
</div>
|
115 |
</div>
|
116 |
|
13 |
$banners = $wpdb->get_var("SELECT COUNT(*) FROM `{$wpdb->prefix}adrotate` WHERE `type` != 'empty' AND `type` != 'a_empty';");
|
14 |
$groups = $wpdb->get_var("SELECT COUNT(*) FROM `{$wpdb->prefix}adrotate_groups` WHERE `name` != '';");
|
15 |
$data = get_option("adrotate_advert_status");
|
16 |
+
|
17 |
+
// Random banner for Media.net
|
18 |
+
$partner = mt_rand(1,3);
|
19 |
?>
|
20 |
|
21 |
<div id="dashboard-widgets-wrap">
|
38 |
<tbody>
|
39 |
<tr class="first">
|
40 |
<td class="first b"><a href="admin.php?page=adrotate-ads"><?php echo $banners; ?> <?php _e('Adverts', 'adrotate'); ?></a></td>
|
41 |
+
<td class="b"><a href="admin.php?page=adrotate-ads"><?php echo $data['expiressoon'] + $data['expired']; ?> <?php _e('(Almost) Expired', 'adrotate'); ?></a></td>
|
42 |
</tr>
|
43 |
<tr>
|
44 |
<td class="first b"><a href="admin.php?page=adrotate-groups"><?php echo $groups; ?> <?php _e('Groups', 'adrotate'); ?></a></td>
|
50 |
<p><?php _e('Consider writing a review if you like AdRotate. Also follow my Facebook page for updates about me and my plugins. Thank you!', 'adrotate'); ?><br />
|
51 |
<center><a class="button-primary" href="https://paypal.me/arnandegans/10usd" target="_blank">Donate $10 via Paypal</a> <a class="button" target="_blank" href="https://wordpress.org/support/plugin/adrotate/reviews/?rate=5#new-post">Write review on WordPress.org</a></center><br />
|
52 |
<a href="http://www.arnan.me/?pk_campaign=adrotate-free&pk_kwd=infopage" title="arnan.me - Nomadic in the Philippines"><img src="<?php echo plugins_url('/images/arnan-credits.jpg', dirname(__FILE__)); ?>" alt="Arnan de Gans" align="center" class="ajdg-photo" width="100%" /></a></p>
|
|
|
|
|
|
|
53 |
</td>
|
54 |
</tr>
|
55 |
</tbody>
|
57 |
</div>
|
58 |
</div>
|
59 |
|
60 |
+
<h3><?php _e('Arnan de Gans News & Updates', 'adrotate'); ?></h3>
|
61 |
+
<div class="postbox-ajdg">
|
62 |
+
<div class="inside">
|
63 |
+
<?php wp_widget_rss_output(array(
|
64 |
+
'url' => array('http://www.arnan.me/feed/', 'http://ajdg.solutions/feed/'),
|
65 |
+
'items' => 4,
|
66 |
+
'show_summary' => 1,
|
67 |
+
'show_author' => 0,
|
68 |
+
'show_date' => 1)
|
69 |
+
); ?>
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
|
73 |
+
</div>
|
74 |
+
</div>
|
75 |
+
|
76 |
+
<div id="postbox-container-3" class="postbox-container" style="width:50%;">
|
77 |
+
<div id="side-sortables" class="meta-box-sortables ui-sortable">
|
78 |
+
|
79 |
<h3><?php _e('Buy AdRotate Professional', 'adrotate'); ?></h3>
|
80 |
<div class="postbox-ajdg">
|
81 |
<div class="inside">
|
97 |
</div>
|
98 |
</div>
|
99 |
|
100 |
+
<h3><?php _e('Join the Media.net advertising network', 'adrotate'); ?></h3>
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
<div class="postbox-ajdg">
|
102 |
<div class="inside">
|
103 |
+
<center><a href="http://ajdg.link/medianet" target="_blank"><img src="<?php echo plugins_url("/images/medianet-large-$partner.jpg", dirname(__FILE__)); ?>" width="440" /></a></center>
|
104 |
+
<p>Media.net is the <strong>#2 largest contextual ads platform</strong> in the world that provides its publishers with an <strong>exclusive access to the Yahoo! Bing Network of advertisers and $6bn worth of search demand.</strong></p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
|
106 |
+
<p>Media.net <strong>ads are contextual</strong> and hence always relevant to your content. They are also <strong>native by design</strong> and highly customizable, delivering a great user experience and higher CTRs.</p>
|
107 |
+
|
108 |
+
<strong><u>Some of the benefits when joining Media.net</u></strong>
|
109 |
+
<p>You <strong>get your own Account Manager</strong> at Media.net who guides you every step of the way with suggestions that will help you max your revenue potential.<br />
|
110 |
+
Media.net is <strong>the #1 alternative to Google Adsense</strong> and works very well with whatever your current revenue strategy may be.</p>
|
111 |
+
|
112 |
+
<strong><u>Exclusive offer for AdRotate users</u></strong>
|
113 |
+
<p>As an AdRotate user, sign up with Media.net and you'll earn 10% more, over and above your regular earnings for your first 3 months. <strong>Sign up now!</strong></p>
|
114 |
+
|
115 |
+
<p><a class="button-primary" href="http://ajdg.link/medianet" target="_blank">Join Media.net now »</a> <a class="button" target="_blank" href="http://ajdg.link/medianet">Learn more »</a></p>
|
|
|
|
|
|
|
116 |
</div>
|
117 |
</div>
|
118 |
|
dashboard/publisher/adverts-disabled.php
CHANGED
@@ -65,7 +65,7 @@
|
|
65 |
<tr id='adrotateindex' class='<?php echo $class; ?>'>
|
66 |
<th class="check-column"><input type="checkbox" name="disabledbannercheck[]" value="<?php echo $banner['id']; ?>" /></th>
|
67 |
<td><center><?php echo $banner['id'];?></center></td>
|
68 |
-
<td><strong><a class="row-title" href="<?php echo admin_url('/admin.php?page=adrotate-ads&view=edit&ad='.$banner['id']);?>" title="<?php _e('Edit', 'adrotate'); ?>"><?php echo stripslashes(html_entity_decode($banner['title']));?></a></strong> - <a href="<?php echo admin_url('/admin.php?page=adrotate-ads&view=report&ad='.$
|
69 |
<td><?php echo date_i18n("F d, Y", $banner['firstactive']);?><br /><span style="color: <?php echo adrotate_prepare_color($banner['lastactive']);?>;"><?php echo date_i18n("F d, Y", $banner['lastactive']);?></span></td>
|
70 |
<td><center><?php echo $stats['impressions']; ?></center></td>
|
71 |
<?php if($banner['tracker'] == "Y") { ?>
|
65 |
<tr id='adrotateindex' class='<?php echo $class; ?>'>
|
66 |
<th class="check-column"><input type="checkbox" name="disabledbannercheck[]" value="<?php echo $banner['id']; ?>" /></th>
|
67 |
<td><center><?php echo $banner['id'];?></center></td>
|
68 |
+
<td><strong><a class="row-title" href="<?php echo admin_url('/admin.php?page=adrotate-ads&view=edit&ad='.$banner['id']);?>" title="<?php _e('Edit', 'adrotate'); ?>"><?php echo stripslashes(html_entity_decode($banner['title']));?></a></strong> - <a href="<?php echo admin_url('/admin.php?page=adrotate-ads&view=report&ad='.$banner['id']);?>" title="<?php _e('Stats', 'adrotate'); ?>"><?php _e('Stats', 'adrotate'); ?></a><span style="color:#999;"><?php if(strlen($grouplist) > 0) echo '<br /><span style="font-weight:bold;">'.__('Groups:', 'adrotate').'</span> '.$grouplist; ?></td>
|
69 |
<td><?php echo date_i18n("F d, Y", $banner['firstactive']);?><br /><span style="color: <?php echo adrotate_prepare_color($banner['lastactive']);?>;"><?php echo date_i18n("F d, Y", $banner['lastactive']);?></span></td>
|
70 |
<td><center><?php echo $stats['impressions']; ?></center></td>
|
71 |
<?php if($banner['tracker'] == "Y") { ?>
|
dashboard/publisher/adverts-edit.php
CHANGED
@@ -38,26 +38,8 @@ foreach($linkmeta as $meta) {
|
|
38 |
$meta_array[] = $meta->group;
|
39 |
}
|
40 |
|
41 |
-
//
|
42 |
-
$
|
43 |
-
"medianet" => array(
|
44 |
-
"url" => "http://ajdg.link/medianet",
|
45 |
-
"alt" => "Media.net",
|
46 |
-
"image" => "medianet.jpg"
|
47 |
-
),
|
48 |
-
"clicksor" => array(
|
49 |
-
"url" => "http://ajdg.link/clicksor",
|
50 |
-
"alt" => "Clicksor",
|
51 |
-
"image" => "clicksor.png"
|
52 |
-
),
|
53 |
-
"viglink" => array(
|
54 |
-
"url" => "http://ajdg.link/viglink",
|
55 |
-
"alt" => "VigLink",
|
56 |
-
"image" => "viglink.png"
|
57 |
-
),
|
58 |
-
);
|
59 |
-
shuffle($partners);
|
60 |
-
$partners = array_slice($partners, 0, 2);
|
61 |
|
62 |
if($ad_edit_id) {
|
63 |
if($edit_banner->type != 'empty') {
|
@@ -144,12 +126,8 @@ if($edit_banner->imagetype == "field") {
|
|
144 |
<p><em><a href="#" onclick="textatcursor('adrotate_bannercode','<a href="https://ajdg.solutions/"><img src="%asset%" /></a>');return false;"><a href="https://ajdg.solutions/"><img src="%asset%" /></a></a></em></p>
|
145 |
<p><em><a href="#" onclick="textatcursor('adrotate_bannercode','<iframe src="%asset%" height="250" frameborder="0" style="border:none;"></iframe>');return false;"><iframe src="%asset%" height="250" frameborder="0" style="border:none;"></iframe></a></em></p>
|
146 |
|
147 |
-
<p><strong><?php _e('Get
|
148 |
-
<p
|
149 |
-
foreach($partners as $partner) {
|
150 |
-
echo "<a href=\"".$partner['url']."\"><img alt=\"".$partner['alt']."\" height=\"125\" src=\"".plugins_url('../images/'.$partner['image'], dirname(__FILE__))."\" /></a> ";
|
151 |
-
}
|
152 |
-
?></p>
|
153 |
</td>
|
154 |
</tr>
|
155 |
<tr>
|
38 |
$meta_array[] = $meta->group;
|
39 |
}
|
40 |
|
41 |
+
// Random banner for Media.net
|
42 |
+
$partner = mt_rand(1,3);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
|
44 |
if($ad_edit_id) {
|
45 |
if($edit_banner->type != 'empty') {
|
126 |
<p><em><a href="#" onclick="textatcursor('adrotate_bannercode','<a href="https://ajdg.solutions/"><img src="%asset%" /></a>');return false;"><a href="https://ajdg.solutions/"><img src="%asset%" /></a></a></em></p>
|
127 |
<p><em><a href="#" onclick="textatcursor('adrotate_bannercode','<iframe src="%asset%" height="250" frameborder="0" style="border:none;"></iframe>');return false;"><iframe src="%asset%" height="250" frameborder="0" style="border:none;"></iframe></a></em></p>
|
128 |
|
129 |
+
<p><strong><?php _e('Get better adverts from Media.net', 'adrotate'); ?></strong></p>
|
130 |
+
<p><a href="http://ajdg.link/medianet" target="_blank"><img src="<?php echo plugins_url("../images/medianet-small-$partner.jpg", dirname(__FILE__)); ?>" width="250" /></a></p>
|
|
|
|
|
|
|
|
|
131 |
</td>
|
132 |
</tr>
|
133 |
<tr>
|
images/clicksor.png
DELETED
Binary file
|
images/medianet-large-1.jpg
ADDED
Binary file
|
images/medianet-large-2.jpg
ADDED
Binary file
|
images/medianet-large-3.jpg
ADDED
Binary file
|
images/medianet-small-1.jpg
ADDED
Binary file
|
images/medianet-small-2.jpg
ADDED
Binary file
|
images/medianet-small-3.jpg
ADDED
Binary file
|
images/medianet.jpg
DELETED
Binary file
|
images/viglink.png
DELETED
Binary file
|
language/adrotate-id_ID.mo
ADDED
Binary file
|
language/adrotate-id_ID.po
ADDED
@@ -0,0 +1,4328 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|