@greg-md/ng-facebook
Version:
Using Facebook SDK with Angular.
286 lines (285 loc) • 23.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Inject, Injectable, NgZone, PLATFORM_ID } from '@angular/core';
import { isPlatformServer } from '@angular/common';
import { Observable, ReplaySubject } from 'rxjs';
import { tap, map } from 'rxjs/operators';
import * as i0 from "@angular/core";
/**
* @record
*/
export function FacebookInitParams() { }
function FacebookInitParams_tsickle_Closure_declarations() {
/** @type {?|undefined} */
FacebookInitParams.prototype.appId;
/** @type {?|undefined} */
FacebookInitParams.prototype.status;
/** @type {?|undefined} */
FacebookInitParams.prototype.xfbml;
/** @type {?|undefined} */
FacebookInitParams.prototype.version;
}
/**
* @record
*/
export function FacebookAuth() { }
function FacebookAuth_tsickle_Closure_declarations() {
/** @type {?} */
FacebookAuth.prototype.accessToken;
/** @type {?} */
FacebookAuth.prototype.expiresIn;
/** @type {?} */
FacebookAuth.prototype.signedRequest;
/** @type {?} */
FacebookAuth.prototype.userID;
}
/**
* @record
*/
export function FacebookLoginResponse() { }
function FacebookLoginResponse_tsickle_Closure_declarations() {
/** @type {?} */
FacebookLoginResponse.prototype.status;
/** @type {?} */
FacebookLoginResponse.prototype.authResponse;
}
/**
* @record
*/
export function FacebookLoginOptions() { }
function FacebookLoginOptions_tsickle_Closure_declarations() {
/** @type {?|undefined} */
FacebookLoginOptions.prototype.auth_type;
/** @type {?|undefined} */
FacebookLoginOptions.prototype.scope;
/** @type {?|undefined} */
FacebookLoginOptions.prototype.return_scopes;
/** @type {?|undefined} */
FacebookLoginOptions.prototype.enable_profile_selector;
/** @type {?|undefined} */
FacebookLoginOptions.prototype.profile_selector_ids;
}
/**
* @record
*/
export function FacebookApiError() { }
function FacebookApiError_tsickle_Closure_declarations() {
/** @type {?} */
FacebookApiError.prototype.message;
}
/** @enum {string} */
const FacebookApiMethod = {
Get: 'get',
Post: 'post',
Delete: 'delete',
};
export { FacebookApiMethod };
/**
* @record
*/
export function FacebookApiParams() { }
function FacebookApiParams_tsickle_Closure_declarations() {
/* TODO: handle strange member:
[propName: string]: any;
*/
}
/**
* @record
*/
export function Facebook() { }
function Facebook_tsickle_Closure_declarations() {
/** @type {?} */
Facebook.prototype.XFBML;
/** @type {?} */
Facebook.prototype.init;
/** @type {?} */
Facebook.prototype.login;
/** @type {?} */
Facebook.prototype.api;
}
export const /** @type {?} */ FACEBOOK_DEFAULTS = {
xfbml: false,
version: 'v3.0'
};
export class FacebookService {
/**
* @param {?} ngZone
* @param {?} platformId
*/
constructor(ngZone, platformId) {
this.ngZone = ngZone;
this.platformId = platformId;
this.sdk = new ReplaySubject(1);
}
/**
* @param {?=} locale
* @return {?}
*/
load(locale = 'en_US') {
return Observable.create(subscriber => {
if (isPlatformServer(this.platformId)) {
return;
}
this.ngZone.runOutsideAngular(() => {
delete window.FB;
let /** @type {?} */ jsSdk, /** @type {?} */ fbRoot;
if (jsSdk = document.getElementById('facebook-jssdk')) {
jsSdk.parentNode.removeChild(jsSdk);
}
if (fbRoot = document.getElementById('fb-root')) {
fbRoot.parentNode.removeChild(fbRoot);
}
const /** @type {?} */ script = document.createElement('script');
script.id = 'facebook-jssdk';
script.src = '//connect.facebook.net/' + (locale || 'en_US') + '/sdk.js';
script.onload = () => {
this.ngZone.run(() => {
subscriber.next(FB);
subscriber.complete();
});
};
script.onerror = () => {
this.ngZone.run(() => {
subscriber.error('Facebook SDK could not be loaded.');
subscriber.complete();
});
};
document.head.appendChild(script);
});
}).pipe(map((sdk) => {
this.sdk.next(sdk);
return sdk;
}));
}
/**
* @param {?=} params
* @param {?=} locale
* @return {?}
*/
init(params = {}, locale = 'en_US') {
return this.load(locale).pipe(tap(sdk => {
params = Object.assign({}, FACEBOOK_DEFAULTS, params);
sdk.init(params);
this.reloadRenderedElements().subscribe();
}));
}
/**
* @param {?=} options
* @return {?}
*/
login(options) {
return Observable.create(subscriber => {
this.sdk.subscribe(sdk => {
this.ngZone.runOutsideAngular(() => {
sdk.login(response => {
this.ngZone.run(() => {
if (response.authResponse) {
subscriber.next(response.authResponse);
}
else {
subscriber.error(response);
}
subscriber.complete();
});
}, options);
});
});
});
}
/**
* @param {?} path
* @param {?=} method
* @param {?=} params
* @return {?}
*/
api(path, method, params) {
return Observable.create(subscriber => {
this.sdk.subscribe(sdk => {
this.ngZone.runOutsideAngular(() => {
sdk.api(path, method, params, response => {
this.ngZone.run(() => {
if (response && !response.error) {
subscriber.next(response);
}
else {
subscriber.error(response ? response.error : null);
}
subscriber.complete();
});
});
});
});
});
}
/**
* @param {?} element
* @return {?}
*/
parse(element) {
return Observable.create(subscriber => {
this.sdk.subscribe(sdk => {
this.ngZone.runOutsideAngular(() => {
sdk.XFBML.parse(element, () => {
this.ngZone.run(() => {
subscriber.next(element);
subscriber.complete();
});
});
});
});
});
}
/**
* @return {?}
*/
reloadRenderedElements() {
return Observable.create(subscriber => {
this.sdk.subscribe(sdk => {
const /** @type {?} */ elements = document.querySelectorAll('[fb-xfbml-state="rendered"]');
let /** @type {?} */ processing = elements.length;
Array.from(elements).forEach(node => {
this.ngZone.runOutsideAngular(() => {
sdk.XFBML.parse(node.parentElement, () => {
this.ngZone.run(() => {
--processing;
subscriber.next(node.parentElement);
if (processing <= 0) {
subscriber.complete();
}
});
});
});
});
});
});
}
}
FacebookService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
FacebookService.ctorParameters = () => [
{ type: NgZone, },
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] },] },
];
/** @nocollapse */ FacebookService.ngInjectableDef = i0.defineInjectable({ factory: function FacebookService_Factory() { return new FacebookService(i0.inject(i0.NgZone), i0.inject(i0.PLATFORM_ID)); }, token: FacebookService, providedIn: "root" });
function FacebookService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
FacebookService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
FacebookService.ctorParameters;
/** @type {?} */
FacebookService.prototype.sdk;
/** @type {?} */
FacebookService.prototype.ngZone;
/** @type {?} */
FacebookService.prototype.platformId;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZWJvb2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BncmVnLW1kL25nLWZhY2Vib29rLyIsInNvdXJjZXMiOlsibGliL2ZhY2Vib29rLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBa0NsQyxLQUFLO1VBQ0osTUFBTTtZQUNKLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJuQixNQUFNLENBQUMsdUJBQU0saUJBQWlCLEdBQXVCO0lBQ25ELEtBQUssRUFBRSxLQUFLO0lBQ1osT0FBTyxFQUFFLE1BQU07Q0FDaEIsQ0FBQztBQVdGLE1BQU07Ozs7O0lBR0osWUFDVSxRQUNxQjtRQURyQixXQUFNLEdBQU4sTUFBTTtRQUNlLGVBQVUsR0FBVixVQUFVO21CQUpuQyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUM7S0FNbkM7Ozs7O0lBRUQsSUFBSSxDQUFDLFNBQWlCLE9BQU87UUFDM0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDO2FBQ1I7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcs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Q0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dDQUVwQyxFQUFFLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDcEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lDQUN2Qjs2QkFDRixDQUFDLENBQUM7eUJBQ0osQ0FBQyxDQUFDO3FCQUNKLENBQUMsQ0FBQztpQkFDSixDQUFDLENBQUM7YUFDSixDQUFDLENBQUM7U0FDSixDQUFDLENBQUM7S0FDSjs7O1lBeEpGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7OztZQWpGNEIsTUFBTTs0Q0F1RjlCLE1BQU0sU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZhY2Vib29rSW5pdFBhcmFtcyB7XG4gIGFwcElkPzogc3RyaW5nO1xuICBzdGF0dXM/OiBib29sZWFuO1xuICB4ZmJtbD86IGJvb2xlYW47XG4gIHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFjZWJvb2tBdXRoIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgZXhwaXJlc0luOiBudW1iZXI7XG4gIHNpZ25lZFJlcXVlc3Q6IHN0cmluZztcbiAgdXNlcklEOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFjZWJvb2tMb2dpblJlc3BvbnNlIHtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGF1dGhSZXNwb25zZTogRmFjZWJvb2tBdXRoO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhY2Vib29rTG9naW5PcHRpb25zIHtcbiAgYXV0aF90eXBlPzogJ3JlcmVxdWVzdCc7XG4gIHNjb3BlPzogc3RyaW5nO1xuICByZXR1cm5fc2NvcGVzPzogYm9vbGVhbjtcbiAgZW5hYmxlX3Byb2ZpbGVfc2VsZWN0b3I/OiBib29sZWFuO1xuICBwcm9maWxlX3NlbGVjdG9yX2lkcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGYWNlYm9va0FwaUVycm9yIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBGYWNlYm9va0FwaU1ldGhvZCB7XG4gIEdldCA9ICdnZXQnLFxuICBQb3N0ID0gJ3Bvc3QnLFxuICBEZWxldGUgPSAnZGVsZXRlJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGYWNlYm9va0FwaVBhcmFtcyB7XG4gIFtwcm9wTmFtZTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBGYWNlYm9va0FwaUNhbGxiYWNrID0gKHJlc3BvbnNlPzoge1xuICAgIGVycm9yPzogRmFjZWJvb2tBcGlFcnJvcjtcbiAgICBbcHJvcE5hbWU6IHN0cmluZ106IGFueTtcbiAgfSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBGYWNlYm9vayB7XG4gIFhGQk1MOiB7XG4gICAgcGFyc2U6IChlbGVtZW50OiBIVE1MRWxlbWVudCwgY2I/OiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICB9O1xuXG4gIGluaXQ6IChwYXJhbXM6IEZhY2Vib29rSW5pdFBhcmFtcykgPT4gdm9pZDtcblxuICBsb2dpbjogKGNhbGxiYWNrPzogKHJlc3BvbnNlOiBGYWNlYm9va0xvZ2luUmVzcG9uc2UpID0+IHZvaWQsIG9wdGlvbnM/OiBGYWNlYm9va0xvZ2luT3B0aW9ucykgPT4gdm9pZDtcblxuICBhcGk6IChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbWV0aG9kPzogRmFjZWJvb2tBcGlNZXRob2QgfCBGYWNlYm9va0FwaVBhcmFtcyB8IEZhY2Vib29rQXBpQ2FsbGJhY2ssXG4gICAgcGFyYW1zPzogRmFjZWJvb2tBcGlQYXJhbXMgfCBGYWNlYm9va0FwaUNhbGxiYWNrLFxuICAgIGNhbGxiYWNrPzogRmFjZWJvb2tBcGlDYWxsYmFja1xuICApID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBGQUNFQk9PS19ERUZBVUxUUzogRmFjZWJvb2tJbml0UGFyYW1zID0ge1xuICB4ZmJtbDogZmFsc2UsXG4gIHZlcnNpb246ICd2My4wJ1xufTtcblxuZGVjbGFyZSBjb25zdCBGQjogRmFjZWJvb2s7XG5cbmRlY2xhcmUgY29uc3Qgd2luZG93OiB7XG4gIEZCOiBGYWNlYm9vaztcbn07XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEZhY2Vib29rU2VydmljZSB7XG4gIHNkayA9IG5ldyBSZXBsYXlTdWJqZWN0PEZhY2Vib29rPigxKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogc3RyaW5nLFxuICApIHtcbiAgfVxuXG4gIGxvYWQobG9jYWxlOiBzdHJpbmcgPSAnZW5fVVMnKTogT2JzZXJ2YWJsZTxGYWNlYm9vaz4ge1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShzdWJzY3JpYmVyID0+IHtcbiAgICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB3aW5kb3cuRkI7XG5cbiAgICAgICAgbGV0IGpzU2RrOiBIVE1MRWxlbWVudCwgZmJSb290OiBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoanNTZGsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFjZWJvb2stanNzZGsnKSkge1xuICAgICAgICAgIGpzU2RrLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoanNTZGspO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZiUm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYi1yb290JykpIHtcbiAgICAgICAgICBmYlJvb3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmYlJvb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG5cbiAgICAgICAgc2NyaXB0LmlkID0gJ2ZhY2Vib29rLWpzc2RrJztcblxuICAgICAgICBzY3JpcHQuc3JjID0gJy8vY29ubmVjdC5mYWNlYm9vay5uZXQvJyArIChsb2NhbGUgfHwgJ2VuX1VTJykgKyAnL3Nkay5qcyc7XG5cbiAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KEZCKTtcblxuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKCdGYWNlYm9vayBTREsgY291bGQgbm90IGJlIGxvYWRlZC4nKTtcblxuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgIH0pO1xuICAgIH0pLnBpcGUobWFwKChzZGs6IEZhY2Vib29rKSA9PiB7XG4gICAgICB0aGlzLnNkay5uZXh0KHNkayk7XG5cbiAgICAgIHJldHVybiBzZGs7XG4gICAgfSkpO1xuICB9XG5cbiAgaW5pdChwYXJhbXM6IEZhY2Vib29rSW5pdFBhcmFtcyA9IHt9LCBsb2NhbGU6IHN0cmluZyA9ICdlbl9VUycpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkKGxvY2FsZSkucGlwZTxGYWNlYm9vaz4odGFwPEZhY2Vib29rPihzZGsgPT4ge1xuICAgICAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgRkFDRUJPT0tfREVGQVVMVFMsIHBhcmFtcyk7XG5cbiAgICAgIHNkay5pbml0KHBhcmFtcyk7XG5cbiAgICAgIHRoaXMucmVsb2FkUmVuZGVyZWRFbGVtZW50cygpLnN1YnNjcmliZSgpO1xuICAgIH0pKTtcbiAgfVxuXG4gIGxvZ2luKG9wdGlvbnM/OiBGYWNlYm9va0xvZ2luT3B0aW9ucyk6IE9ic2VydmFibGU8RmFjZWJvb2tBdXRoPiB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgdGhpcy5zZGsuc3Vic2NyaWJlKHNkayA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICBzZGsubG9naW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmF1dGhSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXNwb25zZS5hdXRoUmVzcG9uc2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhcGkocGF0aDogc3RyaW5nLCBtZXRob2Q/OiBGYWNlYm9va0FwaU1ldGhvZCB8IEZhY2Vib29rQXBpUGFyYW1zLCBwYXJhbXM/OiBGYWNlYm9va0FwaVBhcmFtcyk6IE9ic2VydmFibGU8T2JqZWN0PiB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgdGhpcy5zZGsuc3Vic2NyaWJlKHNkayA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICBzZGsuYXBpKHBhdGgsIG1ldGhvZCwgcGFyYW1zLCByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgIXJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHJlc3BvbnNlID8gcmVzcG9uc2UuZXJyb3IgOiBudWxsKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcGFyc2UoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPEhUTUxFbGVtZW50PiB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgdGhpcy5zZGsuc3Vic2NyaWJlKHNkayA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICBzZGsuWEZCTUwucGFyc2UoZWxlbWVudCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkUmVuZGVyZWRFbGVtZW50cygpOiBPYnNlcnZhYmxlPEhUTUxFbGVtZW50PiB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgdGhpcy5zZGsuc3Vic2NyaWJlKHNkayA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2ZiLXhmYm1sLXN0YXRlPVwicmVuZGVyZWRcIl0nKTtcblxuICAgICAgICBsZXQgcHJvY2Vzc2luZyA9IGVsZW1lbnRzLmxlbmd0aDtcblxuICAgICAgICBBcnJheS5mcm9tKGVsZW1lbnRzKS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHNkay5YRkJNTC5wYXJzZShub2RlLnBhcmVudEVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAtLXByb2Nlc3Npbmc7XG5cbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobm9kZS5wYXJlbnRFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzaW5nIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==