@aheadlabs/ngx-toolset
Version:
Opinionated Angular library that contains common tools and patterns to simplify things and reuse code.
95 lines • 15.1 kB
JavaScript
import { Component, EventEmitter, Output, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/layout";
/**
* Emits a string that can be used to visualize the current bootstrap breakpoint.
* For more info, see https://getbootstrap.com/docs/5.0/layout/breakpoints/
*/
export class BootstrapBreakpointComponent {
constructor(mediaMatcher, breakPointObserver) {
this.mediaMatcher = mediaMatcher;
this.breakPointObserver = breakPointObserver;
/**
* Event that emits bootstrap breakpoint value
* @type EventEmitter<string>
* @public
*/
this.bootstrapBreakpoint = new EventEmitter();
/**
* Event that emits bootstrap breakpoint value with a hyphen at the start.
* F.I: -sm, -xs, -xxl
*
* @type EventEmitter<string>
* @public
*/
this.bootstrapBreakpointStart = new EventEmitter();
/**
* Event that emits bootstrap breakpoint value with a hyphen at the end.
* F.I: sm-, xs-, xxl-
* @type EventEmitter<string>
* @public
*/
this.bootstrapBreakpointEnd = new EventEmitter();
/**
* Event that emits bootstrap breakpoint value with a hyphen both at the start and end.
* F.I: -sm-, -xs-, -xxl-
* @type EventEmitter<string>
* @public
*/
this.bootstrapBreakpointStartEnd = new EventEmitter();
this._mediaQueries = [
{ mediaQuery: '(max-width: 575px)', breakpoint: 'xs' },
{ mediaQuery: '(min-width: 576px) and (max-width: 767px)', breakpoint: 'sm' },
{ mediaQuery: '(min-width: 768px) and (max-width: 991px)', breakpoint: 'md' },
{ mediaQuery: '(min-width: 992px) and (max-width: 1199px)', breakpoint: 'lg' },
{ mediaQuery: '(min-width: 1200px) and (max-width: 1399px)', breakpoint: 'xl' },
{ mediaQuery: '(min-width: 1400px)', breakpoint: 'xxl' },
];
}
ngOnInit() {
this._mediaQueries.forEach(mq => this.observeMediaQueries(mq.mediaQuery));
}
getBreakpointFromMediaQuery(mediaQuery) {
return this._mediaQueries.filter(mq => mq.mediaQuery === mediaQuery).pop()?.breakpoint ?? '';
}
handleMediaQueryListEvent(event) {
this.setVariables(event.media);
}
observeMediaQueries(mediaQuery) {
// For initial value, use the breakpoint observer and emit initial breakpoint
if (this.breakPointObserver.isMatched(mediaQuery)) {
this.setVariables(mediaQuery);
}
// Then, open several observers with media matcher in order to live observe for changes on media queries.
this._matcher = this.mediaMatcher.matchMedia(mediaQuery);
this._matcher.addEventListener('change', this.handleMediaQueryListEvent.bind(this), false);
}
setVariables(mediaQuery) {
this._bootstrapBreakpoint = this.getBreakpointFromMediaQuery(mediaQuery);
this.bootstrapBreakpoint.emit(this._bootstrapBreakpoint);
this.bootstrapBreakpointStart.emit(`-${this._bootstrapBreakpoint}`);
this.bootstrapBreakpointEnd.emit(`${this._bootstrapBreakpoint}-`);
this.bootstrapBreakpointStartEnd.emit(`-${this._bootstrapBreakpoint}-`);
}
ngOnDestroy() {
this._matcher?.removeEventListener('change', this.handleMediaQueryListEvent.bind(this));
}
}
BootstrapBreakpointComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BootstrapBreakpointComponent, deps: [{ token: i1.MediaMatcher }, { token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
BootstrapBreakpointComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: BootstrapBreakpointComponent, selector: "ngxtoolset-bootstrap-breakpoint", outputs: { bootstrapBreakpoint: "bootstrapBreakpoint", bootstrapBreakpointStart: "bootstrapBreakpointStart", bootstrapBreakpointEnd: "bootstrapBreakpointEnd", bootstrapBreakpointStartEnd: "bootstrapBreakpointStartEnd" }, viewQueries: [{ propertyName: "bootstrapBreakpointComponent", first: true, predicate: ["bootstrapBreakpointComponent"], descendants: true }], ngImport: i0, template: "<div\n #bootstrapBreakpointComponent\n id=\"bootstrap-breakpoint-component\">\n</div>\n", styles: ["#bootstrap-breakpoint-component{display:none}@media (min-width: 1400px){#bootstrap-breakpoint-component:before{content:\"xxl\"}}@media (max-width: 1399px){#bootstrap-breakpoint-component:before{content:\"xl\"}}@media (max-width: 1199px){#bootstrap-breakpoint-component:before{content:\"lg\"}}@media (max-width: 991px){#bootstrap-breakpoint-component:before{content:\"md\"}}@media (max-width: 767px){#bootstrap-breakpoint-component:before{content:\"sm\"}}@media (max-width: 575px){#bootstrap-breakpoint-component:before{content:\"xs\"}}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BootstrapBreakpointComponent, decorators: [{
type: Component,
args: [{ selector: 'ngxtoolset-bootstrap-breakpoint', template: "<div\n #bootstrapBreakpointComponent\n id=\"bootstrap-breakpoint-component\">\n</div>\n", styles: ["#bootstrap-breakpoint-component{display:none}@media (min-width: 1400px){#bootstrap-breakpoint-component:before{content:\"xxl\"}}@media (max-width: 1399px){#bootstrap-breakpoint-component:before{content:\"xl\"}}@media (max-width: 1199px){#bootstrap-breakpoint-component:before{content:\"lg\"}}@media (max-width: 991px){#bootstrap-breakpoint-component:before{content:\"md\"}}@media (max-width: 767px){#bootstrap-breakpoint-component:before{content:\"sm\"}}@media (max-width: 575px){#bootstrap-breakpoint-component:before{content:\"xs\"}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.MediaMatcher }, { type: i1.BreakpointObserver }]; }, propDecorators: { bootstrapBreakpointComponent: [{
type: ViewChild,
args: ['bootstrapBreakpointComponent']
}], bootstrapBreakpoint: [{
type: Output
}], bootstrapBreakpointStart: [{
type: Output
}], bootstrapBreakpointEnd: [{
type: Output
}], bootstrapBreakpointStartEnd: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLWJyZWFrcG9pbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRvb2xzZXQvc3JjL2xpYi9ib290c3RyYXAtYnJlYWtwb2ludC9ib290c3RyYXAtYnJlYWtwb2ludC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG9vbHNldC9zcmMvbGliL2Jvb3RzdHJhcC1icmVha3BvaW50L2Jvb3RzdHJhcC1icmVha3BvaW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBUyxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQVksTUFBTSxlQUFlLENBQUM7OztBQUl4Rzs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sNEJBQTRCO0lBK0N2QyxZQUFtQixZQUEwQixFQUMxQixrQkFBc0M7UUFEdEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQTVDekQ7Ozs7V0FJRztRQUNPLHdCQUFtQixHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWpGOzs7Ozs7V0FNRztRQUNPLDZCQUF3QixHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXRGOzs7OztXQUtHO1FBQ08sMkJBQXNCLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFcEY7Ozs7O1dBS0c7UUFDTyxnQ0FBMkIsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUlqRixrQkFBYSxHQUFHO1lBQ3RCLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUM7WUFDckQsRUFBRSxVQUFVLEVBQUUsMkNBQTJDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQztZQUM1RSxFQUFFLFVBQVUsRUFBRSwyQ0FBMkMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDO1lBQzVFLEVBQUUsVUFBVSxFQUFFLDRDQUE0QyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUM7WUFDN0UsRUFBRSxVQUFVLEVBQUUsNkNBQTZDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQztZQUM5RSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDO1NBQ3hELENBQUE7SUFJRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxVQUFrQjtRQUNwRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO0lBQy9GLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxLQUEwQjtRQUMxRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsVUFBa0I7UUFDNUMsNkVBQTZFO1FBQzdFLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QseUdBQXlHO1FBQ3pHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU8sWUFBWSxDQUFDLFVBQWtCO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDOzt5SEFuRlUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIsa2JDZHpDLDJGQUlBOzJGRFVhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSxpQ0FBaUM7b0lBTUEsNEJBQTRCO3NCQUF0RSxTQUFTO3VCQUFDLDhCQUE4QjtnQkFPL0IsbUJBQW1CO3NCQUE1QixNQUFNO2dCQVNHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFRRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBUUcsMkJBQTJCO3NCQUFwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge09uSW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCcmVha3BvaW50T2JzZXJ2ZXIsIE1lZGlhTWF0Y2hlcn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5cblxuLyoqXG4gKiBFbWl0cyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgY3VycmVudCBib290c3RyYXAgYnJlYWtwb2ludC5cbiAqIEZvciBtb3JlIGluZm8sIHNlZSBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjAvbGF5b3V0L2JyZWFrcG9pbnRzL1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3h0b29sc2V0LWJvb3RzdHJhcC1icmVha3BvaW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jvb3RzdHJhcC1icmVha3BvaW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYm9vdHN0cmFwLWJyZWFrcG9pbnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCb290c3RyYXBCcmVha3BvaW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoJ2Jvb3RzdHJhcEJyZWFrcG9pbnRDb21wb25lbnQnKSBib290c3RyYXBCcmVha3BvaW50Q29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogRXZlbnQgdGhhdCBlbWl0cyBib290c3RyYXAgYnJlYWtwb2ludCB2YWx1ZVxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8c3RyaW5nPlxuICAgKiBAcHVibGljXG4gICAqL1xuICBAT3V0cHV0KCkgYm9vdHN0cmFwQnJlYWtwb2ludDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRXZlbnQgdGhhdCBlbWl0cyBib290c3RyYXAgYnJlYWtwb2ludCB2YWx1ZSB3aXRoIGEgaHlwaGVuIGF0IHRoZSBzdGFydC5cbiAgICogRi5JOiAtc20sIC14cywgLXh4bFxuICAgKlxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8c3RyaW5nPlxuICAgKiBAcHVibGljXG4gICAqL1xuICBAT3V0cHV0KCkgYm9vdHN0cmFwQnJlYWtwb2ludFN0YXJ0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCB0aGF0IGVtaXRzIGJvb3RzdHJhcCBicmVha3BvaW50IHZhbHVlIHdpdGggYSBoeXBoZW4gYXQgdGhlIGVuZC5cbiAgICogRi5JOiBzbS0sIHhzLSwgeHhsLVxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8c3RyaW5nPlxuICAgKiBAcHVibGljXG4gICAqL1xuICBAT3V0cHV0KCkgYm9vdHN0cmFwQnJlYWtwb2ludEVuZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRXZlbnQgdGhhdCBlbWl0cyBib290c3RyYXAgYnJlYWtwb2ludCB2YWx1ZSB3aXRoIGEgaHlwaGVuIGJvdGggYXQgdGhlIHN0YXJ0IGFuZCBlbmQuXG4gICAqIEYuSTogLXNtLSwgLXhzLSwgLXh4bC1cbiAgICogQHR5cGUgRXZlbnRFbWl0dGVyPHN0cmluZz5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgQE91dHB1dCgpIGJvb3RzdHJhcEJyZWFrcG9pbnRTdGFydEVuZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9ib290c3RyYXBCcmVha3BvaW50ITogc3RyaW5nO1xuICBwcml2YXRlIF9tYXRjaGVyITogTWVkaWFRdWVyeUxpc3Q7XG4gIHByaXZhdGUgX21lZGlhUXVlcmllcyA9IFtcbiAgICB7IG1lZGlhUXVlcnk6ICcobWF4LXdpZHRoOiA1NzVweCknLCBicmVha3BvaW50OiAneHMnfSxcbiAgICB7IG1lZGlhUXVlcnk6ICcobWluLXdpZHRoOiA1NzZweCkgYW5kIChtYXgtd2lkdGg6IDc2N3B4KScsIGJyZWFrcG9pbnQ6ICdzbSd9LFxuICAgIHsgbWVkaWFRdWVyeTogJyhtaW4td2lkdGg6IDc2OHB4KSBhbmQgKG1heC13aWR0aDogOTkxcHgpJywgYnJlYWtwb2ludDogJ21kJ30sXG4gICAgeyBtZWRpYVF1ZXJ5OiAnKG1pbi13aWR0aDogOTkycHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpJywgYnJlYWtwb2ludDogJ2xnJ30sXG4gICAgeyBtZWRpYVF1ZXJ5OiAnKG1pbi13aWR0aDogMTIwMHB4KSBhbmQgKG1heC13aWR0aDogMTM5OXB4KScsIGJyZWFrcG9pbnQ6ICd4bCd9LFxuICAgIHsgbWVkaWFRdWVyeTogJyhtaW4td2lkdGg6IDE0MDBweCknLCBicmVha3BvaW50OiAneHhsJ30sXG4gIF1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVkaWFNYXRjaGVyOiBNZWRpYU1hdGNoZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBicmVha1BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fbWVkaWFRdWVyaWVzLmZvckVhY2gobXEgPT4gdGhpcy5vYnNlcnZlTWVkaWFRdWVyaWVzKG1xLm1lZGlhUXVlcnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnJlYWtwb2ludEZyb21NZWRpYVF1ZXJ5KG1lZGlhUXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhUXVlcmllcy5maWx0ZXIobXEgPT4gbXEubWVkaWFRdWVyeSA9PT0gbWVkaWFRdWVyeSkucG9wKCk/LmJyZWFrcG9pbnQgPz8gJyc7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1lZGlhUXVlcnlMaXN0RXZlbnQoZXZlbnQ6IE1lZGlhUXVlcnlMaXN0RXZlbnQpIHtcbiAgICB0aGlzLnNldFZhcmlhYmxlcyhldmVudC5tZWRpYSk7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVNZWRpYVF1ZXJpZXMobWVkaWFRdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRm9yIGluaXRpYWwgdmFsdWUsIHVzZSB0aGUgYnJlYWtwb2ludCBvYnNlcnZlciBhbmQgZW1pdCBpbml0aWFsIGJyZWFrcG9pbnRcbiAgICBpZiAodGhpcy5icmVha1BvaW50T2JzZXJ2ZXIuaXNNYXRjaGVkKG1lZGlhUXVlcnkpKSB7XG4gICAgICB0aGlzLnNldFZhcmlhYmxlcyhtZWRpYVF1ZXJ5KTtcbiAgICB9XG4gICAgLy8gVGhlbiwgb3BlbiBzZXZlcmFsIG9ic2VydmVycyB3aXRoIG1lZGlhIG1hdGNoZXIgaW4gb3JkZXIgdG8gbGl2ZSBvYnNlcnZlIGZvciBjaGFuZ2VzIG9uIG1lZGlhIHF1ZXJpZXMuXG4gICAgdGhpcy5fbWF0Y2hlciA9IHRoaXMubWVkaWFNYXRjaGVyLm1hdGNoTWVkaWEobWVkaWFRdWVyeSk7XG4gICAgdGhpcy5fbWF0Y2hlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmhhbmRsZU1lZGlhUXVlcnlMaXN0RXZlbnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYXJpYWJsZXMobWVkaWFRdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fYm9vdHN0cmFwQnJlYWtwb2ludCA9IHRoaXMuZ2V0QnJlYWtwb2ludEZyb21NZWRpYVF1ZXJ5KG1lZGlhUXVlcnkpO1xuICAgIHRoaXMuYm9vdHN0cmFwQnJlYWtwb2ludC5lbWl0KHRoaXMuX2Jvb3RzdHJhcEJyZWFrcG9pbnQpO1xuICAgIHRoaXMuYm9vdHN0cmFwQnJlYWtwb2ludFN0YXJ0LmVtaXQoYC0ke3RoaXMuX2Jvb3RzdHJhcEJyZWFrcG9pbnR9YCk7XG4gICAgdGhpcy5ib290c3RyYXBCcmVha3BvaW50RW5kLmVtaXQoYCR7dGhpcy5fYm9vdHN0cmFwQnJlYWtwb2ludH0tYCk7XG4gICAgdGhpcy5ib290c3RyYXBCcmVha3BvaW50U3RhcnRFbmQuZW1pdChgLSR7dGhpcy5fYm9vdHN0cmFwQnJlYWtwb2ludH0tYCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9tYXRjaGVyPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmhhbmRsZU1lZGlhUXVlcnlMaXN0RXZlbnQuYmluZCh0aGlzKSk7XG4gIH1cblxufVxuIiwiPGRpdlxuICAjYm9vdHN0cmFwQnJlYWtwb2ludENvbXBvbmVudFxuICBpZD1cImJvb3RzdHJhcC1icmVha3BvaW50LWNvbXBvbmVudFwiPlxuPC9kaXY+XG4iXX0=