Completed
Push — develop ( d18ace...74dfae )
by Gennady
31:26 queued 17:39
created
includes/extensions/delete-entry/class-delete-entry.php 1 patch
Spacing   +72 added lines, -72 removed lines patch added patch discarded remove patch
@@ -42,12 +42,12 @@  discard block
 block discarded – undo
42 42
 
43 43
 		add_action( 'wp', array( $this, 'process_delete' ), 10000 );
44 44
 
45
-		add_filter( 'gravityview_entry_default_fields', array( $this, 'add_default_field'), 10, 3 );
45
+		add_filter( 'gravityview_entry_default_fields', array( $this, 'add_default_field' ), 10, 3 );
46 46
 
47 47
 		add_action( 'gravityview_before', array( $this, 'display_message' ) );
48 48
 
49 49
 		// For the Delete Entry Link, you don't want visible to all users.
50
-		add_filter( 'gravityview_field_visibility_caps', array( $this, 'modify_visibility_caps'), 10, 5 );
50
+		add_filter( 'gravityview_field_visibility_caps', array( $this, 'modify_visibility_caps' ), 10, 5 );
51 51
 
52 52
 		// Modify the field options based on the name of the field type
53 53
 		add_filter( 'gravityview_template_delete_link_options', array( $this, 'delete_link_field_options' ), 10, 5 );
@@ -55,10 +55,10 @@  discard block
 block discarded – undo
55 55
 		// add template path to check for field
56 56
 		add_filter( 'gravityview_template_paths', array( $this, 'add_template_path' ) );
57 57
 
58
-		add_action( 'gravityview/edit-entry/publishing-action/after', array( $this, 'add_delete_button'), 10, 4 );
58
+		add_action( 'gravityview/edit-entry/publishing-action/after', array( $this, 'add_delete_button' ), 10, 4 );
59 59
 
60
-		add_action ( 'gravityview/delete-entry/deleted', array( $this, 'process_connected_posts' ), 10, 2 );
61
-		add_action ( 'gravityview/delete-entry/trashed', array( $this, 'process_connected_posts' ), 10, 2 );
60
+		add_action( 'gravityview/delete-entry/deleted', array( $this, 'process_connected_posts' ), 10, 2 );
61
+		add_action( 'gravityview/delete-entry/trashed', array( $this, 'process_connected_posts' ), 10, 2 );
62 62
 	}
63 63
 
64 64
 	/**
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
 	 */
70 70
 	static function getInstance() {
71 71
 
72
-		if( empty( self::$instance ) ) {
72
+		if ( empty( self::$instance ) ) {
73 73
 			self::$instance = new self;
74 74
 		}
75 75
 
@@ -105,20 +105,20 @@  discard block
 block discarded – undo
105 105
 	function delete_link_field_options( $field_options, $template_id, $field_id, $context, $input_type ) {
106 106
 
107 107
 		// Always a link, never a filter
108
-		unset( $field_options['show_as_link'], $field_options['search_filter'] );
108
+		unset( $field_options[ 'show_as_link' ], $field_options[ 'search_filter' ] );
109 109
 
110 110
 		// Delete Entry link should only appear to visitors capable of editing entries
111
-		unset( $field_options['only_loggedin'], $field_options['only_loggedin_cap'] );
111
+		unset( $field_options[ 'only_loggedin' ], $field_options[ 'only_loggedin_cap' ] );
112 112
 
113
-		$add_option['delete_link'] = array(
113
+		$add_option[ 'delete_link' ] = array(
114 114
 			'type' => 'text',
115 115
 			'label' => __( 'Delete Link Text', 'gravityview' ),
116 116
 			'desc' => NULL,
117
-			'value' => __('Delete Entry', 'gravityview'),
117
+			'value' => __( 'Delete Entry', 'gravityview' ),
118 118
 			'merge_tags' => true,
119 119
 		);
120 120
 
121
-		$field_options['allow_edit_cap'] = array(
121
+		$field_options[ 'allow_edit_cap' ] = array(
122 122
 			'type' => 'select',
123 123
 			'label' => __( 'Allow the following users to delete the entry:', 'gravityview' ),
124 124
 			'choices' => GravityView_Render_Settings::get_cap_choices( $template_id, $field_id, $context, $input_type ),
@@ -142,8 +142,8 @@  discard block
 block discarded – undo
142 142
 	 */
143 143
 	function add_default_field( $entry_default_fields, $form = array(), $zone = '' ) {
144 144
 
145
-		if( 'edit' !== $zone ) {
146
-			$entry_default_fields['delete_link'] = array(
145
+		if ( 'edit' !== $zone ) {
146
+			$entry_default_fields[ 'delete_link' ] = array(
147 147
 				'label' => __( 'Delete Entry', 'gravityview' ),
148 148
 				'type'  => 'delete_link',
149 149
 				'desc'  => __( 'A link to delete the entry. Respects the Delete Entry permissions.', 'gravityview' ),
@@ -160,7 +160,7 @@  discard block
 block discarded – undo
160 160
 	 */
161 161
 	function add_available_field( $available_fields = array() ) {
162 162
 
163
-		$available_fields['delete_link'] = array(
163
+		$available_fields[ 'delete_link' ] = array(
164 164
 			'label_text' => __( 'Delete Entry', 'gravityview' ),
165 165
 			'field_id' => 'delete_link',
166 166
 			'label_type' => 'field',
@@ -188,12 +188,12 @@  discard block
 block discarded – undo
188 188
 		$caps = $visibility_caps;
189 189
 
190 190
 		// If we're configuring fields in the edit context, we want a limited selection
191
-		if( $field_id === 'delete_link' ) {
191
+		if ( $field_id === 'delete_link' ) {
192 192
 
193 193
 			// Remove other built-in caps.
194
-			unset( $caps['publish_posts'], $caps['gravityforms_view_entries'], $caps['delete_others_posts'] );
194
+			unset( $caps[ 'publish_posts' ], $caps[ 'gravityforms_view_entries' ], $caps[ 'delete_others_posts' ] );
195 195
 
196
-			$caps['read'] = _x('Entry Creator', 'User capability', 'gravityview');
196
+			$caps[ 'read' ] = _x( 'Entry Creator', 'User capability', 'gravityview' );
197 197
 		}
198 198
 
199 199
 		return $caps;
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
 	 * @param [type] $entry [description]
207 207
 	 */
208 208
 	function set_entry( $entry = null ) {
209
-		$this->entry = empty( $entry ) ? GravityView_View::getInstance()->entries[0] : $entry;
209
+		$this->entry = empty( $entry ) ? GravityView_View::getInstance()->entries[ 0 ] : $entry;
210 210
 	}
211 211
 
212 212
 	/**
@@ -239,7 +239,7 @@  discard block
 block discarded – undo
239 239
 
240 240
 		self::getInstance()->set_entry( $entry );
241 241
 
242
-        $base = GravityView_API::directory_link( $post_id ? : $view_id, true );
242
+        $base = GravityView_API::directory_link( $post_id ?: $view_id, true );
243 243
 
244 244
 		if ( empty( $base ) ) {
245 245
 			gravityview()->log->error( 'Post ID does not exist: {post_id}', array( 'post_id' => $post_id ) );
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
 		}
248 248
 
249 249
 		// Use the slug instead of the ID for consistent security
250
-		$entry_slug = GravityView_API::get_entry_slug( $entry['id'], $entry );
250
+		$entry_slug = GravityView_API::get_entry_slug( $entry[ 'id' ], $entry );
251 251
 
252 252
 		$actionurl = add_query_arg( array(
253 253
 			'action'	=> 'delete',
@@ -256,7 +256,7 @@  discard block
 block discarded – undo
256 256
             'view_id' => $view_id,
257 257
 		), $base );
258 258
 
259
-		$url = wp_nonce_url( $actionurl, 'delete_'.$entry_slug, 'delete' );
259
+		$url = wp_nonce_url( $actionurl, 'delete_' . $entry_slug, 'delete' );
260 260
 
261 261
 		return $url;
262 262
 	}
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
 	public function add_delete_button( $form = array(), $entry = array(), $view_id = null, $post_id = null ) {
279 279
 
280 280
 		// Only show the link to those who are allowed to see it.
281
-		if( !self::check_user_cap_delete_entry( $entry, array(), $view_id ) ) {
281
+		if ( ! self::check_user_cap_delete_entry( $entry, array(), $view_id ) ) {
282 282
 			return;
283 283
 		}
284 284
 
@@ -289,13 +289,13 @@  discard block
 block discarded – undo
289 289
 		$show_delete_button = apply_filters( 'gravityview/delete-entry/show-delete-button', true );
290 290
 
291 291
 		// If the button is hidden by the filter, don't show.
292
-		if( !$show_delete_button ) {
292
+		if ( ! $show_delete_button ) {
293 293
 			return;
294 294
 		}
295 295
 
296 296
 		$attributes = array(
297 297
 			'class' => 'btn btn-sm button button-small alignright pull-right btn-danger gv-button-delete',
298
-			'tabindex' => ( GFCommon::$tab_index ++ ),
298
+			'tabindex' => ( GFCommon::$tab_index++ ),
299 299
 			'onclick' => self::get_confirm_dialog(),
300 300
 		);
301 301
 
@@ -319,27 +319,27 @@  discard block
 block discarded – undo
319 319
 	function process_delete() {
320 320
 
321 321
 		// If the form is submitted
322
-		if( isset( $_GET['action'] ) && 'delete' === $_GET['action'] && isset( $_GET['entry_id'] ) ) {
322
+		if ( isset( $_GET[ 'action' ] ) && 'delete' === $_GET[ 'action' ] && isset( $_GET[ 'entry_id' ] ) ) {
323 323
 
324 324
 			// Make sure it's a GravityView request
325
-			$valid_nonce_key = wp_verify_nonce( $_GET['delete'], self::get_nonce_key( $_GET['entry_id'] ) );
325
+			$valid_nonce_key = wp_verify_nonce( $_GET[ 'delete' ], self::get_nonce_key( $_GET[ 'entry_id' ] ) );
326 326
 
327
-			if( ! $valid_nonce_key ) {
327
+			if ( ! $valid_nonce_key ) {
328 328
 				gravityview()->log->debug( 'Delete entry not processed: nonce validation failed.' );
329 329
 				return;
330 330
 			}
331 331
 
332 332
 			// Get the entry slug
333
-			$entry_slug = esc_attr( $_GET['entry_id'] );
333
+			$entry_slug = esc_attr( $_GET[ 'entry_id' ] );
334 334
 
335 335
 			// See if there's an entry there
336 336
 			$entry = gravityview_get_entry( $entry_slug, true, false );
337 337
 
338
-			if( $entry ) {
338
+			if ( $entry ) {
339 339
 
340 340
 				$has_permission = $this->user_can_delete_entry( $entry );
341 341
 
342
-				if( is_wp_error( $has_permission ) ) {
342
+				if ( is_wp_error( $has_permission ) ) {
343 343
 
344 344
 					$messages = array(
345 345
 						'message' => urlencode( $has_permission->get_error_message() ),
@@ -351,7 +351,7 @@  discard block
 block discarded – undo
351 351
 					// Delete the entry
352 352
 					$delete_response = $this->delete_or_trash_entry( $entry );
353 353
 
354
-					if( is_wp_error( $delete_response ) ) {
354
+					if ( is_wp_error( $delete_response ) ) {
355 355
 
356 356
 						$messages = array(
357 357
 							'message' => urlencode( $delete_response->get_error_message() ),
@@ -373,7 +373,7 @@  discard block
 block discarded – undo
373 373
 				gravityview()->log->debug( 'Delete entry failed: there was no entry with the entry slug {entry_slug}', array( 'entry_slug' => $entry_slug ) );
374 374
 
375 375
 				$messages = array(
376
-					'message' => urlencode( __('The entry does not exist.', 'gravityview') ),
376
+					'message' => urlencode( __( 'The entry does not exist.', 'gravityview' ) ),
377 377
 					'status' => 'error',
378 378
 				);
379 379
 			}
@@ -413,18 +413,18 @@  discard block
 block discarded – undo
413 413
 	 */
414 414
 	private function delete_or_trash_entry( $entry ) {
415 415
 
416
-		$entry_id = $entry['id'];
416
+		$entry_id = $entry[ 'id' ];
417 417
 		
418 418
 		$mode = $this->get_delete_mode();
419 419
 
420
-		if( 'delete' === $mode ) {
420
+		if ( 'delete' === $mode ) {
421 421
 
422 422
 			gravityview()->log->debug( 'Starting delete entry: {entry_id}', array( 'entry_id' => $entry_id ) );
423 423
 
424 424
 			// Delete the entry
425 425
 			$delete_response = GFAPI::delete_entry( $entry_id );
426 426
 
427
-			if( ! is_wp_error( $delete_response ) ) {
427
+			if ( ! is_wp_error( $delete_response ) ) {
428 428
 				$delete_response = 'deleted';
429 429
 
430 430
 				/**
@@ -445,8 +445,8 @@  discard block
 block discarded – undo
445 445
 			$trashed = GFAPI::update_entry_property( $entry_id, 'status', 'trash' );
446 446
 			new GravityView_Cache;
447 447
 
448
-			if( ! $trashed ) {
449
-				$delete_response = new WP_Error( 'trash_entry_failed', __('Moving the entry to the trash failed.', 'gravityview' ) );
448
+			if ( ! $trashed ) {
449
+				$delete_response = new WP_Error( 'trash_entry_failed', __( 'Moving the entry to the trash failed.', 'gravityview' ) );
450 450
 			} else {
451 451
 
452 452
 				/**
@@ -477,7 +477,7 @@  discard block
 block discarded – undo
477 477
 	public function process_connected_posts( $entry_id = 0, $entry = array() ) {
478 478
 
479 479
 		// The entry had no connected post
480
-		if( empty( $entry['post_id'] ) ) {
480
+		if ( empty( $entry[ 'post_id' ] ) ) {
481 481
 			return;
482 482
 		}
483 483
 
@@ -488,19 +488,19 @@  discard block
 block discarded – undo
488 488
 		 */
489 489
 		$delete_post = apply_filters( 'gravityview/delete-entry/delete-connected-post', true );
490 490
 		
491
-		if( false === $delete_post ) {
491
+		if ( false === $delete_post ) {
492 492
 			return;
493 493
 		}
494 494
 
495 495
 		$action = current_action();
496 496
 
497
-		if( 'gravityview/delete-entry/deleted' === $action ) {
498
-			$result = wp_delete_post( $entry['post_id'], true );
497
+		if ( 'gravityview/delete-entry/deleted' === $action ) {
498
+			$result = wp_delete_post( $entry[ 'post_id' ], true );
499 499
 		} else {
500
-			$result = wp_trash_post( $entry['post_id'] );
500
+			$result = wp_trash_post( $entry[ 'post_id' ] );
501 501
 		}
502 502
 
503
-		if( false === $result ) {
503
+		if ( false === $result ) {
504 504
 			gravityview()->log->error( '(called by {action}): Error processing the Post connected to the entry.', array( 'action' => $action, 'data' => $entry ) );
505 505
 		} else {
506 506
 			gravityview()->log->debug( '(called by {action}): Successfully processed Post connected to the entry.', array( 'action' => $action, 'data' => $entry ) );
@@ -516,13 +516,13 @@  discard block
 block discarded – undo
516 516
 	public function verify_nonce() {
517 517
 
518 518
 		// No delete entry request was made
519
-		if( empty( $_GET['entry_id'] ) || empty( $_GET['delete'] ) ) {
519
+		if ( empty( $_GET[ 'entry_id' ] ) || empty( $_GET[ 'delete' ] ) ) {
520 520
 			return false;
521 521
 		}
522 522
 
523
-		$nonce_key = self::get_nonce_key( $_GET['entry_id'] );
523
+		$nonce_key = self::get_nonce_key( $_GET[ 'entry_id' ] );
524 524
 
525
-		$valid = wp_verify_nonce( $_GET['delete'], $nonce_key );
525
+		$valid = wp_verify_nonce( $_GET[ 'delete' ], $nonce_key );
526 526
 
527 527
 		/**
528 528
 		 * @filter `gravityview/delete-entry/verify_nonce` Override Delete Entry nonce validation. Return true to declare nonce valid.
@@ -544,7 +544,7 @@  discard block
 block discarded – undo
544 544
 	 */
545 545
 	public static function get_confirm_dialog() {
546 546
 
547
-		$confirm = __('Are you sure you want to delete this entry? This cannot be undone.', 'gravityview');
547
+		$confirm = __( 'Are you sure you want to delete this entry? This cannot be undone.', 'gravityview' );
548 548
 
549 549
 		/**
550 550
 		 * @filter `gravityview/delete-entry/confirm-text` Modify the Delete Entry Javascript confirmation text
@@ -552,7 +552,7 @@  discard block
 block discarded – undo
552 552
 		 */
553 553
 		$confirm = apply_filters( 'gravityview/delete-entry/confirm-text', $confirm );
554 554
 
555
-		return 'return window.confirm(\''. esc_js( $confirm ) .'\');';
555
+		return 'return window.confirm(\'' . esc_js( $confirm ) . '\');';
556 556
 	}
557 557
 
558 558
 	/**
@@ -570,16 +570,16 @@  discard block
 block discarded – undo
570 570
 
571 571
 		$error = NULL;
572 572
 
573
-		if( ! $this->verify_nonce() ) {
574
-			$error = __( 'The link to delete this entry is not valid; it may have expired.', 'gravityview');
573
+		if ( ! $this->verify_nonce() ) {
574
+			$error = __( 'The link to delete this entry is not valid; it may have expired.', 'gravityview' );
575 575
 		}
576 576
 
577
-		if( ! self::check_user_cap_delete_entry( $entry, array(), $view_id ) ) {
578
-			$error = __( 'You do not have permission to delete this entry.', 'gravityview');
577
+		if ( ! self::check_user_cap_delete_entry( $entry, array(), $view_id ) ) {
578
+			$error = __( 'You do not have permission to delete this entry.', 'gravityview' );
579 579
 		}
580 580
 
581
-		if( $entry['status'] === 'trash' ) {
582
-			if( 'trash' === $this->get_delete_mode() ) {
581
+		if ( $entry[ 'status' ] === 'trash' ) {
582
+			if ( 'trash' === $this->get_delete_mode() ) {
583 583
 				$error = __( 'The entry is already in the trash.', 'gravityview' );
584 584
 			} else {
585 585
 				$error = __( 'You cannot delete the entry; it is already in the trash.', 'gravityview' );
@@ -587,7 +587,7 @@  discard block
 block discarded – undo
587 587
 		}
588 588
 
589 589
 		// No errors; everything's fine here!
590
-		if( empty( $error ) ) {
590
+		if ( empty( $error ) ) {
591 591
 			return true;
592 592
 		}
593 593
 
@@ -616,10 +616,10 @@  discard block
 block discarded – undo
616 616
 
617 617
 		$current_user = wp_get_current_user();
618 618
 
619
-		$entry_id = isset( $entry['id'] ) ? $entry['id'] : NULL;
619
+		$entry_id = isset( $entry[ 'id' ] ) ? $entry[ 'id' ] : NULL;
620 620
 
621 621
 		// Or if they can delete any entries (as defined in Gravity Forms), we're good.
622
-		if( GVCommon::has_cap( array( 'gravityforms_delete_entries', 'gravityview_delete_others_entries' ), $entry_id ) ) {
622
+		if ( GVCommon::has_cap( array( 'gravityforms_delete_entries', 'gravityview_delete_others_entries' ), $entry_id ) ) {
623 623
 
624 624
 			gravityview()->log->debug( 'Current user has `gravityforms_delete_entries` or `gravityview_delete_others_entries` capability.' );
625 625
 
@@ -628,20 +628,20 @@  discard block
 block discarded – undo
628 628
 
629 629
 
630 630
 		// If field options are passed, check if current user can view the link
631
-		if( !empty( $field ) ) {
631
+		if ( ! empty( $field ) ) {
632 632
 
633 633
 			// If capability is not defined, something is not right!
634
-			if( empty( $field['allow_edit_cap'] ) ) {
634
+			if ( empty( $field[ 'allow_edit_cap' ] ) ) {
635 635
 
636 636
 				gravityview()->log->error( 'Cannot read delete entry field caps', array( 'data' => $field ) );
637 637
 
638 638
 				return false;
639 639
 			}
640 640
 
641
-			if( GVCommon::has_cap( $field['allow_edit_cap'] ) ) {
641
+			if ( GVCommon::has_cap( $field[ 'allow_edit_cap' ] ) ) {
642 642
 
643 643
 				// Do not return true if cap is read, as we need to check if the current user created the entry
644
-				if( $field['allow_edit_cap'] !== 'read' ) {
644
+				if ( $field[ 'allow_edit_cap' ] !== 'read' ) {
645 645
 					return true;
646 646
 				}
647 647
 
@@ -654,15 +654,15 @@  discard block
 block discarded – undo
654 654
 
655 655
 		}
656 656
 
657
-		if( !isset( $entry['created_by'] ) ) {
657
+		if ( ! isset( $entry[ 'created_by' ] ) ) {
658 658
 
659
-			gravityview()->log->error( 'Entry `created_by` doesn\'t exist.');
659
+			gravityview()->log->error( 'Entry `created_by` doesn\'t exist.' );
660 660
 
661 661
 			return false;
662 662
 		}
663 663
 
664 664
 		// Only checks user_delete view option if view is already set
665
-		if( $view_id ) {
665
+		if ( $view_id ) {
666 666
 
667 667
 			if ( ! $view = \GV\View::by_id( $view_id ) ) {
668 668
 				return false;
@@ -679,7 +679,7 @@  discard block
 block discarded – undo
679 679
 		}
680 680
 
681 681
 		// If the logged-in user is the same as the user who created the entry, we're good.
682
-		if( is_user_logged_in() && intval( $current_user->ID ) === intval( $entry['created_by'] ) ) {
682
+		if ( is_user_logged_in() && intval( $current_user->ID ) === intval( $entry[ 'created_by' ] ) ) {
683 683
 
684 684
 			gravityview()->log->debug( 'User {user_id} created the entry.', array( 'user_id' => $current_user->ID ) );
685 685
 
@@ -704,16 +704,16 @@  discard block
 block discarded – undo
704 704
 	 */
705 705
 	public function display_message( $current_view_id = 0 ) {
706 706
 
707
-		if( empty( $_GET['status'] ) || ! self::verify_nonce() ) {
707
+		if ( empty( $_GET[ 'status' ] ) || ! self::verify_nonce() ) {
708 708
 			return;
709 709
 		}
710 710
 
711 711
 		// Entry wasn't deleted from current View
712
-		if( isset( $_GET['view_id'] ) && intval( $_GET['view_id'] ) !== intval( $current_view_id ) ) {
712
+		if ( isset( $_GET[ 'view_id' ] ) && intval( $_GET[ 'view_id' ] ) !== intval( $current_view_id ) ) {
713 713
 			return;
714 714
 		}
715 715
 
716
-		$status = esc_attr( $_GET['status'] );
716
+		$status = esc_attr( $_GET[ 'status' ] );
717 717
 		$message_from_url = \GV\Utils::_GET( 'message' );
718 718
 		$message_from_url = rawurldecode( stripslashes_deep( $message_from_url ) );
719 719
 		$class = '';
@@ -721,14 +721,14 @@  discard block
 block discarded – undo
721 721
 		switch ( $status ) {
722 722
 			case 'error':
723 723
 				$class = ' gv-error error';
724
-				$error_message = __('There was an error deleting the entry: %s', 'gravityview');
724
+				$error_message = __( 'There was an error deleting the entry: %s', 'gravityview' );
725 725
 				$message = sprintf( $error_message, $message_from_url );
726 726
 				break;
727 727
 			case 'trashed':
728
-				$message = __('The entry was successfully moved to the trash.', 'gravityview');
728
+				$message = __( 'The entry was successfully moved to the trash.', 'gravityview' );
729 729
 				break;
730 730
 			default:
731
-				$message = __('The entry was successfully deleted.', 'gravityview');
731
+				$message = __( 'The entry was successfully deleted.', 'gravityview' );
732 732
 				break;
733 733
 		}
734 734
 
@@ -742,7 +742,7 @@  discard block
 block discarded – undo
742 742
 		$message = apply_filters( 'gravityview/delete-entry/message', esc_attr( $message ), $status, $message_from_url );
743 743
 
744 744
 		// DISPLAY ERROR/SUCCESS MESSAGE
745
-		echo '<div class="gv-notice' . esc_attr( $class ) .'">'. $message .'</div>';
745
+		echo '<div class="gv-notice' . esc_attr( $class ) . '">' . $message . '</div>';
746 746
 	}
747 747
 
748 748
 
Please login to merge, or discard this patch.