<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def playlist_song_move( 		self, 		playlist_song, 		*, 		after=None, 		before=None, 		index=None, 		position=None 	):
 		"""Move a song in a playlist. 		Note: 			* Provide no optional arguments to move to end. 			* Provide playlist song dicts for ``after`` and/or ``before``. 			* Provide a zero-based ``index``. 			* Provide a one-based ``position``. 			Songs are inserted *at* given index or position. 			It's also possible to move to the end by using 			``len(songs)`` for index or ``len(songs) + 1`` for position. 		Parameters: 			playlist_song (dict):
 A playlist song dict. 			after (dict, Optional):
 A playlist song dict ``songs`` will follow. 			before (dict, Optional):
 A playlist song dict ``songs`` will precede. 			index (int, Optional):
 The zero-based index position to insert ``song``. 			position (int, Optional):
 The one-based position to insert ``song``. 		Returns: 			dict: Playlist dict including songs. 		"""


		playlist_songs = self.playlist(
			playlist_song['playlistId'],
			include_songs=True
		)['tracks']

		prev, next_ = get_ple_prev_next(
			playlist_songs,
			after=after,
			before=before,
			index=index,
			position=position
		)

		mutation = mc_calls.PlaylistEntriesBatch.update(
			playlist_song,
			preceding_entry_id=prev.get('id'),
			following_entry_id=next_.get('id')
		)
		self._call(mc_calls.PlaylistEntriesBatch, mutation)

		return self.playlist(playlist_song['playlistId'], include_songs=True)