UNPKG

ngx-social-button

Version:

Social login/share buttons for Angular 6, 7, 8

825 lines (809 loc) 97.1 kB
import { Injectable, Component, Input, Output, EventEmitter, Inject, ViewChild, NgModule, defineInjectable, inject } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { DOCUMENT } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @abstract */ class BaseLoginProviderImpl { constructor() { } /** * @param {?} obj * @param {?} onload * @return {?} */ loadScript(obj, onload) { if (document.getElementById(obj.name)) { return; } /** @type {?} */ let signInJS = document.createElement('script'); signInJS.async = true; signInJS.src = obj.url; signInJS.onload = onload; if (obj.name === 'linkedin') { signInJS.async = false; signInJS.text = ('api_key: ' + obj.id).replace('\'', ''); } document.head.appendChild(signInJS); } } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class SocialUser { } class LoginProviderClass { } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class FacebookLoginProvider extends BaseLoginProviderImpl { /** * @param {?} clientId */ constructor(clientId) { super(); this.clientId = clientId; this.TYPE = 'facebook'; this.loginProviderObj = new LoginProviderClass(); this.loginProviderObj.id = clientId; this.loginProviderObj.name = 'facebook'; this.loginProviderObj.url = 'https://connect.facebook.net/en_US/sdk.js'; } /** * @return {?} */ initialize() { return new Promise((resolve, reject) => { this.loadScript(this.loginProviderObj, () => { FB.init({ appId: this.clientId, autoLogAppEvents: true, cookie: true, xfbml: true, version: 'v2.8' }); FB.AppEvents.logPageView(); FB.getLoginStatus(function (response) { if (response.status === 'connected') { /** @type {?} */ const accessToken = FB.getAuthResponse()['accessToken']; FB.api('/me?fields=name,email,picture', (res) => { resolve(FacebookLoginProvider.drawUser(Object.assign({}, { token: accessToken }, res))); }); } }); }); }); } /** * @param {?} response * @return {?} */ static drawUser(response) { /** @type {?} */ let user = new SocialUser(); user.id = response.id; user.name = response.name; user.email = response.email; user.accessToken = response.accessToken; user.image = 'https://graph.facebook.com/' + response.id + '/picture?type=normal'; return user; } /** * @param {?=} scopes * @return {?} */ signIn(scopes) { return new Promise((resolve, reject) => { FB.login((response) => { console.log("facebook", response); if (response.authResponse) { /** @type {?} */ const accessToken = FB.getAuthResponse()['accessToken']; FB.api('/me?fields=name,email,picture', (res) => { console.log("me", res); resolve(FacebookLoginProvider.drawUser(Object.assign({}, { accessToken: accessToken }, res))); }); } }, { scope: scopes && scopes.length > 0 ? scopes.join(',') : 'email,public_profile' }); }); } /** * @param {?=} share * @return {?} */ sharing(share) { return new Promise((resolve, reject) => { FB.ui({ method: 'share', href: share.href, hashtag: (share.hashtag && share.hashtag.indexOf('#') >= 0) ? share.hashtag : null }, function (response) { console.log(response); resolve(); }); }); } /** * @return {?} */ signOut() { return new Promise((resolve, reject) => { FB.logout((response) => { resolve(); }); }); } } FacebookLoginProvider.PROVIDER_TYPE = 'facebook'; FacebookLoginProvider.SCOPES = { EMAIL: 'email', PUBLIC_PROFILE: 'public_profile' }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class GoogleLoginProvider extends BaseLoginProviderImpl { /** * @param {?} clientId */ constructor(clientId) { super(); this.clientId = clientId; this.loginProviderObj = new LoginProviderClass(); this.TYPE = 'google'; this.loginProviderObj.id = clientId; this.loginProviderObj.name = 'google'; this.loginProviderObj.url = 'https://apis.google.com/js/platform.js'; } /** * @return {?} */ initialize() { return new Promise((resolve, reject) => { this.loadScript(this.loginProviderObj, () => { gapi.load('auth2', () => { this.auth2 = gapi.auth2.init({ client_id: this.clientId, scope: 'email' }); this.auth2.then(() => { if (this.auth2.isSignedIn.get()) { resolve(this.drawUser()); } }); }); }); }); } /** * @return {?} */ drawUser() { /** @type {?} */ const user = new SocialUser(); /** @type {?} */ const profile = this.auth2.currentUser.get().getBasicProfile(); /** @type {?} */ const authResponseObj = this.auth2.currentUser.get().getAuthResponse(true); user.id = profile.getId(); user.name = profile.getName(); user.email = profile.getEmail(); user.image = profile.getImageUrl(); user.accessToken = authResponseObj.access_token; user.idToken = authResponseObj.id_token; return user; } /** * @param {?=} scopes * @return {?} */ signIn(scopes) { return new Promise((resolve, reject) => { /** @type {?} */ const promise = this.auth2.signIn(); promise.then(() => { resolve(this.drawUser()); }).catch((err) => { reject(err); }); }); } /** * @return {?} */ signOut() { return new Promise((resolve, reject) => { this.auth2.signOut().then((err) => { if (err) { reject(err); } else { resolve(); } }); }); } /** * @param {?=} share * @return {?} */ sharing(share) { return new Promise((resolve, reject) => { resolve(); }); } } GoogleLoginProvider.PROVIDER_TYPE = 'google'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class LinkedinLoginProvider extends BaseLoginProviderImpl { /** * @param {?} clientId */ constructor(clientId) { super(); this.clientId = clientId; this.loginProviderObj = new LoginProviderClass(); this.TYPE = 'linkedin'; this.loginProviderObj.id = clientId; this.loginProviderObj.name = 'linkedin'; this.loginProviderObj.url = 'https://platform.linkedin.com/in.js'; } /** * @return {?} */ initialize() { return new Promise((resolve, reject) => { this.loadScript(this.loginProviderObj, () => { IN.init({ api_key: this.clientId, authorize: true, onLoad: this.onLinkedInLoad() }); IN.Event.on(IN, 'auth', () => { if (IN.User.isAuthorized()) { IN.API.Raw('/people/~:(id,first-name,last-name,email-address,picture-url)').result((res) => { resolve(this.drawUser(res)); }); } }); }); }); } /** * @return {?} */ onLinkedInLoad() { IN.Event.on(IN, 'systemReady', () => { IN.User.refresh(); }); } /** * @param {?} response * @return {?} */ drawUser(response) { /** @type {?} */ const user = new SocialUser(); user.id = response.id; user.name = response.firstName + ' ' + response.lastName; user.email = response.emailAddress; user.image = response.pictureUrl; user.accessToken = IN.ENV.auth.oauth_token; return user; } /** * @return {?} */ signIn() { return new Promise((resolve, reject) => { IN.User.authorize(() => { IN.API.Raw('/people/~:(id,first-name,last-name,email-address,picture-url)').result((res) => { console.log('linkedin', res); resolve(this.drawUser(res)); }); }); }); } /** * @return {?} */ signOut() { return new Promise((resolve, reject) => { IN.User.logout((response) => { resolve(); }, (err) => { reject(err); }); }); } /** * @param {?=} share * @return {?} */ sharing(share) { return new Promise((resolve, reject) => { /** @type {?} */ const payload = { 'comment': share ? share.comment : '', 'visibility': { 'code': 'anyone' } }; IN.API.Raw('/people/~/shares?format=json') .method('POST') .body(JSON.stringify(payload)) .result(data => { console.log('linkedin share', data); resolve(); }) .error(onError => { console.log('linkedin', onError); }); }); } } LinkedinLoginProvider.PROVIDER_TYPE = 'linkedin'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class SocialServiceConfig { /** * @param {?=} providers */ constructor(providers) { this.providers = new Map(); if (providers) { for (let i = 0; i < providers.length; i++) { /** @type {?} */ const element = providers[i]; this.providers.set(element.provider.TYPE, element.provider); } } } /** * @return {?} */ getProviders() { return this.providers; } /** * @param {?} provider * @return {?} */ addProvider(provider) { if (!this.providers.get(provider.TYPE)) { this.providers.set(provider.TYPE, provider); } } /** * @param {?} clientId * @return {?} */ addFacebook(clientId) { this.addProvider(new FacebookLoginProvider(clientId)); return this; } /** * @param {?} clientId * @return {?} */ addGoogle(clientId) { this.addProvider(new GoogleLoginProvider(clientId)); return this; } /** * @param {?} clientId * @return {?} */ addLinkedIn(clientId) { this.addProvider(new LinkedinLoginProvider(clientId)); return this; } } class SocialService { /** * @param {?} config */ constructor(config) { this._user = null; this._authState = new BehaviorSubject(null); this.providers = config.getProviders(); this.providers.forEach((provider, key) => { provider.initialize().then((user) => { user.provider = key; this._user = user; this._authState.next(user); }).catch((err) => { // this._authState.next(null); }); }); } /** * @return {?} */ get authState() { return this._authState.asObservable(); } /** * @return {?} */ isSocialLoggedIn() { return (this._user != null); } /** * @param {?} providerType * @param {?=} share * @return {?} */ sharing(providerType, share) { return new Promise((resolve, reject) => { /** @type {?} */ let providerObject = this.providers.get(providerType); if (providerObject) { providerObject.sharing(share).then(() => { resolve(true); }); } else { reject(SocialService.LOGIN_PROVIDER_NOT_FOUND); } }); } /** * @param {?=} share * @return {?} */ facebookSharing(share) { return this.sharing('facebook', share); } /** * @param {?} providerType * @param {?=} scopes * @return {?} */ signIn(providerType, scopes) { return new Promise((resolve, reject) => { /** @type {?} */ let providerObject = this.providers.get(providerType); if (providerObject) { providerObject.signIn(scopes).then((user) => { user.provider = providerType; resolve(user); this._user = user; this._authState.next(user); }).catch((err) => { reject(SocialService.USER_POPUP_CLOSE); }); } else { reject(SocialService.LOGIN_PROVIDER_NOT_FOUND); } }); } /** * @return {?} */ signOut() { return new Promise((resolve, reject) => { if (this._user && this._user.provider) { /** @type {?} */ let providerType = this._user.provider; /** @type {?} */ let providerObject = this.providers.get(providerType); providerObject.signOut().then(() => { this._user = null; this._authState.next(null); resolve(); }).catch((err) => { this._authState.next(null); }); } else { reject(SocialService.LOGIN_PROVIDER_NOT_FOUND); } }); } } SocialService.LOGIN_PROVIDER_NOT_FOUND = 'Login provider not found'; SocialService.USER_POPUP_CLOSE = 'User close the popup'; SocialService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ SocialService.ctorParameters = () => [ { type: SocialServiceConfig } ]; /** @nocollapse */ SocialService.ngInjectableDef = defineInjectable({ factory: function SocialService_Factory() { return new SocialService(inject(SocialServiceConfig)); }, token: SocialService, providedIn: "root" }); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class FacebookLoginButton { /** * @param {?} socialAuthService */ constructor(socialAuthService) { this.socialAuthService = socialAuthService; this.socialUser = new EventEmitter(); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ socialSignIn() { this.socialAuthService.signIn('facebook', this.scopes).then((userData) => { console.log("socialSignIn", userData); this.socialUser.emit(userData); }).catch(() => { this.socialUser.emit(null); }); } } FacebookLoginButton.decorators = [ { type: Component, args: [{ selector: 'facebook-login-button', template: ` <button [className]="style == 'round' ? 'social-btn facebook ' : 'button btn-block loginBtn --facebook '" (click)="socialSignIn()" type="button"> {{style == 'round' ? '': text ? text : 'Login with Facebook'}}</button> `, styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`], },] }, ]; /** @nocollapse */ FacebookLoginButton.ctorParameters = () => [ { type: SocialService } ]; FacebookLoginButton.propDecorators = { size: [{ type: Input }], text: [{ type: Input }], style: [{ type: Input }], scopes: [{ type: Input }], socialUser: [{ type: Output }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class GoogleLoginButton { /** * @param {?} socialAuthService */ constructor(socialAuthService) { this.socialAuthService = socialAuthService; this.socialUser = new EventEmitter(); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ socialSignIn() { this.socialAuthService.signIn('google', this.scopes).then((userData) => { this.socialUser.emit(userData); }).catch(() => { this.socialUser.emit(null); }); } } GoogleLoginButton.decorators = [ { type: Component, args: [{ selector: 'google-login-button', template: ` <button [className]="style == 'round' ? 'social-btn google' : 'button btn-block loginBtn --google'" (click)="socialSignIn()" type="button"> {{style == 'round' ? '': text ? text : 'Login with Google'}} </button> `, styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`], },] }, ]; /** @nocollapse */ GoogleLoginButton.ctorParameters = () => [ { type: SocialService } ]; GoogleLoginButton.propDecorators = { size: [{ type: Input }], style: [{ type: Input }], text: [{ type: Input }], scopes: [{ type: Input }], socialUser: [{ type: Output }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class LinkedinLoginButton { /** * @param {?} socialAuthService */ constructor(socialAuthService) { this.socialAuthService = socialAuthService; this.socialUser = new EventEmitter(); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ socialSignIn() { this.socialAuthService.signIn('linkedin', this.scopes).then((userData) => { this.socialUser.emit(userData); }).catch(() => { this.socialUser.emit(null); }); } } LinkedinLoginButton.decorators = [ { type: Component, args: [{ selector: 'linkedin-login-button', template: ` <button [className]="style == 'round' ? 'social-btn linkedin' : 'button btn-block loginBtn --linkedin'" (click)="socialSignIn()" type="button"> {{style == 'round' ? '': text ? text : 'Login with LinkedIn'}} </button> `, styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`], },] }, ]; /** @nocollapse */ LinkedinLoginButton.ctorParameters = () => [ { type: SocialService } ]; LinkedinLoginButton.propDecorators = { size: [{ type: Input }], style: [{ type: Input }], text: [{ type: Input }], scopes: [{ type: Input }], socialUser: [{ type: Output }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class FacebookSharingButton { /** * @param {?} socialAuthService * @param {?} document */ constructor(socialAuthService, document) { this.socialAuthService = socialAuthService; this.document = document; this.share = null; this.response = new EventEmitter(); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ sharing() { console.log(this.document.location.href); if (!this.share) { this.share = { href: this.document.location.href }; } else if (!this.share.href) { this.share.href = this.document.location.href; } this.socialAuthService.facebookSharing(this.share).then(() => { this.response.emit(true); }).catch((err) => { this.response.emit(false); }); } } FacebookSharingButton.decorators = [ { type: Component, args: [{ selector: 'facebook-share-button', template: ` <button class="button btn-block loginBtn --facebook" (click)="sharing()" type="button">Share</button> `, styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`], },] }, ]; /** @nocollapse */ FacebookSharingButton.ctorParameters = () => [ { type: SocialService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; FacebookSharingButton.propDecorators = { share: [{ type: Input }], response: [{ type: Output }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class LinkedinSharingButton { /** * @param {?} socialAuthService * @param {?} document */ constructor(socialAuthService, document) { this.socialAuthService = socialAuthService; this.document = document; this.share = { href: location.href }; this.response = new EventEmitter(); } /** * @return {?} */ ngAfterViewInit() { // add linkedin share button script tag to element this.element.nativeElement.innerHTML = `<script type="IN/Share" data-url="${this.share.href}"></script>`; // render share button // window['IN'] && window['IN'].parse(); } } LinkedinSharingButton.decorators = [ { type: Component, args: [{ selector: 'linkedin-share-button', template: ` <span #element></span> `, },] }, ]; /** @nocollapse */ LinkedinSharingButton.ctorParameters = () => [ { type: SocialService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; LinkedinSharingButton.propDecorators = { share: [{ type: Input }], response: [{ type: Output }], element: [{ type: ViewChild, args: ['element',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class NgxSocialButtonModule { } NgxSocialButtonModule.decorators = [ { type: NgModule, args: [{ imports: [], declarations: [FacebookLoginButton, GoogleLoginButton, FacebookSharingButton, LinkedinLoginButton, LinkedinSharingButton], exports: [FacebookLoginButton, GoogleLoginButton, FacebookSharingButton, LinkedinLoginButton, LinkedinSharingButton] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ export { SocialServiceConfig, SocialService, FacebookLoginProvider, GoogleLoginProvider, FacebookLoginButton, GoogleLoginButton, LinkedinLoginButton, FacebookSharingButton, NgxSocialButtonModule, LinkedinSharingButton as ɵb, BaseLoginProviderImpl as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNvY2lhbC1idXR0b24uanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9lbnRpdGllcy9iYXNlTG9naW5Qcm92aWRlckltcGwudHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9lbnRpdGllcy91c2VyLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvcHJvdmlkZXJzL2ZhY2Vib29rUHJvdmlkZXIudHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9wcm92aWRlcnMvZ29vZ2xlUHJvdmlkZXIudHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9wcm92aWRlcnMvbGlua2VkaW5Qcm92aWRlci50cyIsIm5nOi8vbmd4LXNvY2lhbC1idXR0b24vbGliL3NvY2lhbC5zZXJ2aWNlLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvYnV0dG9ucy9mYWNlYm9va0xvZ2luQnV0dG9uLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvYnV0dG9ucy9nb29nbGVMb2dpbkJ1dHRvbi50cyIsIm5nOi8vbmd4LXNvY2lhbC1idXR0b24vbGliL2J1dHRvbnMvbGlua2VkaW5Mb2dpbkJ1dHRvbi50cyIsIm5nOi8vbmd4LXNvY2lhbC1idXR0b24vbGliL2J1dHRvbnMvZmFjZWJvb2tTaGFyaW5nQnV0dG9uLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvYnV0dG9ucy9saW5rZWRpblNoYXJpbmdCdXR0b24udHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9uZ3gtc29jaWFsLWJ1dHRvbi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9naW5Qcm92aWRlciB9IGZyb20gJy4vbG9naW5Qcm92aWRlcic7XG5pbXBvcnQgeyBTb2NpYWxVc2VyLCBMb2dpblByb3ZpZGVyQ2xhc3MgfSBmcm9tICcuL3VzZXInO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUxvZ2luUHJvdmlkZXJJbXBsIGltcGxlbWVudHMgTG9naW5Qcm92aWRlciB7XG5cblxuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICBhYnN0cmFjdCBpbml0aWFsaXplKCk6IFByb21pc2U8U29jaWFsVXNlcj47XG4gIGFic3RyYWN0IHNpZ25JbihzY29wZXM/OltzdHJpbmddKTogUHJvbWlzZTxTb2NpYWxVc2VyPjtcbiAgYWJzdHJhY3Qgc2lnbk91dCgpOiBQcm9taXNlPGFueT47XG4gIGFic3RyYWN0IHNoYXJpbmcoc2hhcmU/OmFueSk6UHJvbWlzZTxhbnk+O1xuICBhYnN0cmFjdCBUWVBFOiBzdHJpbmc7XG5cbiAgbG9hZFNjcmlwdChvYmo6IExvZ2luUHJvdmlkZXJDbGFzcywgb25sb2FkOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqLm5hbWUpKSB7IHJldHVybjsgfVxuICAgIGxldCBzaWduSW5KUyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNpZ25JbkpTLmFzeW5jID0gdHJ1ZTtcbiAgICBzaWduSW5KUy5zcmMgPSBvYmoudXJsO1xuICAgIHNpZ25JbkpTLm9ubG9hZCA9IG9ubG9hZDtcbiAgICBpZiAob2JqLm5hbWUgPT09ICdsaW5rZWRpbicpIHtcbiAgICAgIHNpZ25JbkpTLmFzeW5jID0gZmFsc2U7XG4gICAgICBzaWduSW5KUy50ZXh0ID0gKCdhcGlfa2V5OiAnICsgb2JqLmlkKS5yZXBsYWNlKCdcXCcnLCAnJyk7XG4gICAgfVxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2lnbkluSlMpO1xuICB9XG59IiwiZXhwb3J0IGNsYXNzIFNvY2lhbFVzZXIge1xuICAgIHByb3ZpZGVyOiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbWFnZTogc3RyaW5nO1xuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmdcbiAgfVxuICBcbiAgZXhwb3J0IGNsYXNzIExvZ2luUHJvdmlkZXJDbGFzcyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gIH1cbiAgXG4gIGV4cG9ydCBjbGFzcyBMaW5rZWRJblJlc3BvbnNlIHtcbiAgICBlbWFpbEFkZHJlc3M6IHN0cmluZztcbiAgICBmaXJzdE5hbWU6IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xuICAgIGxhc3ROYW1lOiBzdHJpbmc7XG4gICAgcGljdHVyZVVybDogc3RyaW5nO1xuICB9XG4iLCJpbXBvcnQgeyBCYXNlTG9naW5Qcm92aWRlckltcGwgfSBmcm9tICcuLi9lbnRpdGllcy9iYXNlTG9naW5Qcm92aWRlckltcGwnO1xuaW1wb3J0IHsgU29jaWFsVXNlciwgTG9naW5Qcm92aWRlckNsYXNzIH0gZnJvbSAnLi4vZW50aXRpZXMvdXNlcic7XG5cbmRlY2xhcmUgbGV0IEZCOiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBGYWNlYm9va0xvZ2luUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTG9naW5Qcm92aWRlckltcGwge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPVklERVJfVFlQRSA9ICdmYWNlYm9vayc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0NPUEVTID0ge1xuICAgIEVNQUlMIDogJ2VtYWlsJyxcbiAgICBQVUJMSUNfUFJPRklMRTogJ3B1YmxpY19wcm9maWxlJ1xuICB9O1xuXG4gIHB1YmxpYyBUWVBFID0gJ2ZhY2Vib29rJztcbiAgcHVibGljIGxvZ2luUHJvdmlkZXJPYmo6IExvZ2luUHJvdmlkZXJDbGFzcyA9IG5ldyBMb2dpblByb3ZpZGVyQ2xhc3MoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudElkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5pZCA9IGNsaWVudElkO1xuICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5uYW1lID0gJ2ZhY2Vib29rJztcbiAgICB0aGlzLmxvZ2luUHJvdmlkZXJPYmoudXJsID0gJ2h0dHBzOi8vY29ubmVjdC5mYWNlYm9vay5uZXQvZW5fVVMvc2RrLmpzJztcbiAgfVxuXG4gIGluaXRpYWxpemUoKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMubG9hZFNjcmlwdCh0aGlzLmxvZ2luUHJvdmlkZXJPYmosICgpID0+IHtcbiAgICAgICAgICBGQi5pbml0KHtcbiAgICAgICAgICAgIGFwcElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgYXV0b0xvZ0FwcEV2ZW50czogdHJ1ZSxcbiAgICAgICAgICAgIGNvb2tpZTogdHJ1ZSxcbiAgICAgICAgICAgIHhmYm1sOiB0cnVlLFxuICAgICAgICAgICAgdmVyc2lvbjogJ3YyLjgnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgRkIuQXBwRXZlbnRzLmxvZ1BhZ2VWaWV3KCk7XG5cbiAgICAgICAgICBGQi5nZXRMb2dpblN0YXR1cyhmdW5jdGlvbiAocmVzcG9uc2U6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBGQi5nZXRBdXRoUmVzcG9uc2UoKVsnYWNjZXNzVG9rZW4nXTtcbiAgICAgICAgICAgICAgRkIuYXBpKCcvbWU/ZmllbGRzPW5hbWUsZW1haWwscGljdHVyZScsIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoRmFjZWJvb2tMb2dpblByb3ZpZGVyLmRyYXdVc2VyKE9iamVjdC5hc3NpZ24oe30sIHt0b2tlbjogYWNjZXNzVG9rZW59LCByZXMpKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBkcmF3VXNlcihyZXNwb25zZTogYW55KTogU29jaWFsVXNlciB7XG4gICAgbGV0IHVzZXI6IFNvY2lhbFVzZXIgPSBuZXcgU29jaWFsVXNlcigpO1xuICAgIHVzZXIuaWQgPSByZXNwb25zZS5pZDtcbiAgICB1c2VyLm5hbWUgPSByZXNwb25zZS5uYW1lO1xuICAgIHVzZXIuZW1haWwgPSByZXNwb25zZS5lbWFpbDtcbiAgICB1c2VyLmFjY2Vzc1Rva2VuID0gcmVzcG9uc2UuYWNjZXNzVG9rZW47XG4gICAgdXNlci5pbWFnZSA9ICdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8nICsgcmVzcG9uc2UuaWQgKyAnL3BpY3R1cmU/dHlwZT1ub3JtYWwnO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cblxuICBzaWduSW4oc2NvcGVzPzpbc3RyaW5nXSk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBGQi5sb2dpbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcImZhY2Vib29rXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmF1dGhSZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gRkIuZ2V0QXV0aFJlc3BvbnNlKClbJ2FjY2Vzc1Rva2VuJ107XG4gICAgICAgICAgRkIuYXBpKCcvbWU/ZmllbGRzPW5hbWUsZW1haWwscGljdHVyZScsIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJtZVwiLCByZXMpO1xuICAgICAgICAgICAgcmVzb2x2ZShGYWNlYm9va0xvZ2luUHJvdmlkZXIuZHJhd1VzZXIoT2JqZWN0LmFzc2lnbih7fSwge2FjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbn0sIHJlcykpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgeyBzY29wZTogc2NvcGVzICYmIHNjb3Blcy5sZW5ndGggPiAwID8gc2NvcGVzLmpvaW4oJywnKSA6ICdlbWFpbCxwdWJsaWNfcHJvZmlsZScgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzaGFyaW5nKHNoYXJlPzphbnkpOiBQcm9taXNlPGFueT57XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgRkIudWkoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ3NoYXJlJyxcbiAgICAgICAgICAgICAgICBocmVmOiBzaGFyZS5ocmVmLFxuICAgICAgICAgICAgICAgIGhhc2h0YWc6IChzaGFyZS5oYXNodGFnICYmIHNoYXJlLmhhc2h0YWcuaW5kZXhPZignIycpPj0wKT9zaGFyZS5oYXNodGFnIDogIG51bGxcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKHJlc3BvbnNlKXtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG4gIHNpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgRkIubG9nb3V0KChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn0iLCJpbXBvcnQge0Jhc2VMb2dpblByb3ZpZGVySW1wbH0gZnJvbSAnLi4vZW50aXRpZXMvYmFzZUxvZ2luUHJvdmlkZXJJbXBsJztcbmltcG9ydCB7TG9naW5Qcm92aWRlckNsYXNzLCBTb2NpYWxVc2VyfSBmcm9tICcuLi9lbnRpdGllcy91c2VyJztcblxuZGVjbGFyZSBsZXQgZ2FwaTogYW55O1xuXG5leHBvcnQgY2xhc3MgR29vZ2xlTG9naW5Qcm92aWRlciBleHRlbmRzIEJhc2VMb2dpblByb3ZpZGVySW1wbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX1RZUEUgPSAnZ29vZ2xlJztcbiAgICBwdWJsaWMgbG9naW5Qcm92aWRlck9iajogTG9naW5Qcm92aWRlckNsYXNzID0gbmV3IExvZ2luUHJvdmlkZXJDbGFzcygpO1xuICAgIHByaXZhdGUgYXV0aDI6IGFueTtcbiAgICBwdWJsaWMgVFlQRSA9ICdnb29nbGUnO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5pZCA9IGNsaWVudElkO1xuICAgICAgICB0aGlzLmxvZ2luUHJvdmlkZXJPYmoubmFtZSA9ICdnb29nbGUnO1xuICAgICAgICB0aGlzLmxvZ2luUHJvdmlkZXJPYmoudXJsID0gJ2h0dHBzOi8vYXBpcy5nb29nbGUuY29tL2pzL3BsYXRmb3JtLmpzJztcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkU2NyaXB0KHRoaXMubG9naW5Qcm92aWRlck9iaiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGdhcGkubG9hZCgnYXV0aDInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aDIgPSBnYXBpLmF1dGgyLmluaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6ICdlbWFpbCdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoMi50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dGgyLmlzU2lnbmVkSW4uZ2V0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuZHJhd1VzZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRyYXdVc2VyKCk6IFNvY2lhbFVzZXIge1xuICAgICAgICBjb25zdCB1c2VyOiBTb2NpYWxVc2VyID0gbmV3IFNvY2lhbFVzZXIoKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuYXV0aDIuY3VycmVudFVzZXIuZ2V0KCkuZ2V0QmFzaWNQcm9maWxlKCk7XG4gICAgICAgIGNvbnN0IGF1dGhSZXNwb25zZU9iaiA9IHRoaXMuYXV0aDIuY3VycmVudFVzZXIuZ2V0KCkuZ2V0QXV0aFJlc3BvbnNlKHRydWUpO1xuICAgICAgICB1c2VyLmlkID0gcHJvZmlsZS5nZXRJZCgpO1xuICAgICAgICB1c2VyLm5hbWUgPSBwcm9maWxlLmdldE5hbWUoKTtcbiAgICAgICAgdXNlci5lbWFpbCA9IHByb2ZpbGUuZ2V0RW1haWwoKTtcbiAgICAgICAgdXNlci5pbWFnZSA9IHByb2ZpbGUuZ2V0SW1hZ2VVcmwoKTtcbiAgICAgICAgdXNlci5hY2Nlc3NUb2tlbiA9IGF1dGhSZXNwb25zZU9iai5hY2Nlc3NfdG9rZW47XG4gICAgICAgIHVzZXIuaWRUb2tlbiA9IGF1dGhSZXNwb25zZU9iai5pZF90b2tlbjtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgc2lnbkluKHNjb3Blcz86IFtzdHJpbmddKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5hdXRoMi5zaWduSW4oKTtcbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmRyYXdVc2VyKCkpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXV0aDIuc2lnbk91dCgpLnRoZW4oKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNoYXJpbmcoc2hhcmU/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1NvY2lhbFVzZXIsIExvZ2luUHJvdmlkZXJDbGFzcywgTGlua2VkSW5SZXNwb25zZX0gZnJvbSAnLi4vZW50aXRpZXMvdXNlcic7XG5pbXBvcnQge0Jhc2VMb2dpblByb3ZpZGVySW1wbH0gZnJvbSAnLi4vZW50aXRpZXMvYmFzZUxvZ2luUHJvdmlkZXJJbXBsJztcblxuZGVjbGFyZSBsZXQgSU46IGFueTtcblxuZXhwb3J0IGNsYXNzIExpbmtlZGluTG9naW5Qcm92aWRlciBleHRlbmRzIEJhc2VMb2dpblByb3ZpZGVySW1wbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX1RZUEUgPSAnbGlua2VkaW4nO1xuICAgIHB1YmxpYyBsb2dpblByb3ZpZGVyT2JqOiBMb2dpblByb3ZpZGVyQ2xhc3MgPSBuZXcgTG9naW5Qcm92aWRlckNsYXNzKCk7XG4gICAgVFlQRSA9ICdsaW5rZWRpbic7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sb2dpblByb3ZpZGVyT2JqLmlkID0gY2xpZW50SWQ7XG4gICAgICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5uYW1lID0gJ2xpbmtlZGluJztcbiAgICAgICAgdGhpcy5sb2dpblByb3ZpZGVyT2JqLnVybCA9ICdodHRwczovL3BsYXRmb3JtLmxpbmtlZGluLmNvbS9pbi5qcyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPFNvY2lhbFVzZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZFNjcmlwdCh0aGlzLmxvZ2luUHJvdmlkZXJPYmosICgpID0+IHtcbiAgICAgICAgICAgICAgICBJTi5pbml0KHtcbiAgICAgICAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvbkxvYWQ6IHRoaXMub25MaW5rZWRJbkxvYWQoKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgSU4uRXZlbnQub24oSU4sICdhdXRoJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoSU4uVXNlci5pc0F1dGhvcml6ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSU4uQVBJLlJhdyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Blb3BsZS9+OihpZCxmaXJzdC1uYW1lLGxhc3QtbmFtZSxlbWFpbC1hZGRyZXNzLHBpY3R1cmUtdXJsKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICkucmVzdWx0KChyZXM6IExpbmtlZEluUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuZHJhd1VzZXIocmVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25MaW5rZWRJbkxvYWQoKSB7XG4gICAgICAgIElOLkV2ZW50Lm9uKElOLCAnc3lzdGVtUmVhZHknLCAoKSA9PiB7XG4gICAgICAgICAgICBJTi5Vc2VyLnJlZnJlc2goKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZHJhd1VzZXIocmVzcG9uc2U6IExpbmtlZEluUmVzcG9uc2UpOiBTb2NpYWxVc2VyIHtcblxuICAgICAgICBjb25zdCB1c2VyOiBTb2NpYWxVc2VyID0gbmV3IFNvY2lhbFVzZXIoKTtcbiAgICAgICAgdXNlci5pZCA9IHJlc3BvbnNlLmlkO1xuICAgICAgICB1c2VyLm5hbWUgPSByZXNwb25zZS5maXJzdE5hbWUgKyAnICcgKyByZXNwb25zZS5sYXN0TmFtZTtcbiAgICAgICAgdXNlci5lbWFpbCA9IHJlc3BvbnNlLmVtYWlsQWRkcmVzcztcbiAgICAgICAgdXNlci5pbWFnZSA9IHJlc3BvbnNlLnBpY3R1cmVVcmw7XG4gICAgICAgIHVzZXIuYWNjZXNzVG9rZW4gPSBJTi5FTlYuYXV0aC5vYXV0aF90b2tlbjtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgc2lnbkluKCk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgSU4uVXNlci5hdXRob3JpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIElOLkFQSS5SYXcoJy9wZW9wbGUvfjooaWQsZmlyc3QtbmFtZSxsYXN0LW5hbWUsZW1haWwtYWRkcmVzcyxwaWN0dXJlLXVybCknKS5yZXN1bHQoKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbGlua2VkaW4nLCByZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuZHJhd1VzZXIocmVzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbk91dCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgSU4uVXNlci5sb2dvdXQoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIHNoYXJpbmcoc2hhcmU/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAnY29tbWVudCc6IHNoYXJlID8gc2hhcmUuY29tbWVudCA6ICcnLFxuICAgICAgICAgICAgICAgICd2aXNpYmlsaXR5Jzoge1xuICAgICAgICAgICAgICAgICAgICAnY29kZSc6ICdhbnlvbmUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIElOLkFQSS5SYXcoJy9wZW9wbGUvfi9zaGFyZXM/Zm9ybWF0PWpzb24nKVxuICAgICAgICAgICAgICAgIC5tZXRob2QoJ1BPU1QnKVxuICAgICAgICAgICAgICAgIC5ib2R5KEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKVxuICAgICAgICAgICAgICAgIC5yZXN1bHQoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsaW5rZWRpbiBzaGFyZScsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZXJyb3Iob25FcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsaW5rZWRpbicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtMb2dpblBy