year-scheduler
Version:
An Angular Year Scheduler component.
140 lines • 23.2 kB
JavaScript
import { Component, ViewEncapsulation, forwardRef, Input, Output, EventEmitter } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { trigger, transition, style, animate } from '@angular/animations';
import { ReplaySubject, fromEvent } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class AxiomSchedulerDropdownComponent {
_element;
dataTitle;
dataId;
items = [];
modelFormatter;
set ngModel(ngModel) {
this._ngModel = ngModel;
}
get ngModel() {
return this._ngModel;
}
ngModelChange = new EventEmitter();
open;
destroyed = new ReplaySubject(1);
_ngModel;
constructor(_element) {
this._element = _element;
}
ngOnInit() {
}
ngOnDestroy() {
this.destroyEventObserver();
}
onChange() {
this.propagateChange(this.ngModel);
}
writeValue(obj) {
this.ngModel = obj;
}
registerOnChange(fn) {
this.propagateChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
propagateChange = (_) => { };
onTouched = () => { };
toggle(toggle = !this.open) {
this.open = toggle;
if (this.open) {
this.setEventObserver();
}
else {
this.destroyEventObserver();
}
}
inputFormatter() {
if (this.ngModel) {
const index = this.items.findIndex(i => i[this.dataId] === this.ngModel);
if (index > -1) {
return this.items[index][this.dataTitle];
}
}
return '';
}
select(item) {
this.ngModel = this.modelFormatter ? this.modelFormatter(item) : item;
this.propagateChange(this.ngModel);
this.toggle(false);
}
closeOnGlobalClick(targetElement) {
if (targetElement) {
const arrow = targetElement.id === 'ax-dropdown-arr';
const clickedInside = this._element.nativeElement.contains(targetElement);
if (!clickedInside && !arrow) {
this.toggle(false);
}
}
}
closeOnGlobalKeydown(event) {
if (event.keyCode === 27) {
this.toggle(false);
}
}
setEventObserver() {
this.destroyed = new ReplaySubject(1);
fromEvent(document, 'click').pipe(takeUntil(this.destroyed)).subscribe((event) => this.closeOnGlobalClick(event.target));
fromEvent(document, 'keydown').pipe(takeUntil(this.destroyed)).subscribe((event) => this.closeOnGlobalKeydown(event));
}
destroyEventObserver() {
if (this.destroyed) {
this.destroyed.next(true);
this.destroyed.complete();
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AxiomSchedulerDropdownComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AxiomSchedulerDropdownComponent, selector: "ax-scheduler-dropdown", inputs: { dataTitle: "dataTitle", dataId: "dataId", items: "items", modelFormatter: "modelFormatter", ngModel: "ngModel" }, outputs: { ngModelChange: "ngModelChange" }, host: { properties: { "class.open": "open" }, classAttribute: "ax-scheduler-dropdown" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AxiomSchedulerDropdownComponent),
multi: true
}
], ngImport: i0, template: "<div class=\"ax-scheduler-dropdown__model\" (click)=\"toggle()\">\n {{ inputFormatter() }}\n\n <svg id=\"ax-dropdown-arr\" *ngIf=\"!open\" height=\"24px\" version=\"1.1\" viewBox=\"0 0 24 24\" width=\"24px\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"ax-dropdown-arr\" fill=\"none\" fill-rule=\"evenodd\" id=\"icon/chevron-bottom\" stroke=\"none\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" stroke-width=\"1\">\n <polyline id=\"ax-dropdown-arr\" id=\"lineart\" points=\"20.5 7.5 11.5 16.5 2.5 7.5\" stroke=\"#000000\" />\n </g>\n </svg>\n\n <svg id=\"ax-dropdown-arr\" *ngIf=\"open\" height=\"24px\" version=\"1.1\" viewBox=\"0 0 24 24\" width=\"24px\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"ax-dropdown-arr\" fill=\"none\" fill-rule=\"evenodd\" id=\"icon/chevron-top\" stroke=\"none\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" stroke-width=\"1\">\n <polyline id=\"ax-dropdown-arr\" id=\"lineart\" points=\"20.5 15.5 11.5 6.5 2.5 15.5\" stroke=\"#000000\" />\n </g>\n </svg>\n\n</div>\n<div class=\"ax-scheduler-dropdown__list\" *ngIf=\"open\" [@dropdownAnimation]>\n <div *ngFor=\"let item of items\" (click)=\"select(item)\">\n {{ item[dataTitle] }}\n </div>\n</div>", styles: [".ax-scheduler-dropdown{display:inline-block;width:auto;padding:0;margin:0;position:relative}.ax-scheduler-dropdown.open .ax-scheduler-dropdown__model{border-radius:5px 5px 0 0;border-bottom:none}.ax-scheduler-dropdown .ax-scheduler-dropdown__model{display:block;margin:0;padding:5px 13px 5px 8px;border:1px solid #ddd;width:100%;border-radius:5px;min-width:100px}.ax-scheduler-dropdown .ax-scheduler-dropdown__model svg{height:16px;width:16px;position:relative;right:-7px;top:2px;float:right}.ax-scheduler-dropdown .ax-scheduler-dropdown__list{display:flex;flex-direction:column;padding:0;margin:0;position:relative;border:1px solid #ddd;border-top:none;border-radius:0 0 5px 5px;box-shadow:0 8px 16px #0003;z-index:100;background-color:#fff;max-height:300px;overflow:auto}.ax-scheduler-dropdown .ax-scheduler-dropdown__list div{flex:1;padding:5px 8px;text-align:left;font-size:13px;cursor:pointer}.ax-scheduler-dropdown .ax-scheduler-dropdown__list div:hover{background-color:#eee}.ax-scheduler-dropdown .ax-scheduler-dropdown__list div:last-child{border-radius:0 0 5px 5px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [
trigger('dropdownAnimation', [
transition(':leave', [
animate(`${80}ms ease-in-out`, style({ transform: 'scale(0)' }))
])
])
], encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AxiomSchedulerDropdownComponent, decorators: [{
type: Component,
args: [{ selector: 'ax-scheduler-dropdown', encapsulation: ViewEncapsulation.None, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AxiomSchedulerDropdownComponent),
multi: true
}
], host: {
'class': 'ax-scheduler-dropdown',
'[class.open]': 'open'
}, animations: [
trigger('dropdownAnimation', [
transition(':leave', [
animate(`${80}ms ease-in-out`, style({ transform: 'scale(0)' }))
])
])
], standalone: false, template: "<div class=\"ax-scheduler-dropdown__model\" (click)=\"toggle()\">\n {{ inputFormatter() }}\n\n <svg id=\"ax-dropdown-arr\" *ngIf=\"!open\" height=\"24px\" version=\"1.1\" viewBox=\"0 0 24 24\" width=\"24px\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"ax-dropdown-arr\" fill=\"none\" fill-rule=\"evenodd\" id=\"icon/chevron-bottom\" stroke=\"none\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" stroke-width=\"1\">\n <polyline id=\"ax-dropdown-arr\" id=\"lineart\" points=\"20.5 7.5 11.5 16.5 2.5 7.5\" stroke=\"#000000\" />\n </g>\n </svg>\n\n <svg id=\"ax-dropdown-arr\" *ngIf=\"open\" height=\"24px\" version=\"1.1\" viewBox=\"0 0 24 24\" width=\"24px\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"ax-dropdown-arr\" fill=\"none\" fill-rule=\"evenodd\" id=\"icon/chevron-top\" stroke=\"none\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" stroke-width=\"1\">\n <polyline id=\"ax-dropdown-arr\" id=\"lineart\" points=\"20.5 15.5 11.5 6.5 2.5 15.5\" stroke=\"#000000\" />\n </g>\n </svg>\n\n</div>\n<div class=\"ax-scheduler-dropdown__list\" *ngIf=\"open\" [@dropdownAnimation]>\n <div *ngFor=\"let item of items\" (click)=\"select(item)\">\n {{ item[dataTitle] }}\n </div>\n</div>", styles: [".ax-scheduler-dropdown{display:inline-block;width:auto;padding:0;margin:0;position:relative}.ax-scheduler-dropdown.open .ax-scheduler-dropdown__model{border-radius:5px 5px 0 0;border-bottom:none}.ax-scheduler-dropdown .ax-scheduler-dropdown__model{display:block;margin:0;padding:5px 13px 5px 8px;border:1px solid #ddd;width:100%;border-radius:5px;min-width:100px}.ax-scheduler-dropdown .ax-scheduler-dropdown__model svg{height:16px;width:16px;position:relative;right:-7px;top:2px;float:right}.ax-scheduler-dropdown .ax-scheduler-dropdown__list{display:flex;flex-direction:column;padding:0;margin:0;position:relative;border:1px solid #ddd;border-top:none;border-radius:0 0 5px 5px;box-shadow:0 8px 16px #0003;z-index:100;background-color:#fff;max-height:300px;overflow:auto}.ax-scheduler-dropdown .ax-scheduler-dropdown__list div{flex:1;padding:5px 8px;text-align:left;font-size:13px;cursor:pointer}.ax-scheduler-dropdown .ax-scheduler-dropdown__list div:hover{background-color:#eee}.ax-scheduler-dropdown .ax-scheduler-dropdown__list div:last-child{border-radius:0 0 5px 5px}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { dataTitle: [{
type: Input
}], dataId: [{
type: Input
}], items: [{
type: Input
}], modelFormatter: [{
type: Input
}], ngModel: [{
type: Input
}], ngModelChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpb20tc2NoZWR1bGVyLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3llYXItc2NoZWR1bGVyL3NyYy9saWIvYXhpb20tc2NoZWR1bGVyLWRyb3Bkb3duL2F4aW9tLXNjaGVkdWxlci1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy95ZWFyLXNjaGVkdWxlci9zcmMvbGliL2F4aW9tLXNjaGVkdWxlci1kcm9wZG93bi9heGlvbS1zY2hlZHVsZXItZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXlCLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUEyQjNDLE1BQU0sT0FBTywrQkFBK0I7SUFxQnRCO0lBbkJYLFNBQVMsQ0FBVTtJQUNuQixNQUFNLENBQVU7SUFDaEIsS0FBSyxHQUFVLEVBQUUsQ0FBQztJQUNsQixjQUFjLENBQXFCO0lBQzVDLElBQWEsT0FBTyxDQUFDLE9BQVk7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRVMsYUFBYSxHQUFHLElBQUks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RUFBRSxDQUFDLENBQUM7aUJBQ25FLENBQUM7YUFDTCxDQUFDO1NBQ0w7OzRGQUdRLCtCQUErQjtrQkF6QjNDLFNBQVM7K0JBQ0ksdUJBQXVCLGlCQUdsQixpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxDQUFDOzRCQUM5RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSixRQUNLO3dCQUNGLE9BQU8sRUFBRSx1QkFBdUI7d0JBQ2hDLGNBQWMsRUFBRSxNQUFNO3FCQUN6QixjQUNXO3dCQUNSLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTs0QkFDekIsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQzs2QkFDbkUsQ0FBQzt5QkFDTCxDQUFDO3FCQUNMLGNBQ1csS0FBSzsrRUFJVixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDTyxPQUFPO3NCQUFuQixLQUFLO2dCQU9JLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24sIGZvcndhcmRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0cmlnZ2VyLCB0cmFuc2l0aW9uLCBzdHlsZSwgYW5pbWF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXgtc2NoZWR1bGVyLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYXhpb20tc2NoZWR1bGVyLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9heGlvbS1zY2hlZHVsZXItZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF4aW9tU2NoZWR1bGVyRHJvcGRvd25Db21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnY2xhc3MnOiAnYXgtc2NoZWR1bGVyLWRyb3Bkb3duJyxcbiAgICAgICAgJ1tjbGFzcy5vcGVuXSc6ICdvcGVuJ1xuICAgIH0sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdkcm9wZG93bkFuaW1hdGlvbicsIFtcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcbiAgICAgICAgICAgICAgICBhbmltYXRlKGAkezgwfW1zIGVhc2UtaW4tb3V0YCwgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSgwKScgfSkpXG4gICAgICAgICAgICBdKVxuICAgICAgICBdKVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogZmFsc2Vcbn0pXG5leHBvcnQgY2xhc3MgQXhpb21TY2hlZHVsZXJEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgZGF0YVRpdGxlITogc3RyaW5nO1xuICBASW5wdXQoKSBkYXRhSWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGl0ZW1zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBtb2RlbEZvcm1hdHRlciE6ICh2YWw6IGFueSkgPT4gYW55O1xuICBASW5wdXQoKSBzZXQgbmdNb2RlbChuZ01vZGVsOiBhbnkpIHtcbiAgICB0aGlzLl9uZ01vZGVsID0gbmdNb2RlbDtcbiAgfVxuICBnZXQgbmdNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmdNb2RlbDtcbiAgfVxuXG4gIEBPdXRwdXQoKSBuZ01vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHVibGljIG9wZW4hOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBkZXN0cm95ZWQ6IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcblxuICBwcml2YXRlIF9uZ01vZGVsOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZikgeyB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUV2ZW50T2JzZXJ2ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZSgpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLm5nTW9kZWwpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm5nTW9kZWwgPSBvYmo7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHVibGljIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfVxuXG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKSA9PiB7IH07XG5cbiAgcHVibGljIHRvZ2dsZSh0b2dnbGUgPSAhdGhpcy5vcGVuKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuID0gdG9nZ2xlO1xuICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgIHRoaXMuc2V0RXZlbnRPYnNlcnZlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc3Ryb3lFdmVudE9ic2VydmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlucHV0Rm9ybWF0dGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubmdNb2RlbCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpID0+IGlbdGhpcy5kYXRhSWRdID09PSB0aGlzLm5nTW9kZWwpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdW3RoaXMuZGF0YVRpdGxlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm5nTW9kZWwgPSB0aGlzLm1vZGVsRm9ybWF0dGVyID8gdGhpcy5tb2RlbEZvcm1hdHRlcihpdGVtKSA6IGl0ZW07XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5uZ01vZGVsKTtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlT25HbG9iYWxDbGljayh0YXJnZXRFbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGFyZ2V0RWxlbWVudCkge1xuICAgICAgY29uc3QgYXJyb3cgPSB0YXJnZXRFbGVtZW50LmlkID09PSAnYXgtZHJvcGRvd24tYXJyJztcbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0RWxlbWVudCk7XG4gICAgICBpZiAoIWNsaWNrZWRJbnNpZGUgJiYgIWFycm93KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlT25HbG9iYWxLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDI3KSB7XG4gICAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFdmVudE9ic2VydmVyKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnY2xpY2snKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHRoaXMuY2xvc2VPbkdsb2JhbENsaWNrKGV2ZW50LnRhcmdldCkpO1xuICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuY2xvc2VPbkdsb2JhbEtleWRvd24oZXZlbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveUV2ZW50T2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtc2NoZWR1bGVyLWRyb3Bkb3duX19tb2RlbFwiIChjbGljayk9XCJ0b2dnbGUoKVwiPlxuICB7eyBpbnB1dEZvcm1hdHRlcigpIH19XG5cbiAgPHN2ZyBpZD1cImF4LWRyb3Bkb3duLWFyclwiICpuZ0lmPVwiIW9wZW5cIiBoZWlnaHQ9XCIyNHB4XCIgdmVyc2lvbj1cIjEuMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0cHhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj5cbiAgICA8ZyBpZD1cImF4LWRyb3Bkb3duLWFyclwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGlkPVwiaWNvbi9jaGV2cm9uLWJvdHRvbVwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLXdpZHRoPVwiMVwiPlxuICAgICAgPHBvbHlsaW5lIGlkPVwiYXgtZHJvcGRvd24tYXJyXCIgaWQ9XCJsaW5lYXJ0XCIgcG9pbnRzPVwiMjAuNSA3LjUgMTEuNSAxNi41IDIuNSA3LjVcIiBzdHJva2U9XCIjMDAwMDAwXCIgLz5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuXG4gIDxzdmcgaWQ9XCJheC1kcm9wZG93bi1hcnJcIiAqbmdJZj1cIm9wZW5cIiBoZWlnaHQ9XCIyNHB4XCIgdmVyc2lvbj1cIjEuMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0cHhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj5cbiAgICA8ZyBpZD1cImF4LWRyb3Bkb3duLWFyclwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGlkPVwiaWNvbi9jaGV2cm9uLXRvcFwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLXdpZHRoPVwiMVwiPlxuICAgICAgPHBvbHlsaW5lIGlkPVwiYXgtZHJvcGRvd24tYXJyXCIgaWQ9XCJsaW5lYXJ0XCIgcG9pbnRzPVwiMjAuNSAxNS41IDExLjUgNi41IDIuNSAxNS41XCIgc3Ryb2tlPVwiIzAwMDAwMFwiIC8+XG4gICAgPC9nPlxuICA8L3N2Zz5cblxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiYXgtc2NoZWR1bGVyLWRyb3Bkb3duX19saXN0XCIgKm5nSWY9XCJvcGVuXCIgW0Bkcm9wZG93bkFuaW1hdGlvbl0+XG4gIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNcIiAoY2xpY2spPVwic2VsZWN0KGl0ZW0pXCI+XG4gICAge3sgaXRlbVtkYXRhVGl0bGVdIH19XG4gIDwvZGl2PlxuPC9kaXY+Il19