UNPKG

said-ngx-paypal

Version:
447 lines 38 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, } from '@angular/core'; import { Subject } from 'rxjs'; import { PayPalScriptService } from '../services/paypal-script.service'; var NgxPaypalComponent = /** @class */ (function () { function NgxPaypalComponent(paypalScriptService, cdr, ngZone) { this.paypalScriptService = paypalScriptService; this.cdr = cdr; this.ngZone = ngZone; /** * If enabled, paypal SDK script will be loaded. Useful if you want to have multiple PayPal components on the same page * sharing base configuration. In such a case only a single component may register script. */ this.registerScript = true; /** * Emitted when paypal script is loaded */ this.scriptLoaded = new EventEmitter(); this.scriptLoadError = new EventEmitter(); this.ngUnsubscribe = new Subject(); /** * Flag that indicates if paypal should be initialized (required for handling script load events and availability of DOM element) */ this.initializePayPal = true; } Object.defineProperty(NgxPaypalComponent.prototype, "payPalButtonContainer", { set: /** * @param {?} content * @return {?} */ function (content) { this.payPalButtonContainerElem = content; }, enumerable: true, configurable: true }); /** * @param {?} changes * @return {?} */ NgxPaypalComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var _this = this; if (!this.payPalButtonContainerId) { this.payPalButtonContainerId = this.generateElementId(); } // first time config setup /** @type {?} */ var config = this.config; if (changes.config.isFirstChange()) { if (config && this.registerScript) { this.initPayPalScript(config, (/** * @param {?} payPal * @return {?} */ function (payPal) { // store reference to paypal global script _this.payPal = payPal; _this.doPayPalCheck(); })); } } // changes to config if (!changes.config.isFirstChange()) { this.reinitialize(config); } }; /** * @return {?} */ NgxPaypalComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.paypalScriptService.destroyPayPalScript(); this.ngUnsubscribe.next(); this.ngUnsubscribe.complete(); }; /** * @return {?} */ NgxPaypalComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.doPayPalCheck(); }; /** * @param {?} payPal * @return {?} */ NgxPaypalComponent.prototype.customInit = /** * @param {?} payPal * @return {?} */ function (payPal) { this.payPal = payPal; this.doPayPalCheck(); }; /** * @param {?} config * @return {?} */ NgxPaypalComponent.prototype.reinitialize = /** * @param {?} config * @return {?} */ function (config) { var _this = this; this.config = config; this.payPal = undefined; this.paypalScriptService.destroyPayPalScript(); this.payPalButtonContainerId = this.generateElementId(); this.initializePayPal = true; if (this.payPalButtonContainerElem) { while (this.payPalButtonContainerElem.nativeElement.firstChild) { this.payPalButtonContainerElem.nativeElement.removeChild(this.payPalButtonContainerElem.nativeElement.firstChild); } } this.cdr.detectChanges(); if (this.config) { if (!this.payPal) { this.initPayPalScript(this.config, (/** * @param {?} payPal * @return {?} */ function (payPal) { // store reference to paypal global script _this.payPal = payPal; _this.doPayPalCheck(); })); } else { this.doPayPalCheck(); } } }; /** * @private * @return {?} */ NgxPaypalComponent.prototype.doPayPalCheck = /** * @private * @return {?} */ function () { if (this.initializePayPal && this.config && this.payPal && this.payPalButtonContainerElem) { // make sure that id is also set if (this.payPalButtonContainerElem.nativeElement.id) { this.initializePayPal = false; this.initPayPal(this.config, this.payPal); } } }; /** * @private * @param {?} config * @param {?} initPayPal * @return {?} */ NgxPaypalComponent.prototype.initPayPalScript = /** * @private * @param {?} config * @param {?} initPayPal * @return {?} */ function (config, initPayPal) { var _this = this; this.paypalScriptService.registerPayPalScript({ clientId: config.clientId, commit: config.advanced && config.advanced.commit ? config.advanced.commit : undefined, currency: config.currency, extraParams: config.advanced && config.advanced.extraQueryParams ? config.advanced.extraQueryParams : [] }, (/** * @param {?} paypal * @return {?} */ function (paypal) { _this.scriptLoaded.next(paypal); initPayPal(paypal); }), (/** * @param {?} scriptSrc * @return {?} */ function (scriptSrc) { _this.scriptLoadError.emit(scriptSrc); })); }; /** * @private * @return {?} */ NgxPaypalComponent.prototype.generateElementId = /** * @private * @return {?} */ function () { return "ngx-captcha-id-" + new Date().valueOf(); }; /** * @private * @param {?} config * @param {?} paypal * @return {?} */ NgxPaypalComponent.prototype.initPayPal = /** * @private * @param {?} config * @param {?} paypal * @return {?} */ function (config, paypal) { var _this = this; // Running outside angular zone prevents infinite ngDoCheck lifecycle calls this.ngZone.runOutsideAngular((/** * @return {?} */ function () { // https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page paypal.Buttons({ style: config.style, createOrder: (/** * @param {?} data * @param {?} actions * @return {?} */ function (data, actions) { return _this.ngZone.run((/** * @return {?} */ function () { if (config.createOrderOnClient && config.createOrderOnServer) { throw Error("Both 'createOrderOnClient' and 'createOrderOnServer' are defined.\n Please choose one or the other."); } if (!config.createOrderOnClient && !config.createOrderOnServer) { throw Error("Neither 'createOrderOnClient' or 'createOrderOnServer' are defined.\n Please define one of these to create order."); } if (config.createOrderOnClient) { return actions.order.create(config.createOrderOnClient(data)); } if (config.createOrderOnServer) { return config.createOrderOnServer(data); } throw Error("Invalid state for 'createOrder'."); })); }), onApprove: (/** * @param {?} data * @param {?} actions * @return {?} */ function (data, actions) { return _this.ngZone.run((/** * @return {?} */ function () { if (config.onApprove) { config.onApprove(data, actions); } // capture on server if (config.authorizeOnServer) { return config.authorizeOnServer(data, actions); } // capture on client /** @type {?} */ var onClientAuthorization = config.onClientAuthorization; if (onClientAuthorization) { actions.order.capture().then((/** * @param {?} details * @return {?} */ function (details) { onClientAuthorization(details); })); return; } })); }), onError: (/** * @param {?} error * @return {?} */ function (error) { _this.ngZone.run((/** * @return {?} */ function () { if (config.onError) { config.onError(error); } })); }), onCancel: (/** * @param {?} data * @param {?} actions * @return {?} */ function (data, actions) { _this.ngZone.run((/** * @return {?} */ function () { if (config.onCancel) { config.onCancel(data, actions); } })); }), onShippingChange: (/** * @param {?} data * @param {?} actions * @return {?} */ function (data, actions) { return _this.ngZone.run((/** * @return {?} */ function () { if (config.onShippingChange) { return config.onShippingChange(data, actions); } })); }), onClick: (/** * @param {?} data * @param {?} actions * @return {?} */ function (data, actions) { _this.ngZone.run((/** * @return {?} */ function () { if (config.onClick) { config.onClick(data, actions); } })); }), onInit: (/** * @param {?} data * @param {?} actions * @return {?} */ function (data, actions) { _this.ngZone.run((/** * @return {?} */ function () { if (config.onInit) { config.onInit(data, actions); } })); }) }).render("#" + _this.payPalButtonContainerId); })); }; NgxPaypalComponent.decorators = [ { type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngx-paypal', template: "\n <div #payPalButtonContainer [id]=\"payPalButtonContainerId\"></div>\n " }] } ]; /** @nocollapse */ NgxPaypalComponent.ctorParameters = function () { return [ { type: PayPalScriptService }, { type: ChangeDetectorRef }, { type: NgZone } ]; }; NgxPaypalComponent.propDecorators = { config: [{ type: Input }], registerScript: [{ type: Input }], scriptLoaded: [{ type: Output }], scriptLoadError: [{ type: Output }], payPalButtonContainer: [{ type: ViewChild, args: ['payPalButtonContainer', { static: false },] }] }; return NgxPaypalComponent; }()); export { NgxPaypalComponent }; if (false) { /** * Configuration for paypal. * @type {?} */ NgxPaypalComponent.prototype.config; /** * If enabled, paypal SDK script will be loaded. Useful if you want to have multiple PayPal components on the same page * sharing base configuration. In such a case only a single component may register script. * @type {?} */ NgxPaypalComponent.prototype.registerScript; /** * Emitted when paypal script is loaded * @type {?} */ NgxPaypalComponent.prototype.scriptLoaded; /** @type {?} */ NgxPaypalComponent.prototype.scriptLoadError; /** * Id of the element where PayPal button will be rendered * @type {?} */ NgxPaypalComponent.prototype.payPalButtonContainerId; /** * @type {?} * @private */ NgxPaypalComponent.prototype.ngUnsubscribe; /** * @type {?} * @private */ NgxPaypalComponent.prototype.payPalButtonContainerElem; /** * Flag that indicates if paypal should be initialized (required for handling script load events and availability of DOM element) * @type {?} * @private */ NgxPaypalComponent.prototype.initializePayPal; /** * Reference to PayPal global API * @type {?} * @private */ NgxPaypalComponent.prototype.payPal; /** * @type {?} * @private */ NgxPaypalComponent.prototype.paypalScriptService; /** * @type {?} * @private */ NgxPaypalComponent.prototype.cdr; /** * @type {?} * @private */ NgxPaypalComponent.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5cGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NhaWQtbmd4LXBheXBhbC8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3BheXBhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZS9CLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXhFO0lBZ0RJLDRCQUNZLG1CQUF3QyxFQUN4QyxHQUFzQixFQUN0QixNQUFjO1FBRmQsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFROzs7OztRQWpDakIsbUJBQWMsR0FBWSxJQUFJLENBQUM7Ozs7UUFLOUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3ZDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQU90QyxrQkFBYSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDOzs7O1FBVTVELHFCQUFnQixHQUFZLElBQUksQ0FBQztJQVl6QyxDQUFDO0lBbkJELHNCQUEyRCxxREFBcUI7Ozs7O1FBQWhGLFVBQWlGLE9BQW1CO1lBQ2hHLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxPQUFPLENBQUM7UUFDN0MsQ0FBQzs7O09BQUE7Ozs7O0lBbUJELHdDQUFXOzs7O0lBQVgsVUFBWSxPQUFzQjtRQUFsQyxpQkFzQkM7UUFyQkcsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUMvQixJQUFJLENBQUMsdUJBQXVCLEdBQUcs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O0lBRXhDLDJDQUFvRTs7Ozs7SUFFcEUsdURBQStDOzs7Ozs7SUFRL0MsOENBQXlDOzs7Ozs7SUFLekMsb0NBQW9COzs7OztJQUdoQixpREFBZ0Q7Ozs7O0lBQ2hELGlDQUE4Qjs7Ozs7SUFDOUIsb0NBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIElucHV0LFxyXG4gICAgTmdab25lLFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIElDYW5jZWxDYWxsYmFja0RhdGEsXHJcbiAgICBJQ2xpZW50QXV0aG9yaXplQ2FsbGJhY2tEYXRhLFxyXG4gICAgSUNyZWF0ZU9yZGVyQ2FsbGJhY2tBY3Rpb25zLFxyXG4gICAgSUluaXRDYWxsYmFja0RhdGEsXHJcbiAgICBJT25BcHByb3ZlQ2FsbGJhY2tBY3Rpb25zLFxyXG4gICAgSU9uQXBwcm92ZUNhbGxiYWNrRGF0YSxcclxuICAgIElPbkNsaWNrQ2FsbGJhY2tBY3Rpb25zLFxyXG4gICAgSU9uSW5pdENhbGxiYWNrQWN0aW9ucyxcclxuICAgIElPblNoaXBwaW5nQ2hhbmdlQWN0aW9ucyxcclxuICAgIElPblNoaXBwaW5nQ2hhbmdlRGF0YSxcclxuICAgIElQYXlQYWxDb25maWcsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3BheXBhbC1tb2RlbHMnO1xyXG5pbXBvcnQgeyBQYXlQYWxTY3JpcHRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGF5cGFsLXNjcmlwdC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzZWxlY3RvcjogJ25neC1wYXlwYWwnLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgI3BheVBhbEJ1dHRvbkNvbnRhaW5lciBbaWRdPVwicGF5UGFsQnV0dG9uQ29udGFpbmVySWRcIj48L2Rpdj5cclxuICAgIGBcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFBheXBhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIHBheXBhbC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgY29uZmlnPzogSVBheVBhbENvbmZpZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIGVuYWJsZWQsIHBheXBhbCBTREsgc2NyaXB0IHdpbGwgYmUgbG9hZGVkLiBVc2VmdWwgaWYgeW91IHdhbnQgdG8gaGF2ZSBtdWx0aXBsZSBQYXlQYWwgY29tcG9uZW50cyBvbiB0aGUgc2FtZSBwYWdlXHJcbiAgICAgKiBzaGFyaW5nIGJhc2UgY29uZmlndXJhdGlvbi4gSW4gc3VjaCBhIGNhc2Ugb25seSBhIHNpbmdsZSBjb21wb25lbnQgbWF5IHJlZ2lzdGVyIHNjcmlwdC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcmVnaXN0ZXJTY3JpcHQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHRlZCB3aGVuIHBheXBhbCBzY3JpcHQgaXMgbG9hZGVkXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBzY3JpcHRMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBzY3JpcHRMb2FkRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkIG9mIHRoZSBlbGVtZW50IHdoZXJlIFBheVBhbCBidXR0b24gd2lsbCBiZSByZW5kZXJlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGF5UGFsQnV0dG9uQ29udGFpbmVySWQ/OiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZ1Vuc3Vic2NyaWJlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIHBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0/OiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgncGF5UGFsQnV0dG9uQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBwYXlQYWxCdXR0b25Db250YWluZXIoY29udGVudDogRWxlbWVudFJlZikge1xyXG4gICAgICAgIHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbSA9IGNvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHBheXBhbCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgKHJlcXVpcmVkIGZvciBoYW5kbGluZyBzY3JpcHQgbG9hZCBldmVudHMgYW5kIGF2YWlsYWJpbGl0eSBvZiBET00gZWxlbWVudClcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplUGF5UGFsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZmVyZW5jZSB0byBQYXlQYWwgZ2xvYmFsIEFQSVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBheVBhbDogYW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcGF5cGFsU2NyaXB0U2VydmljZTogUGF5UGFsU2NyaXB0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJJZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lcklkID0gdGhpcy5nZW5lcmF0ZUVsZW1lbnRJZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZmlyc3QgdGltZSBjb25maWcgc2V0dXBcclxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXMuY29uZmlnLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIHRoaXMucmVnaXN0ZXJTY3JpcHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBheVBhbFNjcmlwdChjb25maWcsIChwYXlQYWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gcGF5cGFsIGdsb2JhbCBzY3JpcHRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBheVBhbCA9IHBheVBhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUGF5UGFsQ2hlY2soKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGFuZ2VzIHRvIGNvbmZpZ1xyXG4gICAgICAgIGlmICghY2hhbmdlcy5jb25maWcuaXNGaXJzdENoYW5nZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVpbml0aWFsaXplKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF5cGFsU2NyaXB0U2VydmljZS5kZXN0cm95UGF5UGFsU2NyaXB0KCk7XHJcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcclxuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3VzdG9tSW5pdChwYXlQYWw6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF5UGFsID0gcGF5UGFsO1xyXG4gICAgICAgIHRoaXMuZG9QYXlQYWxDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlaW5pdGlhbGl6ZShjb25maWc6IElQYXlQYWxDb25maWcgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcclxuICAgICAgICB0aGlzLnBheVBhbCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnBheXBhbFNjcmlwdFNlcnZpY2UuZGVzdHJveVBheVBhbFNjcmlwdCgpO1xyXG4gICAgICAgIHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVySWQgPSB0aGlzLmdlbmVyYXRlRWxlbWVudElkKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplUGF5UGFsID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbSkge1xyXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXlQYWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBheVBhbFNjcmlwdCh0aGlzLmNvbmZpZywgKHBheVBhbCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gcGF5cGFsIGdsb2JhbCBzY3JpcHRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBheVBhbCA9IHBheVBhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUGF5UGFsQ2hlY2soKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgZG9QYXlQYWxDaGVjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplUGF5UGFsICYmIHRoaXMuY29uZmlnICYmIHRoaXMucGF5UGFsICYmIHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbSkge1xyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBpZCBpcyBhbHNvIHNldFxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQuaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVBheVBhbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UGF5UGFsKHRoaXMuY29uZmlnLCB0aGlzLnBheVBhbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UGF5UGFsU2NyaXB0KGNvbmZpZzogSVBheVBhbENvbmZpZywgaW5pdFBheVBhbDogKHBheXBhbDogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXlwYWxTY3JpcHRTZXJ2aWNlLnJlZ2lzdGVyUGF5UGFsU2NyaXB0KHtcclxuICAgICAgICAgICAgY2xpZW50SWQ6IGNvbmZpZy5jbGllbnRJZCxcclxuICAgICAgICAgICAgY29tbWl0OiBjb25maWcuYWR2YW5jZWQgJiYgY29uZmlnLmFkdmFuY2VkLmNvbW1pdCA/IGNvbmZpZy5hZHZhbmNlZC5jb21taXQgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGN1cnJlbmN5OiBjb25maWcuY3VycmVuY3ksXHJcbiAgICAgICAgICAgIGV4dHJhUGFyYW1zOiBjb25maWcuYWR2YW5jZWQgJiYgY29uZmlnLmFkdmFuY2VkLmV4dHJhUXVlcnlQYXJhbXMgPyBjb25maWcuYWR2YW5jZWQuZXh0cmFRdWVyeVBhcmFtcyA6IFtdXHJcbiAgICAgICAgfSwgKHBheXBhbCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcmlwdExvYWRlZC5uZXh0KHBheXBhbCk7XHJcbiAgICAgICAgICAgIGluaXRQYXlQYWwocGF5cGFsKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgKHNjcmlwdFNyYzogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NyaXB0TG9hZEVycm9yLmVtaXQoc2NyaXB0U3JjKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVFbGVtZW50SWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYG5neC1jYXB0Y2hhLWlkLSR7bmV3IERhdGUoKS52YWx1ZU9mKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQYXlQYWwoY29uZmlnOiBJUGF5UGFsQ29uZmlnLCBwYXlwYWw6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJ1bm5pbmcgb3V0c2lkZSBhbmd1bGFyIHpvbmUgcHJldmVudHMgaW5maW5pdGUgbmdEb0NoZWNrIGxpZmVjeWNsZSBjYWxsc1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIucGF5cGFsLmNvbS9kb2NzL2NoZWNrb3V0L2ludGVncmF0ZS8jMi1hZGQtdGhlLXBheXBhbC1zY3JpcHQtdG8teW91ci13ZWItcGFnZVxyXG4gICAgICAgICAgICBwYXlwYWwuQnV0dG9ucyh7XHJcbiAgICAgICAgICAgICAgICBzdHlsZTogY29uZmlnLnN0eWxlLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlT3JkZXI6IChkYXRhOiBhbnksIGFjdGlvbnM6IElDcmVhdGVPcmRlckNhbGxiYWNrQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmNyZWF0ZU9yZGVyT25DbGllbnQgJiYgY29uZmlnLmNyZWF0ZU9yZGVyT25TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBCb3RoICdjcmVhdGVPcmRlck9uQ2xpZW50JyBhbmQgJ2NyZWF0ZU9yZGVyT25TZXJ2ZXInIGFyZSBkZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgY2hvb3NlIG9uZSBvciB0aGUgb3RoZXIuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmNyZWF0ZU9yZGVyT25DbGllbnQgJiYgIWNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTmVpdGhlciAnY3JlYXRlT3JkZXJPbkNsaWVudCcgb3IgJ2NyZWF0ZU9yZGVyT25TZXJ2ZXInIGFyZSBkZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgZGVmaW5lIG9uZSBvZiB0aGVzZSB0byBjcmVhdGUgb3JkZXIuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuY3JlYXRlT3JkZXJPbkNsaWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMub3JkZXIuY3JlYXRlKGNvbmZpZy5jcmVhdGVPcmRlck9uQ2xpZW50KGRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLmNyZWF0ZU9yZGVyT25TZXJ2ZXIoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHN0YXRlIGZvciAnY3JlYXRlT3JkZXInLmApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgICAgICBvbkFwcHJvdmU6IChkYXRhOiBJT25BcHByb3ZlQ2FsbGJhY2tEYXRhLCBhY3Rpb25zOiBJT25BcHByb3ZlQ2FsbGJhY2tBY3Rpb25zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25BcHByb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25BcHByb3ZlKGRhdGEsIGFjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG9uIHNlcnZlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmF1dGhvcml6ZU9uU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLmF1dGhvcml6ZU9uU2VydmVyKGRhdGEsIGFjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG9uIGNsaWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbkNsaWVudEF1dGhvcml6YXRpb24gPSBjb25maWcub25DbGllbnRBdXRob3JpemF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob25DbGllbnRBdXRob3JpemF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLm9yZGVyLmNhcHR1cmUoKS50aGVuKChkZXRhaWxzOiBJQ2xpZW50QXV0aG9yaXplQ2FsbGJhY2tEYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGllbnRBdXRob3JpemF0aW9uKGRldGFpbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgb25FcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKGRhdGE6IElDYW5jZWxDYWxsYmFja0RhdGEsIGFjdGlvbnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25DYW5jZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkNhbmNlbChkYXRhLCBhY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uU2hpcHBpbmdDaGFuZ2U6IChkYXRhOiBJT25TaGlwcGluZ0NoYW5nZURhdGEsIGFjdGlvbnM6IElPblNoaXBwaW5nQ2hhbmdlQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uU2hpcHBpbmdDaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcub25TaGlwcGluZ0NoYW5nZShkYXRhLCBhY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IChkYXRhOiBhbnksIGFjdGlvbnM6IElPbkNsaWNrQ2FsbGJhY2tBY3Rpb25zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25DbGljayhkYXRhLCBhY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uSW5pdDogKGRhdGE6IElJbml0Q2FsbGJhY2tEYXRhLCBhY3Rpb25zOiBJT25Jbml0Q2FsbGJhY2tBY3Rpb25zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkluaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkluaXQoZGF0YSwgYWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkucmVuZGVyKGAjJHt0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lcklkfWApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuIl19