@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
125 lines • 24 kB
JavaScript
import { Component, HostBinding, HostListener, } from '@angular/core';
import { combineLatest, Subscription } from 'rxjs';
import { distinctUntilChanged, take, tap } from 'rxjs/operators';
import { ICON_TYPE } from '../../../cms-components/misc/icon/index';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
import * as i2 from "../../../layout/launch-dialog/services/launch-dialog.service";
import * as i3 from "../spinner/spinner.component";
import * as i4 from "../../../cms-components/misc/icon/icon.component";
import * as i5 from "../../../cms-components/myaccount/consent-management/components/consent-form/consent-management-form.component";
import * as i6 from "../../../layout/a11y/keyboard-focus/focus.directive";
import * as i7 from "@angular/common";
export class AnonymousConsentDialogComponent {
constructor(config, anonymousConsentsService, el, launchDialogService) {
this.config = config;
this.anonymousConsentsService = anonymousConsentsService;
this.el = el;
this.launchDialogService = launchDialogService;
this.role = 'dialog';
this.modal = true;
this.subscriptions = new Subscription();
this.showLegalDescription = true;
this.iconTypes = ICON_TYPE;
this.requiredConsents = [];
this.focusConfig = {
trap: true,
block: true,
autofocus: 'input[type="checkbox"]',
focusOnEscape: true,
};
if (Boolean(this.config.anonymousConsents)) {
this.showLegalDescription =
this.config.anonymousConsents.showLegalDescriptionInDialog;
if (Boolean(this.config.anonymousConsents.requiredConsents)) {
this.requiredConsents = this.config.anonymousConsents.requiredConsents;
}
}
}
handleClick(event) {
// Close on click outside the dialog window
if (event.target.tagName === this.el.nativeElement.tagName) {
this.close('Cross click');
}
}
ngOnInit() {
this.templates$ = this.anonymousConsentsService.getTemplates();
this.consents$ = this.anonymousConsentsService.getConsents();
this.loading$ = this.anonymousConsentsService.getLoadTemplatesLoading();
}
close(reason) {
this.launchDialogService.closeDialog(reason);
}
rejectAll() {
this.subscriptions.add(combineLatest([this.templates$, this.consents$])
.pipe(take(1), distinctUntilChanged(), tap(([templates, consents]) => templates.forEach((template) => {
const consent = this.getCorrespondingConsent(template, consents);
if (this.anonymousConsentsService.isConsentGiven(consent)) {
if (this.isRequiredConsent(template)) {
return;
}
this.anonymousConsentsService.withdrawConsent(template.id);
}
})))
.subscribe());
this.close('rejectAll');
}
allowAll() {
this.subscriptions.add(combineLatest([this.templates$, this.consents$])
.pipe(take(1), distinctUntilChanged(), tap(([templates, consents]) => templates.forEach((template) => {
const consent = this.getCorrespondingConsent(template, consents);
if ((consent && consent.consentState == null) ||
this.anonymousConsentsService.isConsentWithdrawn(consent)) {
if (this.isRequiredConsent(template)) {
return;
}
this.anonymousConsentsService.giveConsent(template.id);
}
})))
.subscribe());
this.close('allowAll');
}
isRequiredConsent(template) {
return (Boolean(this.config.anonymousConsents) &&
Boolean(this.config.anonymousConsents.requiredConsents) &&
this.config.anonymousConsents.requiredConsents.includes(template.id));
}
onConsentChange({ given, template, }) {
if (given) {
this.anonymousConsentsService.giveConsent(template.id);
}
else {
this.anonymousConsentsService.withdrawConsent(template.id);
}
}
getCorrespondingConsent(template, consents = []) {
for (const consent of consents) {
if (template.id === consent.templateCode) {
return consent;
}
}
return null;
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
AnonymousConsentDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AnonymousConsentDialogComponent, deps: [{ token: i1.AnonymousConsentsConfig }, { token: i1.AnonymousConsentsService }, { token: i0.ElementRef }, { token: i2.LaunchDialogService }], target: i0.ɵɵFactoryTarget.Component });
AnonymousConsentDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: AnonymousConsentDialogComponent, selector: "cx-anonymous-consent-dialog", host: { listeners: { "click": "handleClick($event)" }, properties: { "attr.role": "this.role", "attr.aria-modal": "this.modal" } }, ngImport: i0, template: "<div\n class=\"cx-anonymous-consent-dialog\"\n [cxFocus]=\"focusConfig\"\n (esc)=\"close('Escape clicked')\"\n>\n <div class=\"cx-dialog-content\">\n <div *ngIf=\"loading$ | async; else dialogBody\">\n <cx-spinner></cx-spinner>\n </div>\n <ng-template #dialogBody>\n <div class=\"cx-dialog-header\">\n <h3>\n {{ 'anonymousConsents.dialog.title' | cxTranslate }}\n </h3>\n <button\n type=\"button\"\n class=\"close\"\n [attr.aria-label]=\"'common.close' | cxTranslate\"\n (click)=\"close('Cross click')\"\n >\n <span aria-hidden=\"true\">\n <cx-icon [type]=\"iconTypes.CLOSE\"></cx-icon>\n </span>\n </button>\n </div>\n <!-- Separator -->\n <div class=\"cx-dialog-description\" *ngIf=\"showLegalDescription\">\n {{ 'anonymousConsents.dialog.legalDescription' | cxTranslate }}\n <div\n class=\"cx-dialog-separator col-sm-12 d-xs-block d-sm-block d-md-none\"\n ></div>\n </div>\n <!-- Actions -->\n <div class=\"cx-dialog-buttons\">\n <a tabindex=\"0\" class=\"btn-link cx-action-link\" (click)=\"rejectAll()\">{{\n 'anonymousConsents.dialog.clearAll' | cxTranslate\n }}</a>\n <a tabindex=\"0\" class=\"btn-link cx-action-link\" (click)=\"allowAll()\">{{\n 'anonymousConsents.dialog.selectAll' | cxTranslate\n }}</a>\n </div>\n <!-- Modal Body -->\n <div class=\"cx-dialog-body\" *ngIf=\"templates$ | async as templates\">\n <ng-container *ngIf=\"consents$ | async as consents\">\n <div\n class=\"cx-dialog-row col-sm-12 col-md-6\"\n *ngFor=\"let template of templates\"\n >\n <cx-consent-management-form\n [consentTemplate]=\"template\"\n [requiredConsents]=\"requiredConsents\"\n [consent]=\"getCorrespondingConsent(template, consents)\"\n (consentChanged)=\"onConsentChange($event)\"\n ></cx-consent-management-form>\n </div>\n </ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", components: [{ type: i3.SpinnerComponent, selector: "cx-spinner" }, { type: i4.IconComponent, selector: "cx-icon,[cxIcon]", inputs: ["cxIcon", "type"] }, { type: i5.ConsentManagementFormComponent, selector: "cx-consent-management-form", inputs: ["consentTemplate", "requiredConsents", "consent"], outputs: ["consentChanged"] }], directives: [{ type: i6.FocusDirective, selector: "[cxFocus]", inputs: ["cxFocus"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i7.AsyncPipe, "cxTranslate": i1.TranslatePipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AnonymousConsentDialogComponent, decorators: [{
type: Component,
args: [{
selector: 'cx-anonymous-consent-dialog',
templateUrl: './anonymous-consent-dialog.component.html',
}]
}], ctorParameters: function () { return [{ type: i1.AnonymousConsentsConfig }, { type: i1.AnonymousConsentsService }, { type: i0.ElementRef }, { type: i2.LaunchDialogService }]; }, propDecorators: { role: [{
type: HostBinding,
args: ['attr.role']
}], modal: [{
type: HostBinding,
args: ['attr.aria-modal']
}], handleClick: [{
type: HostListener,
args: ['click', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5vbnltb3VzLWNvbnNlbnQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvc2hhcmVkL2NvbXBvbmVudHMvYW5vbnltb3VzLWNvbnNlbnRzLWRpYWxvZy9hbm9ueW1vdXMtY29uc2VudC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9zaGFyZWQvY29tcG9uZW50cy9hbm9ueW1vdXMtY29uc2VudHMtZGlhbG9nL2Fub255bW91cy1jb25zZW50LWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFdBQVcsRUFDWCxZQUFZLEdBR2IsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUFFLGFBQWEsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7OztBQVFwRSxNQUFNLE9BQU8sK0JBQStCO0lBNkIxQyxZQUNZLE1BQStCLEVBQy9CLHdCQUFrRCxFQUNsRCxFQUFjLEVBQ2QsbUJBQXdDO1FBSHhDLFdBQU0sR0FBTixNQUFNLENBQXlCO1FBQy9CLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFoQzFCLFNBQUksR0FBRyxRQUFRLENBQUM7UUFDVixVQUFLLEdBQUcsSUFBSSxDQUFDO1FBRXJDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUzQyx5QkFBb0IsR0FBRyxJQUFJLENBQUM7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Q3JCLFFBQXlCLEVBQ3pCLFdBQStCLEVBQUU7UUFFakMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUU7WUFDOUIsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxZQUFZLEVBQUU7Z0JBQ3hDLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDOzs0SEE3SVUsK0JBQStCO2dIQUEvQiwrQkFBK0IsdU1DeEI1Qyw4b0VBNERBOzJGRHBDYSwrQkFBK0I7a0JBSjNDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsV0FBVyxFQUFFLDJDQUEyQztpQkFDekQ7Z05BRTJCLElBQUk7c0JBQTdCLFdBQVc7dUJBQUMsV0FBVztnQkFDUSxLQUFLO3NCQUFwQyxXQUFXO3VCQUFDLGlCQUFpQjtnQkFvQjlCLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFub255bW91c0NvbnNlbnQsXG4gIEFub255bW91c0NvbnNlbnRzQ29uZmlnLFxuICBBbm9ueW1vdXNDb25zZW50c1NlcnZpY2UsXG4gIENvbnNlbnRUZW1wbGF0ZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElDT05fVFlQRSB9IGZyb20gJy4uLy4uLy4uL2Ntcy1jb21wb25lbnRzL21pc2MvaWNvbi9pbmRleCc7XG5pbXBvcnQgeyBGb2N1c0NvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2xheW91dC9hMTF5L2tleWJvYXJkLWZvY3VzL2luZGV4JztcbmltcG9ydCB7IExhdW5jaERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9sYXlvdXQvbGF1bmNoLWRpYWxvZy9zZXJ2aWNlcy9sYXVuY2gtZGlhbG9nLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjeC1hbm9ueW1vdXMtY29uc2VudC1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vYW5vbnltb3VzLWNvbnNlbnQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgQW5vbnltb3VzQ29uc2VudERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSByb2xlID0gJ2RpYWxvZyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW1vZGFsJykgbW9kYWwgPSB0cnVlO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBzaG93TGVnYWxEZXNjcmlwdGlvbiA9IHRydWU7XG4gIGljb25UeXBlcyA9IElDT05fVFlQRTtcbiAgcmVxdWlyZWRDb25zZW50czogc3RyaW5nW10gPSBbXTtcblxuICBsb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgdGVtcGxhdGVzJDogT2JzZXJ2YWJsZTxDb25zZW50VGVtcGxhdGVbXT47XG4gIGNvbnNlbnRzJDogT2JzZXJ2YWJsZTxBbm9ueW1vdXNDb25zZW50W10+O1xuXG4gIGZvY3VzQ29uZmlnOiBGb2N1c0NvbmZpZyA9IHtcbiAgICB0cmFwOiB0cnVlLFxuICAgIGJsb2NrOiB0cnVlLFxuICAgIGF1dG9mb2N1czogJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScsXG4gICAgZm9jdXNPbkVzY2FwZTogdHJ1ZSxcbiAgfTtcblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBVSUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2xvc2Ugb24gY2xpY2sgb3V0c2lkZSB0aGUgZGlhbG9nIHdpbmRvd1xuICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIGFueSkudGFnTmFtZSA9PT0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnRhZ05hbWUpIHtcbiAgICAgIHRoaXMuY2xvc2UoJ0Nyb3NzIGNsaWNrJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogQW5vbnltb3VzQ29uc2VudHNDb25maWcsXG4gICAgcHJvdGVjdGVkIGFub255bW91c0NvbnNlbnRzU2VydmljZTogQW5vbnltb3VzQ29uc2VudHNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBlbDogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgbGF1bmNoRGlhbG9nU2VydmljZTogTGF1bmNoRGlhbG9nU2VydmljZVxuICApIHtcbiAgICBpZiAoQm9vbGVhbih0aGlzLmNvbmZpZy5hbm9ueW1vdXNDb25zZW50cykpIHtcbiAgICAgIHRoaXMuc2hvd0xlZ2FsRGVzY3JpcHRpb24gPVxuICAgICAgICB0aGlzLmNvbmZpZy5hbm9ueW1vdXNDb25zZW50cy5zaG93TGVnYWxEZXNjcmlwdGlvbkluRGlhbG9nO1xuICAgICAgaWYgKEJvb2xlYW4odGhpcy5jb25maWcuYW5vbnltb3VzQ29uc2VudHMucmVxdWlyZWRDb25zZW50cykpIHtcbiAgICAgICAgdGhpcy5yZXF1aXJlZENvbnNlbnRzID0gdGhpcy5jb25maWcuYW5vbnltb3VzQ29uc2VudHMucmVxdWlyZWRDb25zZW50cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlcyQgPSB0aGlzLmFub255bW91c0NvbnNlbnRzU2VydmljZS5nZXRUZW1wbGF0ZXMoKTtcbiAgICB0aGlzLmNvbnNlbnRzJCA9IHRoaXMuYW5vbnltb3VzQ29uc2VudHNTZXJ2aWNlLmdldENvbnNlbnRzKCk7XG4gICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMuYW5vbnltb3VzQ29uc2VudHNTZXJ2aWNlLmdldExvYWRUZW1wbGF0ZXNMb2FkaW5nKCk7XG4gIH1cblxuICBjbG9zZShyZWFzb24/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxhdW5jaERpYWxvZ1NlcnZpY2UuY2xvc2VEaWFsb2cocmVhc29uKTtcbiAgfVxuXG4gIHJlamVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy50ZW1wbGF0ZXMkLCB0aGlzLmNvbnNlbnRzJF0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICB0YXAoKFt0ZW1wbGF0ZXMsIGNvbnNlbnRzXSkgPT5cbiAgICAgICAgICAgIHRlbXBsYXRlcy5mb3JFYWNoKCh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb25zZW50ID0gdGhpcy5nZXRDb3JyZXNwb25kaW5nQ29uc2VudCh0ZW1wbGF0ZSwgY29uc2VudHMpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5hbm9ueW1vdXNDb25zZW50c1NlcnZpY2UuaXNDb25zZW50R2l2ZW4oY29uc2VudCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkQ29uc2VudCh0ZW1wbGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFub255bW91c0NvbnNlbnRzU2VydmljZS53aXRoZHJhd0NvbnNlbnQodGVtcGxhdGUuaWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICAgIHRoaXMuY2xvc2UoJ3JlamVjdEFsbCcpO1xuICB9XG5cbiAgYWxsb3dBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMudGVtcGxhdGVzJCwgdGhpcy5jb25zZW50cyRdKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgdGFwKChbdGVtcGxhdGVzLCBjb25zZW50c10pID0+XG4gICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodGVtcGxhdGUpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uc2VudCA9IHRoaXMuZ2V0Q29ycmVzcG9uZGluZ0NvbnNlbnQodGVtcGxhdGUsIGNvbnNlbnRzKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChjb25zZW50ICYmIGNvbnNlbnQuY29uc2VudFN0YXRlID09IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5hbm9ueW1vdXNDb25zZW50c1NlcnZpY2UuaXNDb25zZW50V2l0aGRyYXduKGNvbnNlbnQpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWRDb25zZW50KHRlbXBsYXRlKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuYW5vbnltb3VzQ29uc2VudHNTZXJ2aWNlLmdpdmVDb25zZW50KHRlbXBsYXRlLmlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgICB0aGlzLmNsb3NlKCdhbGxvd0FsbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1JlcXVpcmVkQ29uc2VudCh0ZW1wbGF0ZTogQ29uc2VudFRlbXBsYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIEJvb2xlYW4odGhpcy5jb25maWcuYW5vbnltb3VzQ29uc2VudHMpICYmXG4gICAgICBCb29sZWFuKHRoaXMuY29uZmlnLmFub255bW91c0NvbnNlbnRzLnJlcXVpcmVkQ29uc2VudHMpICYmXG4gICAgICB0aGlzLmNvbmZpZy5hbm9ueW1vdXNDb25zZW50cy5yZXF1aXJlZENvbnNlbnRzLmluY2x1ZGVzKHRlbXBsYXRlLmlkKVxuICAgICk7XG4gIH1cblxuICBvbkNvbnNlbnRDaGFuZ2Uoe1xuICAgIGdpdmVuLFxuICAgIHRlbXBsYXRlLFxuICB9OiB7XG4gICAgZ2l2ZW46IGJvb2xlYW47XG4gICAgdGVtcGxhdGU6IENvbnNlbnRUZW1wbGF0ZTtcbiAgfSk6IHZvaWQge1xuICAgIGlmIChnaXZlbikge1xuICAgICAgdGhpcy5hbm9ueW1vdXNDb25zZW50c1NlcnZpY2UuZ2l2ZUNvbnNlbnQodGVtcGxhdGUuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFub255bW91c0NvbnNlbnRzU2VydmljZS53aXRoZHJhd0NvbnNlbnQodGVtcGxhdGUuaWQpO1xuICAgIH1cbiAgfVxuXG4gIGdldENvcnJlc3BvbmRpbmdDb25zZW50KFxuICAgIHRlbXBsYXRlOiBDb25zZW50VGVtcGxhdGUsXG4gICAgY29uc2VudHM6IEFub255bW91c0NvbnNlbnRbXSA9IFtdXG4gICk6IEFub255bW91c0NvbnNlbnQge1xuICAgIGZvciAoY29uc3QgY29uc2VudCBvZiBjb25zZW50cykge1xuICAgICAgaWYgKHRlbXBsYXRlLmlkID09PSBjb25zZW50LnRlbXBsYXRlQ29kZSkge1xuICAgICAgICByZXR1cm4gY29uc2VudDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImN4LWFub255bW91cy1jb25zZW50LWRpYWxvZ1wiXG4gIFtjeEZvY3VzXT1cImZvY3VzQ29uZmlnXCJcbiAgKGVzYyk9XCJjbG9zZSgnRXNjYXBlIGNsaWNrZWQnKVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJjeC1kaWFsb2ctY29udGVudFwiPlxuICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nJCB8IGFzeW5jOyBlbHNlIGRpYWxvZ0JvZHlcIj5cbiAgICAgIDxjeC1zcGlubmVyPjwvY3gtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctdGVtcGxhdGUgI2RpYWxvZ0JvZHk+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3gtZGlhbG9nLWhlYWRlclwiPlxuICAgICAgICA8aDM+XG4gICAgICAgICAge3sgJ2Fub255bW91c0NvbnNlbnRzLmRpYWxvZy50aXRsZScgfCBjeFRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2gzPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjbG9zZVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInY29tbW9uLmNsb3NlJyB8IGN4VHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2UoJ0Nyb3NzIGNsaWNrJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8Y3gtaWNvbiBbdHlwZV09XCJpY29uVHlwZXMuQ0xPU0VcIj48L2N4LWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBTZXBhcmF0b3IgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3gtZGlhbG9nLWRlc2NyaXB0aW9uXCIgKm5nSWY9XCJzaG93TGVnYWxEZXNjcmlwdGlvblwiPlxuICAgICAgICB7eyAnYW5vbnltb3VzQ29uc2VudHMuZGlhbG9nLmxlZ2FsRGVzY3JpcHRpb24nIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3gtZGlhbG9nLXNlcGFyYXRvciBjb2wtc20tMTIgZC14cy1ibG9jayBkLXNtLWJsb2NrIGQtbWQtbm9uZVwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBY3Rpb25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImN4LWRpYWxvZy1idXR0b25zXCI+XG4gICAgICAgIDxhIHRhYmluZGV4PVwiMFwiIGNsYXNzPVwiYnRuLWxpbmsgY3gtYWN0aW9uLWxpbmtcIiAoY2xpY2spPVwicmVqZWN0QWxsKClcIj57e1xuICAgICAgICAgICdhbm9ueW1vdXNDb25zZW50cy5kaWFsb2cuY2xlYXJBbGwnIHwgY3hUcmFuc2xhdGVcbiAgICAgICAgfX08L2E+XG4gICAgICAgIDxhIHRhYmluZGV4PVwiMFwiIGNsYXNzPVwiYnRuLWxpbmsgY3gtYWN0aW9uLWxpbmtcIiAoY2xpY2spPVwiYWxsb3dBbGwoKVwiPnt7XG4gICAgICAgICAgJ2Fub255bW91c0NvbnNlbnRzLmRpYWxvZy5zZWxlY3RBbGwnIHwgY3hUcmFuc2xhdGVcbiAgICAgICAgfX08L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gTW9kYWwgQm9keSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjeC1kaWFsb2ctYm9keVwiICpuZ0lmPVwidGVtcGxhdGVzJCB8IGFzeW5jIGFzIHRlbXBsYXRlc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uc2VudHMkIHwgYXN5bmMgYXMgY29uc2VudHNcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImN4LWRpYWxvZy1yb3cgY29sLXNtLTEyIGNvbC1tZC02XCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiB0ZW1wbGF0ZXNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjeC1jb25zZW50LW1hbmFnZW1lbnQtZm9ybVxuICAgICAgICAgICAgICBbY29uc2VudFRlbXBsYXRlXT1cInRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkQ29uc2VudHNdPVwicmVxdWlyZWRDb25zZW50c1wiXG4gICAgICAgICAgICAgIFtjb25zZW50XT1cImdldENvcnJlc3BvbmRpbmdDb25zZW50KHRlbXBsYXRlLCBjb25zZW50cylcIlxuICAgICAgICAgICAgICAoY29uc2VudENoYW5nZWQpPVwib25Db25zZW50Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgPjwvY3gtY29uc2VudC1tYW5hZ2VtZW50LWZvcm0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==