UNPKG

@spartacus/storefront

Version:

Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.

112 lines 24.3 kB
import { ChangeDetectionStrategy, Component, } from '@angular/core'; import { GlobalMessageType, isNotNullable, NotificationType, OCC_USER_ID_ANONYMOUS, } from '@spartacus/core'; import { combineLatest, Subscription } from 'rxjs'; import { filter, first, map, tap } from 'rxjs/operators'; import { StockNotificationDialogComponent } from './stock-notification-dialog/stock-notification-dialog.component'; import * as i0 from "@angular/core"; import * as i1 from "../current-product.service"; import * as i2 from "@spartacus/core"; import * as i3 from "../../../shared/components/modal/modal.service"; import * as i4 from "../../../shared/components/spinner/spinner.component"; import * as i5 from "@angular/common"; import * as i6 from "@angular/router"; export class StockNotificationComponent { constructor(currentProductService, globalMessageService, translationService, interestsService, modalService, notificationPrefService, userIdService) { this.currentProductService = currentProductService; this.globalMessageService = globalMessageService; this.translationService = translationService; this.interestsService = interestsService; this.modalService = modalService; this.notificationPrefService = notificationPrefService; this.userIdService = userIdService; this.anonymous = true; this.enabledPrefs = []; this.subscriptions = new Subscription(); } ngOnInit() { this.outOfStock$ = combineLatest([ this.currentProductService.getProduct().pipe(filter(isNotNullable)), this.userIdService.getUserId(), ]).pipe(tap(([product, userId]) => { this.productCode = product.code; if (userId !== OCC_USER_ID_ANONYMOUS) { this.anonymous = false; this.notificationPrefService.loadPreferences(); this.interestsService.loadProductInterests(null, null, null, product.code, NotificationType.BACK_IN_STOCK); } }), map(([product]) => !!product.stock && product.stock.stockLevelStatus === 'outOfStock')); this.hasProductInterests$ = this.interestsService .getProductInterests() .pipe(map((interests) => !!interests.results && interests.results.length === 1)); this.subscribeSuccess$ = this.interestsService.getAddProductInterestSuccess(); this.isRemoveInterestLoading$ = this.interestsService.getRemoveProdutInterestLoading(); this.prefsEnabled$ = this.notificationPrefService .getEnabledPreferences() .pipe(tap((prefs) => (this.enabledPrefs = prefs)), map((prefs) => prefs.length > 0)); this.subscriptions.add(this.interestsService.getAddProductInterestError().subscribe((error) => { if (error) { this.onInterestAddingError(); } })); this.subscriptions.add(this.interestsService .getRemoveProdutInterestSuccess() .subscribe((success) => { if (success) { this.onInterestRemovingSuccess(); } })); } subscribe() { this.openDialog(); this.interestsService.addProductInterest(this.productCode, NotificationType.BACK_IN_STOCK); } unsubscribe() { this.interestsService.removeProdutInterest({ product: { code: this.productCode, }, productInterestEntry: [ { interestType: NotificationType.BACK_IN_STOCK, }, ], }, true); } onInterestRemovingSuccess() { this.subscriptions.add(this.translationService .translate('stockNotification.unsubscribeSuccess') .pipe(first()) .subscribe((text) => this.globalMessageService.add(text, GlobalMessageType.MSG_TYPE_INFO))); this.interestsService.resetRemoveInterestState(); } onInterestAddingError() { this.modalService.dismissActiveModal(); this.interestsService.resetAddInterestState(); } openDialog() { const modalInstance = this.modalService.open(StockNotificationDialogComponent, { centered: true, size: 'lg', }).componentInstance; modalInstance.subscribeSuccess$ = this.subscribeSuccess$; modalInstance.enabledPrefs = this.enabledPrefs; } ngOnDestroy() { this.subscriptions.unsubscribe(); this.interestsService.clearProductInterests(); this.notificationPrefService.clearPreferences(); } } StockNotificationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: StockNotificationComponent, deps: [{ token: i1.CurrentProductService }, { token: i2.GlobalMessageService }, { token: i2.TranslationService }, { token: i2.UserInterestsService }, { token: i3.ModalService }, { token: i2.UserNotificationPreferenceService }, { token: i2.UserIdService }], target: i0.ɵɵFactoryTarget.Component }); StockNotificationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: StockNotificationComponent, selector: "cx-stock-notification", ngImport: i0, template: "<ng-container *ngIf=\"outOfStock$ | async\">\n <ng-container *ngIf=\"!(hasProductInterests$ | async); else stopNotify\">\n <ng-container *ngIf=\"prefsEnabled$ | async; else disableNotify\">\n <div class=\"stock-notification-notes\">\n <p>{{ 'stockNotification.getNotified' | cxTranslate }}</p>\n </div>\n <button\n class=\"btn btn-primary btn-block btn-notify\"\n type=\"button\"\n (click)=\"subscribe()\"\n >\n {{ 'stockNotification.notifyMe' | cxTranslate }}\n </button>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<ng-template #disableNotify>\n <div class=\"stock-notification-notes\" id=\"outOfStockMessage\">\n <p>\n <ng-container *ngIf=\"anonymous; else loggedIn\">\n <a [routerLink]=\"{ cxRoute: 'login' } | cxUrl\">\n {{ 'miniLogin.signInRegister' | cxTranslate }}</a\n >\n {{ 'stockNotification.getNotifySuffix' | cxTranslate }}<br />\n </ng-container>\n <ng-template #loggedIn>\n {{ 'stockNotification.getNotify' | cxTranslate }}<br />\n {{ 'stockNotification.activateChannelsPrefix' | cxTranslate\n }}<a [routerLink]=\"['/my-account/notification-preference']\">{{\n 'stockNotification.channelsLink' | cxTranslate\n }}</a\n >{{ 'stockNotification.activateChannelsSuffix' | cxTranslate }}\n </ng-template>\n </p>\n </div>\n <button\n class=\"btn btn-primary btn-block btn-notify\"\n type=\"button\"\n disabled=\"true\"\n aria-describedby=\"outOfStockMessage\"\n >\n {{ 'stockNotification.notifyMe' | cxTranslate }}\n </button>\n</ng-template>\n\n<ng-template #stopNotify>\n <ng-container *ngIf=\"!(isRemoveInterestLoading$ | async); else loading\">\n <div class=\"stock-notification-notes\">\n <p>{{ 'stockNotification.notified' | cxTranslate }}</p>\n </div>\n <button\n class=\"btn btn-primary btn-block btn-stop-notify\"\n type=\"button\"\n (click)=\"unsubscribe()\"\n >\n {{ 'stockNotification.stopNotify' | cxTranslate }}\n </button>\n </ng-container>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"cx-dialog-body modal-body\">\n <div class=\"cx-dialog-row\">\n <div class=\"col-sm-12\">\n <cx-spinner></cx-spinner>\n </div>\n </div>\n </div>\n</ng-template>\n", components: [{ type: i4.SpinnerComponent, selector: "cx-spinner" }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }], pipes: { "async": i5.AsyncPipe, "cxTranslate": i2.TranslatePipe, "cxUrl": i2.UrlPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: StockNotificationComponent, decorators: [{ type: Component, args: [{ selector: 'cx-stock-notification', templateUrl: './stock-notification.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.CurrentProductService }, { type: i2.GlobalMessageService }, { type: i2.TranslationService }, { type: i2.UserInterestsService }, { type: i3.ModalService }, { type: i2.UserNotificationPreferenceService }, { type: i2.UserIdService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2stbm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLWNvbXBvbmVudHMvcHJvZHVjdC9zdG9jay1ub3RpZmljYXRpb24vc3RvY2stbm90aWZpY2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLWNvbXBvbmVudHMvcHJvZHVjdC9zdG9jay1ub3RpZmljYXRpb24vc3RvY2stbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsYUFBYSxFQUViLGdCQUFnQixFQUNoQixxQkFBcUIsR0FNdEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekQsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0saUVBQWlFLENBQUM7Ozs7Ozs7O0FBT25ILE1BQU0sT0FBTywwQkFBMEI7SUFZckMsWUFDVSxxQkFBNEMsRUFDNUMsb0JBQTBDLEVBQzFDLGtCQUFzQyxFQUN0QyxnQkFBc0MsRUFDdEMsWUFBMEIsRUFDMUIsdUJBQTBELEVBQzFELGFBQTRCO1FBTjVCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBc0I7UUFD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QWlCLENBQUM7UUFDcEIsYUFBYSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN6RCxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDakQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ2xELENBQUM7O3VIQTVJVSwwQkFBMEI7MkdBQTFCLDBCQUEwQiw2REM5QnZDLGd6RUFzRUE7MkZEeENhLDBCQUEwQjtrQkFMdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxXQUFXLEVBQUUscUNBQXFDO29CQUNsRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBHbG9iYWxNZXNzYWdlU2VydmljZSxcbiAgR2xvYmFsTWVzc2FnZVR5cGUsXG4gIGlzTm90TnVsbGFibGUsXG4gIE5vdGlmaWNhdGlvblByZWZlcmVuY2UsXG4gIE5vdGlmaWNhdGlvblR5cGUsXG4gIE9DQ19VU0VSX0lEX0FOT05ZTU9VUyxcbiAgUHJvZHVjdCxcbiAgVHJhbnNsYXRpb25TZXJ2aWNlLFxuICBVc2VySWRTZXJ2aWNlLFxuICBVc2VySW50ZXJlc3RzU2VydmljZSxcbiAgVXNlck5vdGlmaWNhdGlvblByZWZlcmVuY2VTZXJ2aWNlLFxufSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRzL21vZGFsL21vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VycmVudFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnLi4vY3VycmVudC1wcm9kdWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvY2tOb3RpZmljYXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3N0b2NrLW5vdGlmaWNhdGlvbi1kaWFsb2cvc3RvY2stbm90aWZpY2F0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjeC1zdG9jay1ub3RpZmljYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RvY2stbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0b2NrTm90aWZpY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBoYXNQcm9kdWN0SW50ZXJlc3RzJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcHJlZnNFbmFibGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgb3V0T2ZTdG9jayQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIGlzUmVtb3ZlSW50ZXJlc3RMb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgYW5vbnltb3VzID0gdHJ1ZTtcblxuICBwcml2YXRlIGVuYWJsZWRQcmVmczogTm90aWZpY2F0aW9uUHJlZmVyZW5jZVtdID0gW107XG4gIHByaXZhdGUgcHJvZHVjdENvZGU6IHN0cmluZztcbiAgcHJpdmF0ZSBzdWJzY3JpYmVTdWNjZXNzJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY3VycmVudFByb2R1Y3RTZXJ2aWNlOiBDdXJyZW50UHJvZHVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnbG9iYWxNZXNzYWdlU2VydmljZTogR2xvYmFsTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGludGVyZXN0c1NlcnZpY2U6IFVzZXJJbnRlcmVzdHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25QcmVmU2VydmljZTogVXNlck5vdGlmaWNhdGlvblByZWZlcmVuY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlcklkU2VydmljZTogVXNlcklkU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRPZlN0b2NrJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jdXJyZW50UHJvZHVjdFNlcnZpY2UuZ2V0UHJvZHVjdCgpLnBpcGUoZmlsdGVyKGlzTm90TnVsbGFibGUpKSxcbiAgICAgIHRoaXMudXNlcklkU2VydmljZS5nZXRVc2VySWQoKSxcbiAgICBdKS5waXBlKFxuICAgICAgdGFwKChbcHJvZHVjdCwgdXNlcklkXSkgPT4ge1xuICAgICAgICB0aGlzLnByb2R1Y3RDb2RlID0gcHJvZHVjdC5jb2RlO1xuICAgICAgICBpZiAodXNlcklkICE9PSBPQ0NfVVNFUl9JRF9BTk9OWU1PVVMpIHtcbiAgICAgICAgICB0aGlzLmFub255bW91cyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uUHJlZlNlcnZpY2UubG9hZFByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgdGhpcy5pbnRlcmVzdHNTZXJ2aWNlLmxvYWRQcm9kdWN0SW50ZXJlc3RzKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvZHVjdC5jb2RlLFxuICAgICAgICAgICAgTm90aWZpY2F0aW9uVHlwZS5CQUNLX0lOX1NUT0NLXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAoXG4gICAgICAgIChbcHJvZHVjdF06IFtQcm9kdWN0LCBTdHJpbmddKSA9PlxuICAgICAgICAgICEhcHJvZHVjdC5zdG9jayAmJiBwcm9kdWN0LnN0b2NrLnN0b2NrTGV2ZWxTdGF0dXMgPT09ICdvdXRPZlN0b2NrJ1xuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmhhc1Byb2R1Y3RJbnRlcmVzdHMkID0gdGhpcy5pbnRlcmVzdHNTZXJ2aWNlXG4gICAgICAuZ2V0UHJvZHVjdEludGVyZXN0cygpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKFxuICAgICAgICAgIChpbnRlcmVzdHMpID0+ICEhaW50ZXJlc3RzLnJlc3VsdHMgJiYgaW50ZXJlc3RzLnJlc3VsdHMubGVuZ3RoID09PSAxXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgdGhpcy5zdWJzY3JpYmVTdWNjZXNzJCA9XG4gICAgICB0aGlzLmludGVyZXN0c1NlcnZpY2UuZ2V0QWRkUHJvZHVjdEludGVyZXN0U3VjY2VzcygpO1xuICAgIHRoaXMuaXNSZW1vdmVJbnRlcmVzdExvYWRpbmckID1cbiAgICAgIHRoaXMuaW50ZXJlc3RzU2VydmljZS5nZXRSZW1vdmVQcm9kdXRJbnRlcmVzdExvYWRpbmcoKTtcbiAgICB0aGlzLnByZWZzRW5hYmxlZCQgPSB0aGlzLm5vdGlmaWNhdGlvblByZWZTZXJ2aWNlXG4gICAgICAuZ2V0RW5hYmxlZFByZWZlcmVuY2VzKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHByZWZzKSA9PiAodGhpcy5lbmFibGVkUHJlZnMgPSBwcmVmcykpLFxuICAgICAgICBtYXAoKHByZWZzKSA9PiBwcmVmcy5sZW5ndGggPiAwKVxuICAgICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmludGVyZXN0c1NlcnZpY2UuZ2V0QWRkUHJvZHVjdEludGVyZXN0RXJyb3IoKS5zdWJzY3JpYmUoKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHRoaXMub25JbnRlcmVzdEFkZGluZ0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5pbnRlcmVzdHNTZXJ2aWNlXG4gICAgICAgIC5nZXRSZW1vdmVQcm9kdXRJbnRlcmVzdFN1Y2Nlc3MoKVxuICAgICAgICAuc3Vic2NyaWJlKChzdWNjZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMub25JbnRlcmVzdFJlbW92aW5nU3VjY2VzcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc3Vic2NyaWJlKCkge1xuICAgIHRoaXMub3BlbkRpYWxvZygpO1xuICAgIHRoaXMuaW50ZXJlc3RzU2VydmljZS5hZGRQcm9kdWN0SW50ZXJlc3QoXG4gICAgICB0aGlzLnByb2R1Y3RDb2RlLFxuICAgICAgTm90aWZpY2F0aW9uVHlwZS5CQUNLX0lOX1NUT0NLXG4gICAgKTtcbiAgfVxuXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIHRoaXMuaW50ZXJlc3RzU2VydmljZS5yZW1vdmVQcm9kdXRJbnRlcmVzdChcbiAgICAgIHtcbiAgICAgICAgcHJvZHVjdDoge1xuICAgICAgICAgIGNvZGU6IHRoaXMucHJvZHVjdENvZGUsXG4gICAgICAgIH0sXG4gICAgICAgIHByb2R1Y3RJbnRlcmVzdEVudHJ5OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW50ZXJlc3RUeXBlOiBOb3RpZmljYXRpb25UeXBlLkJBQ0tfSU5fU1RPQ0ssXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb25JbnRlcmVzdFJlbW92aW5nU3VjY2VzcygpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2VcbiAgICAgICAgLnRyYW5zbGF0ZSgnc3RvY2tOb3RpZmljYXRpb24udW5zdWJzY3JpYmVTdWNjZXNzJylcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgodGV4dCkgPT5cbiAgICAgICAgICB0aGlzLmdsb2JhbE1lc3NhZ2VTZXJ2aWNlLmFkZCh0ZXh0LCBHbG9iYWxNZXNzYWdlVHlwZS5NU0dfVFlQRV9JTkZPKVxuICAgICAgICApXG4gICAgKTtcbiAgICB0aGlzLmludGVyZXN0c1NlcnZpY2UucmVzZXRSZW1vdmVJbnRlcmVzdFN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIG9uSW50ZXJlc3RBZGRpbmdFcnJvcigpIHtcbiAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWN0aXZlTW9kYWwoKTtcbiAgICB0aGlzLmludGVyZXN0c1NlcnZpY2UucmVzZXRBZGRJbnRlcmVzdFN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5EaWFsb2coKSB7XG4gICAgY29uc3QgbW9kYWxJbnN0YW5jZSA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oXG4gICAgICBTdG9ja05vdGlmaWNhdGlvbkRpYWxvZ0NvbXBvbmVudCxcbiAgICAgIHtcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICAgIHNpemU6ICdsZycsXG4gICAgICB9XG4gICAgKS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBtb2RhbEluc3RhbmNlLnN1YnNjcmliZVN1Y2Nlc3MkID0gdGhpcy5zdWJzY3JpYmVTdWNjZXNzJDtcbiAgICBtb2RhbEluc3RhbmNlLmVuYWJsZWRQcmVmcyA9IHRoaXMuZW5hYmxlZFByZWZzO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbnRlcmVzdHNTZXJ2aWNlLmNsZWFyUHJvZHVjdEludGVyZXN0cygpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uUHJlZlNlcnZpY2UuY2xlYXJQcmVmZXJlbmNlcygpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwib3V0T2ZTdG9jayQgfCBhc3luY1wiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShoYXNQcm9kdWN0SW50ZXJlc3RzJCB8IGFzeW5jKTsgZWxzZSBzdG9wTm90aWZ5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZWZzRW5hYmxlZCQgfCBhc3luYzsgZWxzZSBkaXNhYmxlTm90aWZ5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RvY2stbm90aWZpY2F0aW9uLW5vdGVzXCI+XG4gICAgICAgIDxwPnt7ICdzdG9ja05vdGlmaWNhdGlvbi5nZXROb3RpZmllZCcgfCBjeFRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tYmxvY2sgYnRuLW5vdGlmeVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwic3Vic2NyaWJlKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnc3RvY2tOb3RpZmljYXRpb24ubm90aWZ5TWUnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2Rpc2FibGVOb3RpZnk+XG4gIDxkaXYgY2xhc3M9XCJzdG9jay1ub3RpZmljYXRpb24tbm90ZXNcIiBpZD1cIm91dE9mU3RvY2tNZXNzYWdlXCI+XG4gICAgPHA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYW5vbnltb3VzOyBlbHNlIGxvZ2dlZEluXCI+XG4gICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cInsgY3hSb3V0ZTogJ2xvZ2luJyB9IHwgY3hVcmxcIj5cbiAgICAgICAgICB7eyAnbWluaUxvZ2luLnNpZ25JblJlZ2lzdGVyJyB8IGN4VHJhbnNsYXRlIH19PC9hXG4gICAgICAgID5cbiAgICAgICAge3sgJ3N0b2NrTm90aWZpY2F0aW9uLmdldE5vdGlmeVN1ZmZpeCcgfCBjeFRyYW5zbGF0ZSB9fTxiciAvPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2xvZ2dlZEluPlxuICAgICAgICB7eyAnc3RvY2tOb3RpZmljYXRpb24uZ2V0Tm90aWZ5JyB8IGN4VHJhbnNsYXRlIH19PGJyIC8+XG4gICAgICAgIHt7ICdzdG9ja05vdGlmaWNhdGlvbi5hY3RpdmF0ZUNoYW5uZWxzUHJlZml4JyB8IGN4VHJhbnNsYXRlXG4gICAgICAgIH19PGEgW3JvdXRlckxpbmtdPVwiWycvbXktYWNjb3VudC9ub3RpZmljYXRpb24tcHJlZmVyZW5jZSddXCI+e3tcbiAgICAgICAgICAnc3RvY2tOb3RpZmljYXRpb24uY2hhbm5lbHNMaW5rJyB8IGN4VHJhbnNsYXRlXG4gICAgICAgIH19PC9hXG4gICAgICAgID57eyAnc3RvY2tOb3RpZmljYXRpb24uYWN0aXZhdGVDaGFubmVsc1N1ZmZpeCcgfCBjeFRyYW5zbGF0ZSB9fVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3A+XG4gIDwvZGl2PlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrIGJ0bi1ub3RpZnlcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGRpc2FibGVkPVwidHJ1ZVwiXG4gICAgYXJpYS1kZXNjcmliZWRieT1cIm91dE9mU3RvY2tNZXNzYWdlXCJcbiAgPlxuICAgIHt7ICdzdG9ja05vdGlmaWNhdGlvbi5ub3RpZnlNZScgfCBjeFRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3RvcE5vdGlmeT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoaXNSZW1vdmVJbnRlcmVzdExvYWRpbmckIHwgYXN5bmMpOyBlbHNlIGxvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RvY2stbm90aWZpY2F0aW9uLW5vdGVzXCI+XG4gICAgICA8cD57eyAnc3RvY2tOb3RpZmljYXRpb24ubm90aWZpZWQnIHwgY3hUcmFuc2xhdGUgfX08L3A+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrIGJ0bi1zdG9wLW5vdGlmeVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJ1bnN1YnNjcmliZSgpXCJcbiAgICA+XG4gICAgICB7eyAnc3RvY2tOb3RpZmljYXRpb24uc3RvcE5vdGlmeScgfCBjeFRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGRpdiBjbGFzcz1cImN4LWRpYWxvZy1ib2R5IG1vZGFsLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtZGlhbG9nLXJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMlwiPlxuICAgICAgICA8Y3gtc3Bpbm5lcj48L2N4LXNwaW5uZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19