UNPKG

carbon-components-angular

Version:
194 lines 21.5 kB
import { Component, Input, HostBinding } from "@angular/core"; import { isObservable, of } from "rxjs"; import { BaseNotification } from "./base-notification.component"; import * as i0 from "@angular/core"; import * as i1 from "./notification-display.service"; import * as i2 from "carbon-components-angular/i18n"; import * as i3 from "carbon-components-angular/button"; import * as i4 from "@angular/common"; import * as i5 from "carbon-components-angular/link"; import * as i6 from "carbon-components-angular/icon"; import * as i7 from "./actionable-button.directive"; import * as i8 from "./actionable-title.directive"; import * as i9 from "./actionable-subtitle.directive"; /** * Actionable notification allows for interactive elements within a notification. There are two variants offered, inline & toast. * * [See demo](../../?path=/story/components-notification--actionable-notification) */ export class ActionableNotification extends BaseNotification { constructor(notificationDisplayService, i18n) { super(notificationDisplayService, i18n); this.notificationDisplayService = notificationDisplayService; this.i18n = i18n; this.notificationID = `notification-${ActionableNotification.notificationCount++}`; this.notificationClass = true; /** * Set default variant & role, alternatives can be provided through notificationObj property */ this.defaultNotificationObj = { ...this.defaultNotificationObj, variant: "inline", role: "alertdialog" }; } /** * Can have `type`, `title`, and `message` members. * * `type` can be one of `"error"`, `"info"`, `"info-square"`, `"warning"`, `"warning-alt"`, or `"success"` * * `message` is the message to display */ get notificationObj() { return this._notificationObj; } set notificationObj(obj) { if (obj.closeLabel && !isObservable(obj.closeLabel)) { obj.closeLabel = of(obj.closeLabel); } this._notificationObj = Object.assign({}, this.defaultNotificationObj, obj); } get toastVariant() { return this.notificationObj.variant === "toast"; } get isError() { return this.notificationObj.type === "error"; } get isInfo() { return this.notificationObj.type === "info"; } get isInfoSquare() { return this.notificationObj.type === "info-square"; } get isSuccess() { return this.notificationObj.type === "success"; } get isWarning() { return this.notificationObj.type === "warning"; } get isWarningAlt() { return this.notificationObj.type === "warning-alt"; } get isLowContrast() { return this.notificationObj.lowContrast; } get isCloseHidden() { return !this._notificationObj.showClose; } } ActionableNotification.notificationCount = 0; ActionableNotification.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ActionableNotification, deps: [{ token: i1.NotificationDisplayService }, { token: i2.I18n }], target: i0.ɵɵFactoryTarget.Component }); ActionableNotification.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ActionableNotification, selector: "cds-actionable-notification, ibm-actionable-notification", inputs: { notificationObj: "notificationObj" }, host: { properties: { "attr.id": "this.notificationID", "class.cds--actionable-notification": "this.notificationClass", "class.cds--actionable-notification--toast": "this.toastVariant", "class.cds--actionable-notification--error": "this.isError", "class.cds--actionable-notification--info": "this.isInfo", "class.cds--actionable-notification--info-square": "this.isInfoSquare", "class.cds--actionable-notification--success": "this.isSuccess", "class.cds--actionable-notification--warning": "this.isWarning", "class.cds--actionable-notification--warning-alt": "this.isWarningAlt", "class.cds--actionable-notification--low-contrast": "this.isLowContrast", "class.cds--actionable-notification--hide-close-button": "this.isCloseHidden" } }, usesInheritance: true, ngImport: i0, template: ` <div class="cds--actionable-notification__details"> <svg [cdsIcon]="iconDictionary[notificationObj.type]" size="20" *ngIf="notificationObj.type" [ngClass]="{ 'cds--inline-notification__icon': notificationObj.variant === 'inline', 'cds--toast-notification__icon': notificationObj.variant === 'toast' }" class="cds--actionable-notification__icon"> </svg> <div class="cds--actionable-notification__text-wrapper"> <div class="cds--actionable-notification__content"> <div *ngIf="!notificationObj.template" cdsActionableTitle [innerHTML]="notificationObj.title"></div> <div *ngIf="!notificationObj.template" cdsActionableSubtitle> <span [innerHTML]="notificationObj.message"></span> <ng-container *ngFor="let link of notificationObj.links"> <a cdsLink [href]="link.href">{{link.text}}</a> </ng-container> </div> <ng-container *ngTemplateOutlet="notificationObj.template; context: { $implicit: notificationObj }"></ng-container> </div> </div> </div> <ng-container *ngIf="!notificationObj.actionsTemplate"> <button *ngFor="let action of notificationObj.actions" (click)="onClick(action, $event)" [cdsButton]="notificationObj.variant === 'inline' ? 'ghost' : 'tertiary'" size="sm" cdsActionableButton> {{action.text}} </button> </ng-container> <ng-container *ngTemplateOutlet="notificationObj.actionsTemplate; context: { $implicit: notificationObj }"></ng-container> <button *ngIf="!isCloseHidden" (click)="onClose()" class="cds--actionable-notification__close-button" [attr.aria-label]="notificationObj.closeLabel | async" type="button"> <svg cdsIcon="close" size="16" class="cds--actionable-notification__close-icon"></svg> </button> `, isInline: true, dependencies: [{ kind: "directive", type: i3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.Link, selector: "[cdsLink], [ibmLink]", inputs: ["inline", "disabled"] }, { kind: "directive", type: i6.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i7.ActionableButton, selector: "[cdsActionableButton], [ibmActionableButton]" }, { kind: "directive", type: i8.ActionableTitle, selector: "[cdsActionableTitle], [ibmActionableTitle]" }, { kind: "directive", type: i9.ActionableSubtitle, selector: "[cdsActionableSubtitle], [ibmActionableSubtitle]" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ActionableNotification, decorators: [{ type: Component, args: [{ selector: "cds-actionable-notification, ibm-actionable-notification", template: ` <div class="cds--actionable-notification__details"> <svg [cdsIcon]="iconDictionary[notificationObj.type]" size="20" *ngIf="notificationObj.type" [ngClass]="{ 'cds--inline-notification__icon': notificationObj.variant === 'inline', 'cds--toast-notification__icon': notificationObj.variant === 'toast' }" class="cds--actionable-notification__icon"> </svg> <div class="cds--actionable-notification__text-wrapper"> <div class="cds--actionable-notification__content"> <div *ngIf="!notificationObj.template" cdsActionableTitle [innerHTML]="notificationObj.title"></div> <div *ngIf="!notificationObj.template" cdsActionableSubtitle> <span [innerHTML]="notificationObj.message"></span> <ng-container *ngFor="let link of notificationObj.links"> <a cdsLink [href]="link.href">{{link.text}}</a> </ng-container> </div> <ng-container *ngTemplateOutlet="notificationObj.template; context: { $implicit: notificationObj }"></ng-container> </div> </div> </div> <ng-container *ngIf="!notificationObj.actionsTemplate"> <button *ngFor="let action of notificationObj.actions" (click)="onClick(action, $event)" [cdsButton]="notificationObj.variant === 'inline' ? 'ghost' : 'tertiary'" size="sm" cdsActionableButton> {{action.text}} </button> </ng-container> <ng-container *ngTemplateOutlet="notificationObj.actionsTemplate; context: { $implicit: notificationObj }"></ng-container> <button *ngIf="!isCloseHidden" (click)="onClose()" class="cds--actionable-notification__close-button" [attr.aria-label]="notificationObj.closeLabel | async" type="button"> <svg cdsIcon="close" size="16" class="cds--actionable-notification__close-icon"></svg> </button> ` }] }], ctorParameters: function () { return [{ type: i1.NotificationDisplayService }, { type: i2.I18n }]; }, propDecorators: { notificationObj: [{ type: Input }], notificationID: [{ type: HostBinding, args: ["attr.id"] }], notificationClass: [{ type: HostBinding, args: ["class.cds--actionable-notification"] }], toastVariant: [{ type: HostBinding, args: ["class.cds--actionable-notification--toast"] }], isError: [{ type: HostBinding, args: ["class.cds--actionable-notification--error"] }], isInfo: [{ type: HostBinding, args: ["class.cds--actionable-notification--info"] }], isInfoSquare: [{ type: HostBinding, args: ["class.cds--actionable-notification--info-square"] }], isSuccess: [{ type: HostBinding, args: ["class.cds--actionable-notification--success"] }], isWarning: [{ type: HostBinding, args: ["class.cds--actionable-notification--warning"] }], isWarningAlt: [{ type: HostBinding, args: ["class.cds--actionable-notification--warning-alt"] }], isLowContrast: [{ type: HostBinding, args: ["class.cds--actionable-notification--low-contrast"] }], isCloseHidden: [{ type: HostBinding, args: ["class.cds--actionable-notification--hide-close-button"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uYWJsZS1ub3RpZmljYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vdGlmaWNhdGlvbi9hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXhDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7OztBQUVqRTs7OztHQUlHO0FBaURILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxnQkFBZ0I7SUF3QzNELFlBQXNCLDBCQUFzRCxFQUFZLElBQVU7UUFDakcsS0FBSyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRG5CLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFBWSxTQUFJLEdBQUosSUFBSSxDQUFNO1FBckIxRSxtQkFBYyxHQUFHLGdCQUFnQixzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDbkQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBVzVFOztXQUVHO1FBQ0gsMkJBQXNCLEdBQUc7WUFDeEIsR0FBRyxJQUFJLENBQUMsc0JBQXNCO1lBQzlCLE9BQU8sRUFBRSxRQUFnQztZQUN6QyxJQUFJLEVBQUUsYUFBYTtTQUNuQixDQUFDO0lBSUYsQ0FBQztJQXhDRDs7Ozs7O09BTUc7SUFDSCxJQUFhLGVBQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksZUFBZSxDQUFDLEdBQXNCO1FBQ3pDLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEQsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBSUQsSUFBOEQsWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNqSSxJQUE4RCxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pILElBQTZELE1BQU0sS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdEgsSUFBb0UsWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMxSSxJQUFnRSxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9ILElBQWdFLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0gsSUFBb0UsWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMxSSxJQUFxRSxhQUFhLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDakksSUFBMEUsYUFBYSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs7QUE1QnZILHdDQUFpQixHQUFHLENBQUUsQ0FBQTttSEFEekIsc0JBQXNCO3VHQUF0QixzQkFBc0IsdzRCQTlDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBNENUOzJGQUVXLHNCQUFzQjtrQkFoRGxDLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDBEQUEwRDtvQkFDcEUsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTRDVDtpQkFDRDtvSUFVYSxlQUFlO3NCQUEzQixLQUFLO2dCQVVrQixjQUFjO3NCQUFyQyxXQUFXO3VCQUFDLFNBQVM7Z0JBQzZCLGlCQUFpQjtzQkFBbkUsV0FBVzt1QkFBQyxvQ0FBb0M7Z0JBQ2EsWUFBWTtzQkFBekUsV0FBVzt1QkFBQywyQ0FBMkM7Z0JBQ00sT0FBTztzQkFBcEUsV0FBVzt1QkFBQywyQ0FBMkM7Z0JBQ0ssTUFBTTtzQkFBbEUsV0FBVzt1QkFBQywwQ0FBMEM7Z0JBQ2EsWUFBWTtzQkFBL0UsV0FBVzt1QkFBQyxpREFBaUQ7Z0JBQ0UsU0FBUztzQkFBeEUsV0FBVzt1QkFBQyw2Q0FBNkM7Z0JBQ00sU0FBUztzQkFBeEUsV0FBVzt1QkFBQyw2Q0FBNkM7Z0JBQ1UsWUFBWTtzQkFBL0UsV0FBVzt1QkFBQyxpREFBaUQ7Z0JBQ08sYUFBYTtzQkFBakYsV0FBVzt1QkFBQyxrREFBa0Q7Z0JBQ1csYUFBYTtzQkFBdEYsV0FBVzt1QkFBQyx1REFBdUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRIb3N0QmluZGluZ1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgeyBpc09ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEFjdGlvbmFibGVDb250ZW50LCBOb3RpZmljYXRpb25WYXJpYW50cyB9IGZyb20gXCIuL25vdGlmaWNhdGlvbi1jb250ZW50LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgSTE4biB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2kxOG5cIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkRpc3BsYXlTZXJ2aWNlIH0gZnJvbSBcIi4vbm90aWZpY2F0aW9uLWRpc3BsYXkuc2VydmljZVwiO1xuaW1wb3J0IHsgQmFzZU5vdGlmaWNhdGlvbiB9IGZyb20gXCIuL2Jhc2Utbm90aWZpY2F0aW9uLmNvbXBvbmVudFwiO1xuXG4vKipcbiAqIEFjdGlvbmFibGUgbm90aWZpY2F0aW9uIGFsbG93cyBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgd2l0aGluIGEgbm90aWZpY2F0aW9uLiBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzIG9mZmVyZWQsIGlubGluZSAmIHRvYXN0LlxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtbm90aWZpY2F0aW9uLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbilcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbiwgaWJtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGRpdiBjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX2RldGFpbHNcIj5cblx0XHRcdDxzdmdcblx0XHRcdFx0W2Nkc0ljb25dPVwiaWNvbkRpY3Rpb25hcnlbbm90aWZpY2F0aW9uT2JqLnR5cGVdXCJcblx0XHRcdFx0c2l6ZT1cIjIwXCJcblx0XHRcdFx0Km5nSWY9XCJub3RpZmljYXRpb25PYmoudHlwZVwiXG5cdFx0XHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdFx0XHQnY2RzLS1pbmxpbmUtbm90aWZpY2F0aW9uX19pY29uJzogbm90aWZpY2F0aW9uT2JqLnZhcmlhbnQgPT09ICdpbmxpbmUnLFxuXHRcdFx0XHRcdCdjZHMtLXRvYXN0LW5vdGlmaWNhdGlvbl9faWNvbic6IG5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSAndG9hc3QnXG5cdFx0XHRcdH1cIlxuXHRcdFx0XHRjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX2ljb25cIj5cblx0XHRcdDwvc3ZnPlxuXHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX3RleHQtd3JhcHBlclwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbl9fY29udGVudFwiPlxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCIhbm90aWZpY2F0aW9uT2JqLnRlbXBsYXRlXCIgY2RzQWN0aW9uYWJsZVRpdGxlIFtpbm5lckhUTUxdPVwibm90aWZpY2F0aW9uT2JqLnRpdGxlXCI+PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiAqbmdJZj1cIiFub3RpZmljYXRpb25PYmoudGVtcGxhdGVcIiBjZHNBY3Rpb25hYmxlU3VidGl0bGU+XG5cdFx0XHRcdFx0XHQ8c3BhbiBbaW5uZXJIVE1MXT1cIm5vdGlmaWNhdGlvbk9iai5tZXNzYWdlXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGluayBvZiBub3RpZmljYXRpb25PYmoubGlua3NcIj5cblx0XHRcdFx0XHRcdFx0PGEgY2RzTGluayBbaHJlZl09XCJsaW5rLmhyZWZcIj57e2xpbmsudGV4dH19PC9hPlxuXHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vdGlmaWNhdGlvbk9iai50ZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IG5vdGlmaWNhdGlvbk9iaiB9XCI+PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFub3RpZmljYXRpb25PYmouYWN0aW9uc1RlbXBsYXRlXCI+XG5cdFx0XHQ8YnV0dG9uXG5cdFx0XHRcdCpuZ0Zvcj1cImxldCBhY3Rpb24gb2Ygbm90aWZpY2F0aW9uT2JqLmFjdGlvbnNcIlxuXHRcdFx0XHQoY2xpY2spPVwib25DbGljayhhY3Rpb24sICRldmVudClcIlxuXHRcdFx0XHRbY2RzQnV0dG9uXT1cIm5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSAnaW5saW5lJyA/ICdnaG9zdCcgOiAndGVydGlhcnknXCJcblx0XHRcdFx0c2l6ZT1cInNtXCJcblx0XHRcdFx0Y2RzQWN0aW9uYWJsZUJ1dHRvbj5cblx0XHRcdFx0e3thY3Rpb24udGV4dH19XG5cdFx0XHQ8L2J1dHRvbj5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm90aWZpY2F0aW9uT2JqLmFjdGlvbnNUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IG5vdGlmaWNhdGlvbk9iaiB9XCI+PC9uZy1jb250YWluZXI+XG5cdFx0PGJ1dHRvblxuXHRcdFx0Km5nSWY9XCIhaXNDbG9zZUhpZGRlblwiXG5cdFx0XHQoY2xpY2spPVwib25DbG9zZSgpXCJcblx0XHRcdGNsYXNzPVwiY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbl9fY2xvc2UtYnV0dG9uXCJcblx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwibm90aWZpY2F0aW9uT2JqLmNsb3NlTGFiZWwgfCBhc3luY1wiXG5cdFx0XHR0eXBlPVwiYnV0dG9uXCI+XG5cdFx0XHQ8c3ZnIGNkc0ljb249XCJjbG9zZVwiIHNpemU9XCIxNlwiIGNsYXNzPVwiY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbl9fY2xvc2UtaWNvblwiPjwvc3ZnPlxuXHRcdDwvYnV0dG9uPlxuXHRgXG59KVxuZXhwb3J0IGNsYXNzIEFjdGlvbmFibGVOb3RpZmljYXRpb24gZXh0ZW5kcyBCYXNlTm90aWZpY2F0aW9uIHtcblx0cHJpdmF0ZSBzdGF0aWMgbm90aWZpY2F0aW9uQ291bnQgPSAwO1xuXHQvKipcblx0ICogQ2FuIGhhdmUgYHR5cGVgLCBgdGl0bGVgLCBhbmQgYG1lc3NhZ2VgIG1lbWJlcnMuXG5cdCAqXG5cdCAqIGB0eXBlYCBjYW4gYmUgb25lIG9mIGBcImVycm9yXCJgLCBgXCJpbmZvXCJgLCBgXCJpbmZvLXNxdWFyZVwiYCwgYFwid2FybmluZ1wiYCwgYFwid2FybmluZy1hbHRcImAsIG9yIGBcInN1Y2Nlc3NcImBcblx0ICpcblx0ICogYG1lc3NhZ2VgIGlzIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXlcblx0ICovXG5cdEBJbnB1dCgpIGdldCBub3RpZmljYXRpb25PYmooKTogQWN0aW9uYWJsZUNvbnRlbnQge1xuXHRcdHJldHVybiB0aGlzLl9ub3RpZmljYXRpb25PYmo7XG5cdH1cblx0c2V0IG5vdGlmaWNhdGlvbk9iaihvYmo6IEFjdGlvbmFibGVDb250ZW50KSB7XG5cdFx0aWYgKG9iai5jbG9zZUxhYmVsICYmICFpc09ic2VydmFibGUob2JqLmNsb3NlTGFiZWwpKSB7XG5cdFx0XHRvYmouY2xvc2VMYWJlbCA9IG9mKG9iai5jbG9zZUxhYmVsKTtcblx0XHR9XG5cdFx0dGhpcy5fbm90aWZpY2F0aW9uT2JqID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0Tm90aWZpY2F0aW9uT2JqLCBvYmopO1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5pZFwiKSBub3RpZmljYXRpb25JRCA9IGBub3RpZmljYXRpb24tJHtBY3Rpb25hYmxlTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbkNvdW50Kyt9YDtcblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvblwiKSBub3RpZmljYXRpb25DbGFzcyA9IHRydWU7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLXRvYXN0XCIpIGdldCB0b2FzdFZhcmlhbnQoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSBcInRvYXN0XCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0tZXJyb3JcIikgZ2V0IGlzRXJyb3IoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcImVycm9yXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0taW5mb1wiKSBnZXQgaXNJbmZvKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJpbmZvXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0taW5mby1zcXVhcmVcIikgZ2V0IGlzSW5mb1NxdWFyZSgpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLnR5cGUgPT09IFwiaW5mby1zcXVhcmVcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS1zdWNjZXNzXCIpIGdldCBpc1N1Y2Nlc3MoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcInN1Y2Nlc3NcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS13YXJuaW5nXCIpIGdldCBpc1dhcm5pbmcoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcIndhcm5pbmdcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS13YXJuaW5nLWFsdFwiKSBnZXQgaXNXYXJuaW5nQWx0KCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJ3YXJuaW5nLWFsdFwiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWxvdy1jb250cmFzdFwiKSBnZXQgaXNMb3dDb250cmFzdCgpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLmxvd0NvbnRyYXN0OyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWhpZGUtY2xvc2UtYnV0dG9uXCIpIGdldCBpc0Nsb3NlSGlkZGVuKCkgeyByZXR1cm4gIXRoaXMuX25vdGlmaWNhdGlvbk9iai5zaG93Q2xvc2U7IH1cblxuXHQvKipcblx0ICogU2V0IGRlZmF1bHQgdmFyaWFudCAmIHJvbGUsIGFsdGVybmF0aXZlcyBjYW4gYmUgcHJvdmlkZWQgdGhyb3VnaCBub3RpZmljYXRpb25PYmogcHJvcGVydHlcblx0ICovXG5cdGRlZmF1bHROb3RpZmljYXRpb25PYmogPSB7XG5cdFx0Li4udGhpcy5kZWZhdWx0Tm90aWZpY2F0aW9uT2JqLFxuXHRcdHZhcmlhbnQ6IFwiaW5saW5lXCIgYXMgTm90aWZpY2F0aW9uVmFyaWFudHMsXG5cdFx0cm9sZTogXCJhbGVydGRpYWxvZ1wiXG5cdH07XG5cblx0Y29uc3RydWN0b3IocHJvdGVjdGVkIG5vdGlmaWNhdGlvbkRpc3BsYXlTZXJ2aWNlOiBOb3RpZmljYXRpb25EaXNwbGF5U2VydmljZSwgcHJvdGVjdGVkIGkxOG46IEkxOG4pIHtcblx0XHRzdXBlcihub3RpZmljYXRpb25EaXNwbGF5U2VydmljZSwgaTE4bik7XG5cdH1cbn1cbiJdfQ==