UNPKG

carbon-components-angular

Version:
205 lines 22 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 = `actionable-notification-${ActionableNotification.notificationCount++}`; this.notificationLabel = this.notificationID; 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.aria-labelledBy": "this.notificationLabel", "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 cdsActionableTitle *ngIf="!notificationObj.template" [id]="notificationID" [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 cdsActionableTitle *ngIf="!notificationObj.template" [id]="notificationID" [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 }], notificationLabel: [{ type: HostBinding, args: ["attr.aria-labelledBy"] }], 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uYWJsZS1ub3RpZmljYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vdGlmaWNhdGlvbi9hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXhDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7OztBQUVqRTs7OztHQUlHO0FBc0RILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxnQkFBZ0I7SUF5QzNELFlBQXNCLDBCQUFzRCxFQUFZLElBQVU7UUFDakcsS0FBSyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRG5CLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFBWSxTQUFJLEdBQUosSUFBSSxDQUFNO1FBdEJsRyxtQkFBYyxHQUFHLDJCQUEyQixzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDcEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxQixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFXNUU7O1dBRUc7UUFDSCwyQkFBc0IsR0FBRztZQUN4QixHQUFHLElBQUksQ0FBQyxzQkFBc0I7WUFDOUIsT0FBTyxFQUFFLFFBQWdDO1lBQ3pDLElBQUksRUFBRSxhQUFhO1NBQ25CLENBQUM7SUFJRixDQUFDO0lBekNEOzs7Ozs7T0FNRztJQUNILElBQWEsZUFBZTtRQUMzQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QixDQUFDO0lBQ0QsSUFBSSxlQUFlLENBQUMsR0FBc0I7UUFDekMsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwRCxHQUFHLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFLRCxJQUE4RCxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pJLElBQThELE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekgsSUFBNkQsTUFBTSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0SCxJQUFvRSxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFJLElBQWdFLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0gsSUFBZ0UsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvSCxJQUFvRSxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFJLElBQXFFLGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNqSSxJQUEwRSxhQUFhLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOztBQTdCdkgsd0NBQWlCLEdBQUcsQ0FBRSxDQUFBO21IQUR6QixzQkFBc0I7dUdBQXRCLHNCQUFzQix3NUJBbkR4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlEVDsyRkFFVyxzQkFBc0I7a0JBckRsQyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSwwREFBMEQ7b0JBQ3BFLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlEVDtpQkFDRDtvSUFVYSxlQUFlO3NCQUEzQixLQUFLO2dCQVcrQixpQkFBaUI7c0JBQXJELFdBQVc7dUJBQUMsc0JBQXNCO2dCQUNnQixpQkFBaUI7c0JBQW5FLFdBQVc7dUJBQUMsb0NBQW9DO2dCQUNhLFlBQVk7c0JBQXpFLFdBQVc7dUJBQUMsMkNBQTJDO2dCQUNNLE9BQU87c0JBQXBFLFdBQVc7dUJBQUMsMkNBQTJDO2dCQUNLLE1BQU07c0JBQWxFLFdBQVc7dUJBQUMsMENBQTBDO2dCQUNhLFlBQVk7c0JBQS9FLFdBQVc7dUJBQUMsaURBQWlEO2dCQUNFLFNBQVM7c0JBQXhFLFdBQVc7dUJBQUMsNkNBQTZDO2dCQUNNLFNBQVM7c0JBQXhFLFdBQVc7dUJBQUMsNkNBQTZDO2dCQUNVLFlBQVk7c0JBQS9FLFdBQVc7dUJBQUMsaURBQWlEO2dCQUNPLGFBQWE7c0JBQWpGLFdBQVc7dUJBQUMsa0RBQWtEO2dCQUNXLGFBQWE7c0JBQXRGLFdBQVc7dUJBQUMsdURBQXVEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0SG9zdEJpbmRpbmdcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBBY3Rpb25hYmxlQ29udGVudCwgTm90aWZpY2F0aW9uVmFyaWFudHMgfSBmcm9tIFwiLi9ub3RpZmljYXRpb24tY29udGVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEkxOG4gfSBmcm9tIFwiY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhci9pMThuXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25EaXNwbGF5U2VydmljZSB9IGZyb20gXCIuL25vdGlmaWNhdGlvbi1kaXNwbGF5LnNlcnZpY2VcIjtcbmltcG9ydCB7IEJhc2VOb3RpZmljYXRpb24gfSBmcm9tIFwiLi9iYXNlLW5vdGlmaWNhdGlvbi5jb21wb25lbnRcIjtcblxuLyoqXG4gKiBBY3Rpb25hYmxlIG5vdGlmaWNhdGlvbiBhbGxvd3MgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIHdpdGhpbiBhIG5vdGlmaWNhdGlvbi4gVGhlcmUgYXJlIHR3byB2YXJpYW50cyBvZmZlcmVkLCBpbmxpbmUgJiB0b2FzdC5cbiAqXG4gKiBbU2VlIGRlbW9dKC4uLy4uLz9wYXRoPS9zdG9yeS9jb21wb25lbnRzLW5vdGlmaWNhdGlvbi0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24pXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtYWN0aW9uYWJsZS1ub3RpZmljYXRpb24sIGlibS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvblwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxkaXYgY2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19kZXRhaWxzXCI+XG5cdFx0XHQ8c3ZnXG5cdFx0XHRcdFtjZHNJY29uXT1cImljb25EaWN0aW9uYXJ5W25vdGlmaWNhdGlvbk9iai50eXBlXVwiXG5cdFx0XHRcdHNpemU9XCIyMFwiXG5cdFx0XHRcdCpuZ0lmPVwibm90aWZpY2F0aW9uT2JqLnR5cGVcIlxuXHRcdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdFx0J2Nkcy0taW5saW5lLW5vdGlmaWNhdGlvbl9faWNvbic6IG5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSAnaW5saW5lJyxcblx0XHRcdFx0XHQnY2RzLS10b2FzdC1ub3RpZmljYXRpb25fX2ljb24nOiBub3RpZmljYXRpb25PYmoudmFyaWFudCA9PT0gJ3RvYXN0J1xuXHRcdFx0XHR9XCJcblx0XHRcdFx0Y2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19pY29uXCI+XG5cdFx0XHQ8L3N2Zz5cblx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX190ZXh0LXdyYXBwZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX2NvbnRlbnRcIj5cblx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRjZHNBY3Rpb25hYmxlVGl0bGVcblx0XHRcdFx0XHRcdCpuZ0lmPVwiIW5vdGlmaWNhdGlvbk9iai50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0XHRbaWRdPVwibm90aWZpY2F0aW9uSURcIlxuXHRcdFx0XHRcdFx0W2lubmVySFRNTF09XCJub3RpZmljYXRpb25PYmoudGl0bGVcIj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIW5vdGlmaWNhdGlvbk9iai50ZW1wbGF0ZVwiIGNkc0FjdGlvbmFibGVTdWJ0aXRsZT5cblx0XHRcdFx0XHRcdDxzcGFuIFtpbm5lckhUTUxdPVwibm90aWZpY2F0aW9uT2JqLm1lc3NhZ2VcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsaW5rIG9mIG5vdGlmaWNhdGlvbk9iai5saW5rc1wiPlxuXHRcdFx0XHRcdFx0XHQ8YSBjZHNMaW5rIFtocmVmXT1cImxpbmsuaHJlZlwiPnt7bGluay50ZXh0fX08L2E+XG5cdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm90aWZpY2F0aW9uT2JqLnRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbm90aWZpY2F0aW9uT2JqIH1cIj48L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIW5vdGlmaWNhdGlvbk9iai5hY3Rpb25zVGVtcGxhdGVcIj5cblx0XHRcdDxidXR0b25cblx0XHRcdFx0Km5nRm9yPVwibGV0IGFjdGlvbiBvZiBub3RpZmljYXRpb25PYmouYWN0aW9uc1wiXG5cdFx0XHRcdChjbGljayk9XCJvbkNsaWNrKGFjdGlvbiwgJGV2ZW50KVwiXG5cdFx0XHRcdFtjZHNCdXR0b25dPVwibm90aWZpY2F0aW9uT2JqLnZhcmlhbnQgPT09ICdpbmxpbmUnID8gJ2dob3N0JyA6ICd0ZXJ0aWFyeSdcIlxuXHRcdFx0XHRzaXplPVwic21cIlxuXHRcdFx0XHRjZHNBY3Rpb25hYmxlQnV0dG9uPlxuXHRcdFx0XHR7e2FjdGlvbi50ZXh0fX1cblx0XHRcdDwvYnV0dG9uPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub3RpZmljYXRpb25PYmouYWN0aW9uc1RlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbm90aWZpY2F0aW9uT2JqIH1cIj48L25nLWNvbnRhaW5lcj5cblx0XHQ8YnV0dG9uXG5cdFx0XHQqbmdJZj1cIiFpc0Nsb3NlSGlkZGVuXCJcblx0XHRcdChjbGljayk9XCJvbkNsb3NlKClcIlxuXHRcdFx0Y2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19jbG9zZS1idXR0b25cIlxuXHRcdFx0W2F0dHIuYXJpYS1sYWJlbF09XCJub3RpZmljYXRpb25PYmouY2xvc2VMYWJlbCB8IGFzeW5jXCJcblx0XHRcdHR5cGU9XCJidXR0b25cIj5cblx0XHRcdDxzdmcgY2RzSWNvbj1cImNsb3NlXCIgc2l6ZT1cIjE2XCIgY2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19jbG9zZS1pY29uXCI+PC9zdmc+XG5cdFx0PC9idXR0b24+XG5cdGBcbn0pXG5leHBvcnQgY2xhc3MgQWN0aW9uYWJsZU5vdGlmaWNhdGlvbiBleHRlbmRzIEJhc2VOb3RpZmljYXRpb24ge1xuXHRwcml2YXRlIHN0YXRpYyBub3RpZmljYXRpb25Db3VudCA9IDA7XG5cdC8qKlxuXHQgKiBDYW4gaGF2ZSBgdHlwZWAsIGB0aXRsZWAsIGFuZCBgbWVzc2FnZWAgbWVtYmVycy5cblx0ICpcblx0ICogYHR5cGVgIGNhbiBiZSBvbmUgb2YgYFwiZXJyb3JcImAsIGBcImluZm9cImAsIGBcImluZm8tc3F1YXJlXCJgLCBgXCJ3YXJuaW5nXCJgLCBgXCJ3YXJuaW5nLWFsdFwiYCwgb3IgYFwic3VjY2Vzc1wiYFxuXHQgKlxuXHQgKiBgbWVzc2FnZWAgaXMgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheVxuXHQgKi9cblx0QElucHV0KCkgZ2V0IG5vdGlmaWNhdGlvbk9iaigpOiBBY3Rpb25hYmxlQ29udGVudCB7XG5cdFx0cmV0dXJuIHRoaXMuX25vdGlmaWNhdGlvbk9iajtcblx0fVxuXHRzZXQgbm90aWZpY2F0aW9uT2JqKG9iajogQWN0aW9uYWJsZUNvbnRlbnQpIHtcblx0XHRpZiAob2JqLmNsb3NlTGFiZWwgJiYgIWlzT2JzZXJ2YWJsZShvYmouY2xvc2VMYWJlbCkpIHtcblx0XHRcdG9iai5jbG9zZUxhYmVsID0gb2Yob2JqLmNsb3NlTGFiZWwpO1xuXHRcdH1cblx0XHR0aGlzLl9ub3RpZmljYXRpb25PYmogPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHROb3RpZmljYXRpb25PYmosIG9iaik7XG5cdH1cblxuXHRub3RpZmljYXRpb25JRCA9IGBhY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0ke0FjdGlvbmFibGVOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uQ291bnQrK31gO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLmFyaWEtbGFiZWxsZWRCeVwiKSBub3RpZmljYXRpb25MYWJlbCA9IHRoaXMubm90aWZpY2F0aW9uSUQ7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25cIikgbm90aWZpY2F0aW9uQ2xhc3MgPSB0cnVlO1xuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS10b2FzdFwiKSBnZXQgdG9hc3RWYXJpYW50KCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudmFyaWFudCA9PT0gXCJ0b2FzdFwiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWVycm9yXCIpIGdldCBpc0Vycm9yKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJlcnJvclwiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWluZm9cIikgZ2V0IGlzSW5mbygpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLnR5cGUgPT09IFwiaW5mb1wiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWluZm8tc3F1YXJlXCIpIGdldCBpc0luZm9TcXVhcmUoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcImluZm8tc3F1YXJlXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0tc3VjY2Vzc1wiKSBnZXQgaXNTdWNjZXNzKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJzdWNjZXNzXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0td2FybmluZ1wiKSBnZXQgaXNXYXJuaW5nKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJ3YXJuaW5nXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0td2FybmluZy1hbHRcIikgZ2V0IGlzV2FybmluZ0FsdCgpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLnR5cGUgPT09IFwid2FybmluZy1hbHRcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS1sb3ctY29udHJhc3RcIikgZ2V0IGlzTG93Q29udHJhc3QoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai5sb3dDb250cmFzdDsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS1oaWRlLWNsb3NlLWJ1dHRvblwiKSBnZXQgaXNDbG9zZUhpZGRlbigpIHsgcmV0dXJuICF0aGlzLl9ub3RpZmljYXRpb25PYmouc2hvd0Nsb3NlOyB9XG5cblx0LyoqXG5cdCAqIFNldCBkZWZhdWx0IHZhcmlhbnQgJiByb2xlLCBhbHRlcm5hdGl2ZXMgY2FuIGJlIHByb3ZpZGVkIHRocm91Z2ggbm90aWZpY2F0aW9uT2JqIHByb3BlcnR5XG5cdCAqL1xuXHRkZWZhdWx0Tm90aWZpY2F0aW9uT2JqID0ge1xuXHRcdC4uLnRoaXMuZGVmYXVsdE5vdGlmaWNhdGlvbk9iaixcblx0XHR2YXJpYW50OiBcImlubGluZVwiIGFzIE5vdGlmaWNhdGlvblZhcmlhbnRzLFxuXHRcdHJvbGU6IFwiYWxlcnRkaWFsb2dcIlxuXHR9O1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBub3RpZmljYXRpb25EaXNwbGF5U2VydmljZTogTm90aWZpY2F0aW9uRGlzcGxheVNlcnZpY2UsIHByb3RlY3RlZCBpMThuOiBJMThuKSB7XG5cdFx0c3VwZXIobm90aWZpY2F0aW9uRGlzcGxheVNlcnZpY2UsIGkxOG4pO1xuXHR9XG59XG4iXX0=