Completed
Pull Request — master (#10)
by
unknown
02:50
created

index.php (17 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
	error_reporting(-1);
3
	include 'php/jodel-web.php';
4
5
	$config = parse_ini_file('config/config.ini.php');
6
7
	$location = new Location();
8
	$location->setLat($config['default_lat']);
9
	$location->setLng($config['default_lng']);
10
	$location->setCityName($config['default_location']);
11
12
	$accessToken;
13
	$accessToken_forId1;
14
	$deviceUid;
15
	$isSpider = FALSE;
16
17
	//What is dude doing with my Server?
18
	if($_SERVER['REMOTE_ADDR'] == '94.231.103.52')
19
	{
20
		echo('You are flooting my Server! Pls enable Cookies in your script and contact me: [email protected]');
21
		die();
22
	}
23
24
	//Check if it's a Spider or Google Bot
25
	if(botDeviceUidIsSet($config) && isUserBot())
26
	{
27
		$isSpider = TRUE;
28
		error_log('Spider or Bot checked in!');
29
		
30
		$deviceUid = $config['botDeviceUid'];
31
		$config = NULL;
0 ignored issues
show
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
32
	}
33
	else
34
	{
35
		$config = NULL;
36
		if(!isset($_COOKIE['JodelDeviceId']) || !isDeviceUidInDatabase($_COOKIE['JodelDeviceId']))
37
		{
38
			$deviceUid = createAccount();
39
			setcookie('JodelDeviceId', $deviceUid, time()+60*60*24*365*10);
40
			error_log('Created account with JodelDeviceId:' . $deviceUid .  ' for [' . $_SERVER ['HTTP_USER_AGENT'] . ']');
41
			
42
		}
43
		else
44
		{
45
			$deviceUid = $_COOKIE['JodelDeviceId'];
46
		}
47
	}
48
49
	$location = getLocationByDeviceUid($deviceUid);
0 ignored issues
show
Equals sign not aligned with surrounding assignments; expected 10 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
50
	$newPositionStatus = $location->getCityName();
51
	$accessToken = isTokenFreshByDeviceUid($location, $deviceUid);
0 ignored issues
show
Equals sign not aligned with surrounding assignments; expected 7 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
52
	//Acc is fresh. token and location is set
53
54
	$accessToken_forId1 = isTokenFresh($location);
55
	$deviceUid_forId1 = getDeviceUidByAccessToken($accessToken_forId1);
0 ignored issues
show
Equals sign not aligned with surrounding assignments; expected 3 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
56
57
	//Set View
58
	if(isset($_GET['view']))
59
	{
60
		switch ($_GET['view']) {
61
			case 'comment':
62
				$view = 'comment';
63
				break;
64
			
65
			case 'upVote':
66
				$view = 'upVote';
67
				break;
68
69
			default:
70
				$view = 'time';
71
				break;
72
		}
73
	}
74
	else
75
	{
76
		$view = 'time';
77
	}
78
	
79
	//Verify Account
80
	if(isset($_GET['solution']) && isset($_GET['key']))
81
	{
82
		verifyCaptcha($accessToken_forId1);
83
	}
84
85
	//Set Location
86
	if(isset($_GET['city']))
87
	{
88
		$newPositionStatus = setLocation($accessToken, $deviceUid);
89
	}
90
	
91
	//Vote
92
	if(isset($_GET['vote']) && isset($_GET['postID']))
93
	{
94
<<<<<<< HEAD
0 ignored issues
show
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_SL
Loading history...
95
		if(!deviceUidHasVotedThisPostId($deviceUid_forId1, $_GET['postID']))
96
		{
97
			if($_GET['vote'] == "up")
98
			{
99
				$accountCreator = new Upvote();
100
			}
101
			else if($_GET['vote'] == "down")
102
			{
103
				$accountCreator = new Downvote();
104
			}
105
			$accountCreator->setAccessToken($accessToken_forId1);
106
			$accountCreator->postId = htmlspecialchars($_GET['postID']);
107
			$data = $accountCreator->execute();
108
=======
109
		votePostId($deviceUid_forId1, $accessToken_forId1);
110
	}
111
	
112
	//SendJodel
113
	if(isset($_POST['message']))
114
	{
115
		sendJodel($location, $accessToken_forId1);
116
	}
117
>>>>>>> mmainstreet/master
118
119
120
	$posts;
121
122
	//Get Post Details
123
	if(isset($_GET['postID']) && isset($_GET['getPostDetails']))
124
	{
125
		$userHandleBuffer = [];
126
127
		$accountCreator = new GetPostDetails();
128
		$accountCreator->setAccessToken($accessToken);
129
		$data = $accountCreator->execute();
130
		
131
		$posts[0] = $data;
132
		if(array_key_exists('children', $data)) {
133
			foreach($data['children'] as $key => $child)
134
			{
135
				
136
				if(!$child["parent_creator"] == 1)
137
				{
138
					$numberForUser = array_search($child['user_handle'], $userHandleBuffer);
139
					if($numberForUser === FALSE)
140
					{
141
						array_push($userHandleBuffer, $child['user_handle']);
142
						$data['children'][$key]['user_handle'] = count($userHandleBuffer);
143
					}
144
					else
145
					{
146
						$data['children'][$key]['user_handle'] = $numberForUser + 1;
147
					}
148
				}
149
150
				array_push($posts, $data['children'][$key]);
151
			}
152
			$loops = $data['child_count'] + 1;
153
		}
154
		else
155
		{
156
			$loops = 1;
157
		}
158
		$isDetailedView = TRUE;
159
	}
160
	//Get Posts
161
	else
162
	{
163
		$version = 'v2';
164
		if($view=='comment')
165
		{
166
			$url = "/v2/posts/location/discussed/";
167
		}
168
		else
169
		{
170
			if($view=='upVote')
171
			{
172
				$url = "/v2/posts/location/popular/";
173
			}
174
			else
175
			{
176
				$url = "/v3/posts/location/combo/";
177
				$version = 'v3';
178
			}
179
		}
180
181
		if($version == 'v3')
182
		{
183
			$posts = getPosts($lastPostId, $accessToken, $url, $version)['recent'];
184
		}
185
		else
186
		{
187
			$posts = getPosts($lastPostId, $accessToken, $url, $version)['posts'];
188
		}
189
		$loops = 29;
190
		$isDetailedView = FALSE;
191
	}
192
?>
193
<!DOCTYPE html>
194
<html lang="en">
195
	<head>
196
		<title><?php echo getTitle($posts[0], $view, $isDetailedView);?></title>
197
		
198
		<meta charset="utf-8">
199
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
200
		<meta http-equiv="x-ua-compatible" content="ie=edge">
201
		
202
		<meta name="description" content="<?php echo getMetaDescription($posts[0], $view, $isDetailedView);?>">
203
		<meta name="keywords" content="jodelblue, jodel, blue, webclient, web, client, web-app, browser, app">
204
		
205
		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 218 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
206
		<link rel="stylesheet" href="css/font-awesome.min.css">
207
		<link rel="stylesheet" href="style.css" type="text/css">
208
		
209
		<link rel="shortcut icon" type="image/x-icon" href="./img/favicon/favicon.ico">
210
		<link rel="icon" type="image/x-icon" href="./img/favicon/favicon.ico">
211
		<link rel="icon" type="image/gif" href="./img/favicon/favicon.gif">
212
		<link rel="icon" type="image/png" href="./img/favicon/favicon.png">
213
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon.png">
214
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-57x57.png" sizes="57x57">
215
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-60x60.png" sizes="60x60">
216
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-72x72.png" sizes="72x72">
217
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-76x76.png" sizes="76x76">
218
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-114x114.png" sizes="114x114">
219
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-120x120.png" sizes="120x120">
220
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-128x128.png" sizes="128x128">
221
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-144x144.png" sizes="144x144">
222
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-152x152.png" sizes="152x152">
223
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-180x180.png" sizes="180x180">
224
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-precomposed.png">
225
		<link rel="icon" type="image/png" href="./img/favicon/favicon-16x16.png" sizes="16x16">
226
		<link rel="icon" type="image/png" href="./img/favicon/favicon-32x32.png" sizes="32x32">
227
		<link rel="icon" type="image/png" href="./img/favicon/favicon-96x96.png" sizes="96x96">
228
		<link rel="icon" type="image/png" href="./img/favicon/favicon-160x160.png" sizes="160x160">
229
		<link rel="icon" type="image/png" href="./img/favicon/favicon-192x192.png" sizes="192x192">
230
		<link rel="icon" type="image/png" href="./img/favicon/favicon-196x196.png" sizes="196x196">
231
		<meta name="msapplication-TileImage" content="./img/favicon/win8-tile-144x144.png"> 
232
		<meta name="msapplication-TileColor" content="#5682a3"> 
233
		<meta name="msapplication-navbutton-color" content="#5682a3"> 
234
		<meta name="application-name" content="JodelBlue"/> 
235
		<meta name="msapplication-tooltip" content="JodelBlue"/> 
236
		<meta name="apple-mobile-web-app-title" content="JodelBlue"/> 
237
		<meta name="msapplication-square70x70logo" content="./img/favicon/win8-tile-70x70.png"> 
238
		<meta name="msapplication-square144x144logo" content="./img/favicon/win8-tile-144x144.png"> 
239
		<meta name="msapplication-square150x150logo" content="./img/favicon/win8-tile-150x150.png"> 
240
		<meta name="msapplication-wide310x150logo" content="./img/favicon/win8-tile-310x150.png"> 
241
		<meta name="msapplication-square310x310logo" content="./img/favicon/win8-tile-310x310.png"> 
242
	</head>
243
	
244
	<body>
245
		<header>
246
			<nav class="navbar navbar-full navbar-dark navbar-fixed-top">
247
				<div class="container">					
248
						<?php
249
							if(isset($_GET['postID']) && isset($_GET['getPostDetails']))
250
							{
251
								echo '<a id="comment-back" href="index.php?view=' . $view . '#postId-' . htmlspecialchars($_GET['postID']) . '">';
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 122 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
252
								echo '<i class="fa fa-angle-left fa-3x"></i>';
253
								echo '</a>';
254
								echo '<h1>';
255
								echo '<a href="index.php?getPostDetails=' . htmlspecialchars($_GET['getPostDetails']) . '&postID=' . htmlspecialchars($_GET['postID']) . '" class="spinnable">';
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 168 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
256
							}
257
							else
258
							{
259
								echo '<h1>';	
260
								echo '<a href="./" class="spinnable">';
261
							}
262
						?>
263
						JodelBlue <i class="fa fa-refresh fa-1x"></i></a>
264
					</h1>
265
266
					<div id="location_mobile" class="hidden-sm-up">
267
						<form method="get">
268
							<input type="text" id="city_mobile" name="city" placeholder="<?php if(isset($newPositionStatus)) echo $newPositionStatus; ?>" required>
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 142 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
269
270
							<input type="submit" id="submit_mobile" class="fa" value="&#xf0ac;" />
271
						</form>
272
					</div>
273
				</div>
274
			</nav>
275
		</header>
276
		
277
		<div class="mainContent container">		
278
			<div class="content row">
279
				<article class="topContent col-sm-8">
280
281
					<content id="posts">
282
						<?php
283
							for($i = 0; $i<$loops; $i++)
284
							{
285
								if(array_key_exists($i, $posts) && array_key_exists('post_id', $posts[$i]) && isset($posts[$i]['post_id']))
286
								{
287
									$lastPostId = $posts[$i]['post_id'];
288
289
									jodelToHtml($posts[$i], $view, $isDetailedView);
290
								}
291
							} ?>
292
293
					</content>
294
					
295
					<?php if(!isset($_GET['postID']) && !isset($_GET['getPostDetails'])) { ?>
296
						<p id="loading">
297
							Loading…
298
						</p>
299
					<?php } ?>
300
				</article>
301
			
302
				<aside class="topSidebar col-sm-4 sidebar-outer">
303
					<div class="fixed">
304
						<article>
305
							<div>
306
								<h2>Position</h2>
307
								<form method="get">
308
									<input type="text" id="city" name="city" placeholder="<?php if(isset($newPositionStatus)) echo $newPositionStatus; ?>" required>
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 137 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
309
310
									<input type="submit" value="Set Location" /> 
311
								</form>
312
							</div>
313
						</article>
314
315
						<article>
316
							<div>
317
								<h2>Karma</h2>
318
								<?php echo getKarma($accessToken_forId1); ?>
319
							</div>
320
						</article>
321
322
						<article>
323
							<div>
324
								<?php if(isset($_GET['postID']) && isset($_GET['getPostDetails'])) { ?>
325
								<h2>Comment on Jodel</h2>
326
								<form method="POST">				
327
										<input type="hidden" name="ancestor" value="<?php echo htmlspecialchars($_GET['postID']);?>" />
328
										<textarea id="message" name="message" placeholder="Send a comment on a Jodel to all students within 10km" required></textarea> 
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 137 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
329
									<br />
330
									<input type="submit" value="SEND" /> 
331
								</form>
332
									<?php } else { ?>
333
								<h2>New Jodel</h2>
334
								<form method="POST">
335
									<textarea id="message" name="message" placeholder="Send a Jodel to all students within 10km" required></textarea> 
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 123 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
336
									<br />
337
									<select id="postColorPicker" name="color">
338
										<option value="06A3CB">Blue</option>
339
										<option value="8ABDB0">Teal</option>
340
										<option value="9EC41C">Green</option>
341
										<option value="FFBA00">Yellow</option>
342
										<option value="DD5F5F">Red</option>
343
										<option value="FF9908">Orange</option>
344
									</select> 
345
									<br />
346
									<input type="submit" value="SEND" /> 
347
								</form>
348
								<?php } ?>
349
							</div>
350
						</article>
351
							
352
						<article>
353
							<div>
354
								<h2>Login</h2>
355
							</div>
356
						</article>
357
					</div>
358
				</aside>
359
			</div>
360
			<div id="sortJodelBy" class="row">
361
				<div class="col-xs-12">
362
					<div class="row">
363
						<div class="col-xs-3">
364
							<a href="index.php" <?php if($view=='time') echo 'class="active"';?>><i class="fa fa-clock-o fa-3x"></i></a>
365
						</div>
366
						<div class="col-xs-3">
367
							<a href="index.php?view=comment" <?php if($view=='comment') echo 'class="active"';?>><i class="fa fa-commenting-o fa-3x"></i></a>
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 136 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
368
						</div>
369
						<div class="col-xs-3">
370
							<a href="index.php?view=upVote" <?php if($view=='upVote') echo 'class="active"';?>><i class="fa fa-angle-up fa-3x"></i></a>
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 130 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
371
						</div>
372
						<div class="col-xs-3">
373
							<nav>
374
								<a href="./about-us.html">about us</a>
375
							</nav>
376
						</div>
377
					</div>
378
				</div>	
379
			</div>
380
		</div>
381
		
382
		
383
		<!-- jQuery, Tether, Bootstrap JS and own-->
384
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7" crossorigin="anonymous"></script>
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 198 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
385
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js" integrity="sha384-XTs3FgkjiBgo8qjEjBk0tGmf3wPrWtA6coPfQDfFEY8AnYJwjalXCiosYRBIBZX8" crossorigin="anonymous"></script>
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 205 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
386
    	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js" integrity="sha384-BLiI7JTZm+JWlgKa0M0kGRpJbF2J8q+qreVrKBC47e3K6BW78kGLrCkeRX6I9RoK" crossorigin="anonymous"></script>
0 ignored issues
show
This line exceeds maximum limit of 120 characters; contains 212 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
387
    	<script src="js/jQueryEmoji.js"></script>
388
389
		<script>
390
			//BackButton
391
			function goBack()
392
			{
393
				window.history.back();
394
			}
395
396
			$(document).ready(function()
397
			{
398
				//Transform UTF-8 Emoji to img
399
				$('.jodel > content').Emoji();
400
401
				$('a').on('click', function(){
402
				    $('a').removeClass('selected');
403
				    $(this).addClass('selected');
404
				});
405
406
				function scrollToAnchor(aid){
407
				    var aTag = $("article[id='"+ aid +"']");
408
				    $('html,body').animate({scrollTop: aTag.offset().top-90},'slow');
409
				}
410
411
				<?php if(!isset($_GET['postID']) && !isset($_GET['getPostDetails'])) { ?>
412
413
				
414
415
416
417
				var win = $(window);
418
				var lastPostId = "<?php echo $lastPostId; ?>";
419
				var view = "<?php echo $view; ?>"
420
				var old_lastPostId = "";
421
				var morePostsAvailable = true;
422
423
				if(window.location.hash)
424
				{
425
					var hash = window.location.hash.slice(1);
426
427
					if(!$("article[id='"+ hash +"']").length)
428
					{
429
						for (var i = 5; i >= 0; i--)
430
						{
431
							if(!$("article[id='"+ hash +"']").length)
432
							{
433
								$.ajax({
434
									url: 'get-posts-ajax.php?lastPostId=' + lastPostId + '&view=' + view,
435
									dataType: 'html',
436
									async: false,
437
									success: function(html) {
438
										var div = document.createElement('div');
439
										div.innerHTML = html;
440
										var elements = div.childNodes;
441
										old_lastPostId = lastPostId;
442
										lastPostId = elements[3].textContent;
443
										lastPostId = lastPostId.replace(/\s+/g, '');
444
										//alert('Neu: ' + lastPostId + " Alt: " + old_lastPostId);
445
										if(lastPostId == old_lastPostId) {
446
											
447
											//morePostsAvailable = false;
448
										}
449
										else {
450
											//alert(elements[3].textContent);
451
											$('#posts').append(elements[1].innerHTML);
452
											$('#posts').hide().show(0);
453
										}
454
										$('#loading').hide();
455
									}
456
								});
457
458
								$('.jodel > content').Emoji();
459
							}
460
							
461
						}
462
						scrollToAnchor(hash);
463
464
					}						
465
				}
466
467
				// Each time the user scrolls
468
				win.scroll(function() {
469
470
471
					// End of the document reached?
472
					if ($(window).scrollTop() + $(window).height() > $(document).height() - 100 && morePostsAvailable)
473
					{
474
						$('#loading').show();
475
476
						$.ajax({
477
							url: 'get-posts-ajax.php?lastPostId=' + lastPostId + '&view=' + view,
478
							dataType: 'html',
479
							async: false,
480
							success: function(html) {
481
								var div = document.createElement('div');
482
								div.innerHTML = html;
483
								var elements = div.childNodes;
484
								old_lastPostId = lastPostId;
485
								lastPostId = elements[3].textContent;
486
								lastPostId = lastPostId.replace(/\s+/g, '');
487
								//alert('Neu: ' + lastPostId + " Alt: " + old_lastPostId);
488
								if(lastPostId == old_lastPostId)
489
								{
490
									
491
									//morePostsAvailable = false;
492
								}
493
								else
494
								{
495
									//alert(elements[3].textContent);
496
									$('#posts').append(elements[1].innerHTML);
497
								}
498
								$('#loading').hide();
499
							}
500
						});
501
502
						$('.jodel > content').Emoji();
503
					}
504
				});
505
			<?php } ?>
506
			});	
507
508
		</script>
509
510
		<?php  
511
			if(is_file('./piwik-script.html'))
512
			{
513
			    require_once('./piwik-script.html');
514
			}
515
		?>
516
517
	</body>
518
</html>
519
520