function wsl_process_login_new_users_gateway($provider, $redirect_to, $hybridauth_user_profile)
{
    // HOOKABLE:
    do_action("wsl_process_login_new_users_gateway_start", $provider, $redirect_to, $hybridauth_user_profile);
    $assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
    // remove wsl widget
    remove_action('register_form', 'wsl_render_auth_widget_in_wp_register_form');
    $hybridauth_user_email = sanitize_email($hybridauth_user_profile->email);
    $hybridauth_user_login = sanitize_user($hybridauth_user_profile->displayName, true);
    $hybridauth_user_avatar = $hybridauth_user_profile->photoURL;
    $hybridauth_user_website = $hybridauth_user_profile->webSiteURL;
    $hybridauth_user_link = $hybridauth_user_profile->profileURL;
    $hybridauth_user_login = trim(str_replace(array(' ', '.'), '_', $hybridauth_user_login));
    $hybridauth_user_login = trim(str_replace('__', '_', $hybridauth_user_login));
    $requested_user_email = isset($_REQUEST["user_email"]) ? trim($_REQUEST["user_email"]) : $hybridauth_user_email;
    $requested_user_login = isset($_REQUEST["user_login"]) ? trim($_REQUEST["user_login"]) : $hybridauth_user_login;
    $requested_user_email = apply_filters('wsl_new_users_gateway_alter_requested_email', $requested_user_email);
    $requested_user_login = apply_filters('wsl_new_users_gateway_alter_requested_login', $requested_user_login);
    $user_id = 0;
    $shall_pass = false;
    $bouncer_account_linking = false;
    $account_linking_errors = array();
    $bouncer_profile_completion = false;
    $profile_completion_errors = array();
    $linking_enabled = get_option('wsl_settings_bouncer_accounts_linking_enabled');
    // $linking_enabled = 2; // overide linking_enabled
    if (isset($_REQUEST["bouncer_account_linking"])) {
        if ($linking_enabled == 2) {
            return wsl_process_login_render_notice_page(_wsl__("Not tonight.", 'wordpress-social-login'));
        }
        $bouncer_account_linking = true;
        $username = isset($_REQUEST["user_login"]) ? trim($_REQUEST["user_login"]) : '';
        $password = isset($_REQUEST["user_password"]) ? trim($_REQUEST["user_password"]) : '';
        # http://codex.wordpress.org/Function_Reference/wp_authenticate
        $user = wp_authenticate($username, $password);
        // WP_Error object?
        if (is_wp_error($user)) {
            // we give no useful hint.
            $account_linking_errors[] = sprintf(_wsl__('<strong>ERROR</strong>: Invalid username or incorrect password. <a href="%s">Lost your password</a>?', 'wordpress-social-login'), wp_lostpassword_url(home_url()));
        } elseif (is_a($user, 'WP_User')) {
            $user_id = $user->ID;
            $shall_pass = true;
        }
    } elseif (isset($_REQUEST["bouncer_profile_completion"])) {
        $require_email = get_option('wsl_settings_bouncer_profile_completion_require_email');
        $change_username = get_option('wsl_settings_bouncer_profile_completion_change_username');
        $extra_fields = get_option('wsl_settings_bouncer_profile_completion_hook_extra_fields');
        // Bouncer::Profile Completion enabled?
        // > if not enabled we just let the user pass
        if ($require_email == 2 && $change_username == 2 && $extra_fields == 2) {
            $shall_pass = true;
        } else {
            $bouncer_profile_completion = true;
            /**
             * Code based on wpmu_validate_user_signup()
             *
             * Ref: http://codex.wordpress.org/Function_Reference/wpmu_validate_user_signup
             */
            # {{{ validate usermail
            if ($require_email == 1) {
                if (empty($requested_user_email)) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: Please type your e-mail address.', 'wordpress-social-login');
                }
                if (!is_email($requested_user_email)) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: Please enter a valid email address.', 'wordpress-social-login');
                }
                if (wsl_wp_email_exists($requested_user_email)) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: Sorry, that email address is already used!', 'wordpress-social-login');
                }
            }
            # }}} validate usermail
            # {{{ validate username (called login in wsl)
            if ($change_username == 1) {
                $illegal_names = array('www', 'web', 'root', 'admin', 'main', 'invite', 'administrator');
                $illegal_names = apply_filters('wsl_new_users_gateway_alter_illegal_names', $illegal_names);
                if (in_array($requested_user_login, $illegal_names) == true) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: That username is not allowed.', 'wordpress-social-login');
                }
                if (strlen($requested_user_login) < 4) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: Username must be at least 4 characters.', 'wordpress-social-login');
                }
                if (strpos(' ' . $requested_user_login, '_') != false) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: Sorry, usernames may not contain the character &#8220;_&#8221;!', 'wordpress-social-login');
                }
                if (preg_match('/^[0-9]*$/', $requested_user_login)) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: Sorry, usernames must have letters too!', 'wordpress-social-login');
                }
                if (username_exists($requested_user_login)) {
                    $profile_completion_errors[] = _wsl__('<strong>ERROR</strong>: Sorry, that username already exists!', 'wordpress-social-login');
                }
            }
            # }}} validate username
            # ... well, that was a lot of sorries.
            # {{{ extra fields
            if ($extra_fields == 1) {
                $errors = new WP_Error();
                $errors = apply_filters('registration_errors', $errors, $requested_user_login, $requested_user_email);
                if ($errors = $errors->get_error_messages()) {
                    foreach ($errors as $error) {
                        $profile_completion_errors[] = $error;
                    }
                }
            }
            # }}} extra fields
            $profile_completion_errors = apply_filters('wsl_new_users_gateway_alter_profile_completion_errors', $profile_completion_errors);
            // all check?
            if (!$profile_completion_errors) {
                $shall_pass = true;
            }
        }
    }
    if ($shall_pass == false) {
        ?>
 
<!DOCTYPE html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title><?php 
        echo get_bloginfo('name');
        ?>
</title>
		<style type="text/css"> 
			html, body {
				height: 100%;
				margin: 0;
				padding: 0;
			}
			body {
				background: none repeat scroll 0 0 #f1f1f1;
				font-size: 14px;
				color: #444;
				font-family: "Open Sans",sans-serif;
			}
			hr {
				border-color: #eeeeee;
				border-style: none none solid;
				border-width: 0 0 1px;
				margin: 2px 0 0;
			}
			h4 {
				font-size: 14px;
				margin-bottom: 10px;
			}
			#login { 
				width: 616px;
				margin: auto;
				padding: 114px 0 0;
			}
			#login-panel {
				background: none repeat scroll 0 0 #fff;
				box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13);
				margin: 2em auto;
				box-sizing: border-box;
				display: inline-block;
				padding: 70px 0 15px;
				position: relative;
				text-align: center;
				width: 100%;
			}
			#avatar {
				margin-left: -76px;
				top: -80px;
				left: 50%;
				padding: 4px;
				position: absolute;
			}
			#avatar img {
				background: none repeat scroll 0 0 #fff;
				border: 3px solid #f1f1f1;
				border-radius: 75px !important;
				box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13);
				height: 145px;
				width: 145px;
			}
			#welcome {
				height: 55px;
				margin: 15px 20px 35px;
			}
			#idp-icon {
				position: absolute;
				margin-top: 2px;
				margin-left: -19px;
			}
			#login-form{
				margin: 0;
				padding: 0;
			}
			.button-primary {
				background-color: #21759b;
				background-image: linear-gradient(to bottom, #2a95c5, #21759b);
				border-color: #21759b #21759b #1e6a8d;
				border-radius: 3px;
				border-style: solid;
				border-width: 1px;
				box-shadow: 0 1px 0 rgba(120, 200, 230, 0.5) inset;
				box-sizing: border-box;
				color: #fff;
				cursor: pointer;
				display: inline-block;
				float: none;
				font-size: 12px;
				height: 36px;
				line-height: 23px;
				margin: 0;
				padding: 0 10px 1px;
				text-decoration: none;
				text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
				white-space: nowrap;
			}
			button-primary.focus, .button-primary:hover{
				background:#1e8cbe;
				border-color:#0074a2;
				-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.6);
				box-shadow:inset 0 1px 0 rgba(120,200,230,.6);
				color:#fff
			}
			input[type="text"]{
				border: 1px solid #e5e5e5;
				box-shadow: 1px 1px 2px rgba(200, 200, 200, 0.2) inset;
				color: #555;
				font-size: 17px;
				height: 30px;
				line-height: 1;
				margin-bottom: 16px;
				margin-right: 6px;
				margin-top: 2px;
				outline: 0 none;
				padding: 3px;
				width: 100%;
			}
			input[type="text"]:focus{
				border-color:#5b9dd9;
				-webkit-box-shadow:0 0 2px rgba(30,140,190,.8);
				box-shadow:0 0 2px rgba(30,140,190,.8)
			}
			input[type="submit"]{
				float:right;
			}
			label{
				color:#777;
				font-size:14px;
				cursor:pointer;
				vertical-align:middle;
				text-align: left;
			}
			table {
				width:355px;
				margin-left:auto; 
				margin-right:auto;
			}
			#mapping-options {
				width:555px;
			}
			#mapping-authenticate {
				display:none;
			}
			#mapping-complete-info {
				display:none;
			}
			.error {
				display:none;
				background-color: #fff;
				border-left: 4px solid #dd3d36;
				box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
				margin: 0 21px;
				padding: 12px;	
				text-align:left;
			}
			.back-to-options {
				float: left;
				margin: 7px 0px;
			}
			.back-to-home {
				font-size: 12px;
				margin-top: -18px;
			}
			.back-to-home a {
				color: #999;
				text-decoration: none;
			}
			<?php 
        if ($linking_enabled == 2) {
            ?>
					#login {width: 400px;}
					#welcome, #mapping-options, #errors-account-linking, #mapping-complete-info {display: none;}
					#errors-profile-completion, #mapping-complete-info {display: block;}
					<?php 
        } elseif ($bouncer_account_linking) {
            ?>
					#login {width: 400px;}
					#welcome, #mapping-options, #errors-profile-completion, #mapping-complete-info {display: none;}
					#errors-account-linking, #mapping-authenticate {display: block;}
					<?php 
        } elseif ($bouncer_profile_completion) {
            ?>
					#login {width: 400px;}
					#welcome, #mapping-options, #errors-account-linking, #mapping-complete-info {display: none;}
					#errors-profile-completion, #mapping-complete-info {display: block;}
					<?php 
        }
        ?>
		</style>
		<script>
			// good old time
			function toggleEl( el, display )
			{
				if( el = document.getElementById( el ) )
				{
					el.style.display = display;
				}
			}

			function toggleWidth( el, width )
			{
				if( el = document.getElementById( el ) )
				{
					el.style.width = width;
				}
			}

			function display_mapping_options()
			{
				toggleWidth( 'login', '616px' );

				toggleEl( 'welcome'        , 'block' );
				toggleEl( 'mapping-options', 'block' );
				
				toggleEl( 'errors-profile-completion', 'none' );
				toggleEl( 'mapping-authenticate'     , 'none' );

				toggleEl( 'errors-account-linking', 'none' );
				toggleEl( 'mapping-complete-info' , 'none' );
			}

			function display_mapping_authenticate()
			{
				toggleWidth( 'login', '400px' );

				toggleEl( 'welcome'        , 'none' );
				toggleEl( 'mapping-options', 'none' );

				toggleEl( 'errors-account-linking', 'block' ); 
				toggleEl( 'mapping-authenticate'  , 'block' );

				toggleEl( 'errors-profile-completion', 'none' );
				toggleEl( 'mapping-complete-info'    ,'none' );
			}

			function display_mapping_complete_info()
			{
				toggleWidth( 'login', '400px' );

				toggleEl( 'welcome'        , 'none' );
				toggleEl( 'mapping-options', 'none' );

				toggleEl( 'errors-account-linking', 'none' );
				toggleEl( 'mapping-authenticate'  , 'none' );

				toggleEl( 'errors-profile-completion', 'block' );
				toggleEl( 'mapping-complete-info'    , 'block' );
			}
		</script>
	</head>
	<body>
		<div id="login">
			<div id="login-panel">
				<div id="avatar">
					<img src="<?php 
        echo $hybridauth_user_avatar;
        ?>
">
				</div>

				<div id="welcome">
					<img id="idp-icon" src="<?php 
        echo $assets_base_url . $provider;
        ?>
.png" > 
					<b><?php 
        printf(_wsl__("Hi %s", 'wordpress-social-login'), htmlentities($hybridauth_user_profile->displayName));
        ?>
</b>
					<p><?php 
        printf(_wsl__("You're now signed in with your %s account but you still one step away of getting into our website", 'wordpress-social-login'), $provider);
        ?>
.</p>

					<hr />
				</div>

				<table id="mapping-options" border="0">
					<tr>
						<?php 
        if ($linking_enabled == 1) {
            ?>
							<td valign="top"  width="50%" style="text-align:center;">
								<h4><?php 
            _wsl_e("Already have an account", 'wordpress-social-login');
            ?>
?</h4>
								<p style="font-size: 12px;"><?php 
            printf(_wsl__("Link your existing account on our website to your %s ID.", 'wordpress-social-login'), $provider);
            ?>
</p>
							</td>
						<?php 
        }
        ?>
						<td valign="top"  width="50%" style="text-align:center;">
							<h4><?php 
        _wsl_e("New to our website", 'wordpress-social-login');
        ?>
?</h4>
							<p style="font-size: 12px;"><?php 
        printf(_wsl__("Create a new account and it will be associated with your %s ID.", 'wordpress-social-login'), $provider);
        ?>
</p>
						</td>
					</tr>
					
					<tr>
						<?php 
        if ($linking_enabled == 1) {
            ?>
							<td valign="top"  width="50%" style="text-align:center;">
								<input type="button" value="<?php 
            _wsl_e("Link my account", 'wordpress-social-login');
            ?>
" class="button-primary" onclick="display_mapping_authenticate();" > 
							</td>
						<?php 
        }
        ?>
						<td valign="top"  width="50%" style="text-align:center;">
							<input type="button" value="<?php 
        _wsl_e("Create a new account", 'wordpress-social-login');
        ?>
" class="button-primary" onclick="display_mapping_complete_info();" > 
						</td>
					</tr>
				</table> 

				<?php 
        if ($account_linking_errors) {
            echo '<div id="errors-account-linking" class="error">';
            foreach ($account_linking_errors as $error) {
                ?>
<p><?php 
                echo $error;
                ?>
</p><?php 
            }
            echo '</div>';
        }
        if ($profile_completion_errors) {
            echo '<div id="errors-profile-completion" class="error">';
            foreach ($profile_completion_errors as $error) {
                ?>
<p><?php 
                echo $error;
                ?>
</p><?php 
            }
            echo '</div>';
        }
        ?>

				<form method="post" action="<?php 
        echo site_url('wp-login.php', 'login_post');
        ?>
" id="login-form">
					<table id="mapping-authenticate" border="0"> 
						<tr>
							<td valign="top"  width="50%" style="text-align:center;">
								<h4><?php 
        _wsl_e("Already have an account", 'wordpress-social-login');
        ?>
?</h4> 

								<p><?php 
        printf(_wsl__("Please enter your username and password of your existing account on our website. Once verified, it will linked to your % ID", 'wordpress-social-login'), ucfirst($provider));
        ?>
.</p>
							</td>
						</tr> 
						<tr>
							<td valign="bottom"  width="50%" style="text-align:left;">
								<label>
									<?php 
        _wsl_e("Username", 'wordpress-social-login');
        ?>
									<br />
									<input type="text" name="user_login" class="input" value=""  size="25" placeholder="" />
								</label>

								<label>
									<?php 
        _wsl_e("Password", 'wordpress-social-login');
        ?>
									<br />
									<input type="text" name="user_password" class="input" value="" size="25" placeholder="" />
								</label> 

								<input type="submit" value="<?php 
        _wsl_e("Continue", 'wordpress-social-login');
        ?>
" class="button-primary" > 
								
								<a href="javascript:void(0);" onclick="display_mapping_options();" class="back-to-options"><?php 
        _wsl_e("Back", 'wordpress-social-login');
        ?>
</a>
							</td>
						</tr>
					</table> 

					<input type="hidden" id="redirect_to" name="redirect_to" value="<?php 
        echo $redirect_to;
        ?>
"> 
					<input type="hidden" id="provider" name="provider" value="<?php 
        echo $provider;
        ?>
"> 
					<input type="hidden" id="action" name="action" value="wordpress_social_account_linking">
					<input type="hidden" id="bouncer_account_linking" name="bouncer_account_linking" value="1">
				</form>

				<form method="post" action="<?php 
        echo site_url('wp-login.php', 'login_post');
        ?>
" id="login-form"> 
					<table id="mapping-complete-info" border="0">
						<tr>
							<td valign="top"  width="50%" style="text-align:center;">
								<?php 
        if ($linking_enabled == 1) {
            ?>
									<h4><?php 
            _wsl_e("New to our website", 'wordpress-social-login');
            ?>
?</h4>
								<?php 
        }
        ?>

								<p><?php 
        printf(_wsl__("Please fill in your information in the form below. Once completed, you will be able to automatically sign into our website through your %s ID", 'wordpress-social-login'), ucfirst($provider));
        ?>
.</p>
							</td>
						</tr>
						<tr>
							<td valign="bottom"  width="50%" style="text-align:left;">
								<label>
									<?php 
        _wsl_e("Username", 'wordpress-social-login');
        ?>
									<br />
									<input type="text" name="user_name" class="input" value="<?php 
        echo $requested_user_login;
        ?>
" size="25" placeholder="" />
								</label>

								<label>
									<?php 
        _wsl_e("E-mail", 'wordpress-social-login');
        ?>
									<br />
									<input type="text" name="user_email" class="input" value="<?php 
        echo $requested_user_email;
        ?>
" size="25" placeholder="" />
								</label> 

								<?php 
        /**
         * Fires following the 'E-mail' field in the user registration form.
         *
         * hopefully, this won't become a pain in future
         *
         * Ref: http://codex.wordpress.org/Plugin_API/Action_Reference/register_form
         */
        $extra_fields = get_option('wsl_settings_bouncer_profile_completion_hook_extra_fields');
        if ($extra_fields == 1) {
            do_action('register_form');
        }
        ?>

								<input type="submit" value="<?php 
        _wsl_e("Continue", 'wordpress-social-login');
        ?>
" class="button-primary" > 

								<?php 
        if ($linking_enabled == 1) {
            ?>
									<a href="javascript:void(0);" onclick="display_mapping_options();" class="back-to-options"><?php 
            _wsl_e("Back", 'wordpress-social-login');
            ?>
</a>
								<?php 
        }
        ?>
							</td>
						</tr>
					</table> 

					<input type="hidden" id="redirect_to" name="redirect_to" value="<?php 
        echo $redirect_to;
        ?>
"> 
					<input type="hidden" id="provider" name="provider" value="<?php 
        echo $provider;
        ?>
"> 
					<input type="hidden" id="action" name="action" value="wordpress_social_account_linking">
					<input type="hidden" id="bouncer_profile_completion" name="bouncer_profile_completion" value="1">
				</form>
			</div>

			<p class="back-to-home">
				<a href="<?php 
        echo site_url();
        ?>
">&#8592; <?php 
        printf(_wsl__("Back to %s", 'wordpress-social-login'), get_bloginfo('name'));
        ?>
</a>
			</p>
		</div>

		<?php 
        // Development mode on?
        if (get_option('wsl_settings_development_mode_enabled')) {
            wsl_display_dev_mode_debugging_area();
        }
        ?>
 
	</body>
</html>
<?php 
        die;
    }
    return array($shall_pass, $user_id, $requested_user_login, $requested_user_email);
}
/**
*  Grab the user profile from social network
*/
function wsl_process_login_request_user_social_profile($provider)
{
    $adapter = null;
    $config = null;
    $hybridauth_user_profile = null;
    try {
        // get idp adapter
        $adapter = wsl_process_login_get_provider_adapter($provider);
        $config = $adapter->config;
        // if user authenticated successfully with social network
        if ($adapter->isUserConnected()) {
            // grab user profile via hybridauth api
            $hybridauth_user_profile = $adapter->getUserProfile();
        } else {
            return wsl_process_login_render_notice_page(sprintf(_wsl__("Sorry, we couldn't connect you with <b>%s</b>. <a href=\"%s\">Please try again</a>.", 'wordpress-social-login'), $provider, site_url('wp-login.php', 'login_post')));
        }
    } catch (Exception $e) {
        return wsl_process_login_render_error_page($e, $config, $provider, $adapter);
    }
    return $hybridauth_user_profile;
}