@junte/ui
Version:
Quality Angular UI components kit
595 lines • 66.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, OnDestroy, OnInit, Output, QueryList, Renderer2, TemplateRef, ViewChild } from '@angular/core';
import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms';
import { NGXLogger } from 'ngx-logger';
import { debounceTime, distinctUntilChanged, filter, finalize, takeWhile, tap } from 'rxjs/operators';
import { DeviceService } from '../../layout/responsive/device.service';
import { PropertyApi } from '../../core/decorators/api';
import { Behaviour } from '../../core/enums/behaviour';
import { Breakpoint } from '../../core/enums/breakpoint';
import { Feature } from '../../core/enums/feature';
import { Placement } from '../../core/enums/placement';
import { Size } from '../../core/enums/size';
import { State } from '../../core/enums/state';
import { UI } from '../../core/enums/ui';
import { Width } from '../../core/enums/width';
import { BreakpointService } from '../../layout/responsive/breakpoint.service';
import { PopoverInstance, PopoverService } from '../../overlays/popover/popover.service';
import { SelectMode } from './enums';
var MIN_WIDTH = 20;
var CHAR_WIDTH = 8;
var CHECKING_INTERVAL = 100;
var SelectOptionComponent = /** @class */ (function () {
function SelectOptionComponent() {
this.ui = UI;
}
__decorate([
PropertyApi({
description: 'Icon for select option',
type: 'string'
}),
Input(),
__metadata("design:type", String)
], SelectOptionComponent.prototype, "icon", void 0);
__decorate([
PropertyApi({
description: 'Key for select option',
type: 'number | string'
}),
Input(),
__metadata("design:type", Object)
], SelectOptionComponent.prototype, "key", void 0);
__decorate([
PropertyApi({
description: 'Label name for select option',
type: 'string'
}),
Input(),
__metadata("design:type", String)
], SelectOptionComponent.prototype, "label", void 0);
__decorate([
PropertyApi({
description: 'Value for select option',
type: 'any'
}),
Input(),
__metadata("design:type", Object)
], SelectOptionComponent.prototype, "value", void 0);
SelectOptionComponent = __decorate([
Component({
selector: 'jnt-select-option',
template: ''
})
], SelectOptionComponent);
return SelectOptionComponent;
}());
export { SelectOptionComponent };
var SEARCH_DELAY = 100;
var SelectComponent = /** @class */ (function () {
function SelectComponent(hostRef, renderer, fb, popover, logger, breakpoint, device) {
var _this = this;
this.hostRef = hostRef;
this.renderer = renderer;
this.fb = fb;
this.popover = popover;
this.logger = logger;
this.breakpoint = breakpoint;
this.device = device;
this.host = 'jnt-select-host';
this.reference = { popover: null };
this.destroyed = false;
this._features = [];
this.ui = UI;
this._placement = Placement.absolute;
this.options = { persisted: {}, found: {} };
this.changes = { selected: 0, options: 0 };
this.selected = [];
this.queryControl = this.fb.control({ value: null, disabled: true });
this.form = this.fb.group({
query: this.queryControl
});
this.labelField = 'label';
this.keyField = 'key';
this.placeholder = '';
this.required = false;
this._mode = SelectMode.single;
this._size = Size.normal;
this._width = Width.default;
this.updated = new EventEmitter();
this.opened = false;
this.disabled = false;
this.loader = null;
this.onChange = function () { return _this.logger.error('value accessor is not registered'); };
this.onTouched = function () { return _this.logger.error('value accessor is not registered'); };
this.registerOnChange = function (fn) { return _this.onChange = fn; };
this.registerOnTouched = function (fn) { return _this.onTouched = fn; };
}
SelectComponent_1 = SelectComponent;
Object.defineProperty(SelectComponent.prototype, "mobile", {
get: function () {
return this.breakpoint.current === Breakpoint.mobile;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "placement", {
get: function () {
return this._placement;
},
set: function (placement) {
this._placement = placement || Placement.absolute;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "mode", {
get: function () {
return this._mode;
},
set: function (mode) {
this._mode = mode || SelectMode.single;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "features", {
get: function () {
return this._features;
},
set: function (features) {
this._features = features || [];
this.features.includes(Feature.search)
? this.queryControl.enable({ emitEvent: false })
: this.queryControl.disable({ emitEvent: false });
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "size", {
set: function (size) {
this._size = size || Size.normal;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "width", {
set: function (width) {
this._width = width || Width.default;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "empty", {
get: function () {
return this.selected.length === 0;
},
enumerable: true,
configurable: true
});
SelectComponent.prototype.clickOutside = function (path) {
if (!!this.reference.popover && this.opened && !this.picked(path) && !this.reference.popover.picked(path)) {
this.close();
}
};
SelectComponent.prototype.focused = function (_a) {
var target = _a.target;
switch (this.mode) {
case SelectMode.single:
break;
case SelectMode.multiple:
if (target === this.selectedList.nativeElement) {
this.opened ? this.close() : this.open();
}
break;
}
};
SelectComponent.prototype.blurred = function () {
this.onTouched();
};
SelectComponent.prototype.ngOnInit = function () {
var _this = this;
var loadOptions = function (query) {
if (!!_this.fetcher) {
_this.fetcher.unsubscribe();
}
if (!!_this.loader) {
_this.fetcher = _this.loader(query)
.pipe(finalize(function () { return _this.loading = false; }))
.subscribe(function (objects) {
_this.options.found = {};
objects.forEach(function (o, index) {
var key = o[_this.keyField];
if (!!key) {
_this.options.found["" + key] = {
index: index,
key: key,
label: o[_this.labelField],
icon: o.icon,
value: o
};
}
});
_this.changes.options++;
});
}
else {
_this.options.found = {};
var options = Object.values(_this.options.persisted);
options = options.filter(function (o) { return o.label.toLocaleLowerCase()
.includes(query.toLocaleLowerCase()); });
options.forEach(function (option) { return _this.options.found[option.key] = option; });
_this.changes.options++;
}
};
this.queryControl.valueChanges.pipe(distinctUntilChanged(), tap(function (query) {
_this.logger.debug('query has been changed');
_this.loading = !!query && !!_this.loader;
var input = _this.queryInput.nativeElement;
if (!!query && query.length > 0) {
var width = Math.max((query.length + 1) * CHAR_WIDTH, MIN_WIDTH);
_this.renderer.setStyle(input, 'width', width + 'px');
}
else {
_this.renderer.removeStyle(input, 'width');
}
}), debounceTime(SEARCH_DELAY), filter(function (query) { return !!query; })).subscribe(function (query) { return loadOptions(query); });
};
SelectComponent.prototype.ngAfterContentInit = function () {
var _this = this;
var convert = function (options) {
_this.options.persisted = {};
options.forEach(function (_a, index) {
var key = _a.key, label = _a.label, icon = _a.icon, value = _a.value;
return _this.options.persisted["" + key] = { index: index, key: key, label: label, icon: icon, value: value };
});
_this.changes.options++;
};
convert(this.optionsFromMarkup.toArray());
this.optionsFromMarkup.changes.pipe(tap(function () { return _this.logger.debug('options from markup changed'); }))
.subscribe(function (options) { return convert(options.toArray()); });
};
SelectComponent.prototype.ngOnDestroy = function () {
this.destroyed = true;
if (!!this.reference.popover) {
this.reference.popover.hide();
this.reference.popover = null;
}
};
SelectComponent.prototype.picked = function (elements) {
return elements.indexOf(this.hostRef.nativeElement) !== -1;
};
SelectComponent.prototype.trackOption = function (index, option) {
return option.key || index;
};
SelectComponent.prototype.toggle = function (option) {
this.selected.indexOf(option.key) === -1
? this.select(option) : this.remove(option.key);
};
SelectComponent.prototype.select = function (option) {
this.logger.debug('option is selected');
this.options.persisted["" + option.key] = option;
this.changes.options++;
if (this.mode === SelectMode.multiple) {
this.selected.push(option.key);
if (!!this.reference.popover) {
this.reference.popover.update();
}
}
else {
this.selected = [option.key];
}
if (this.mode !== SelectMode.multiple || !this.features.includes(Feature.multiplex)) {
this.close();
}
this.onChange(this.mode === SelectMode.multiple ? this.selected : option.key);
this.updated.emit(option.value);
};
SelectComponent.prototype.remove = function (key) {
var index = this.selected.findIndex(function (i) { return i === key; });
if (index !== -1 && (this.mode === SelectMode.multiple || this.features.includes(Feature.allowEmpty))) {
this.logger.debug("option " + index + " has been removed");
this.selected.splice(index, 1);
this.changes.selected++;
this.onChange(this.mode === SelectMode.multiple ? this.selected : null);
}
};
SelectComponent.prototype.open = function () {
var _this = this;
this.opened = true;
var input = this.queryInput.nativeElement;
var checking = function () {
var style = getComputedStyle(input);
if (style.display !== 'none') {
input.focus();
}
else {
setTimeout(function () { return checking(); }, CHECKING_INTERVAL);
}
};
setTimeout(function () { return checking(); }, CHECKING_INTERVAL);
if (!this.mobile) {
this.reference.popover = this.popover.show(this.hostRef, {
contentTemplate: this.optionsTemplate,
behaviour: Behaviour.dropdown,
placement: this.placement,
padding: UI.gutter.small
});
this.popover.attached.pipe(takeWhile((function () { return !_this.destroyed; })), filter(function (t) { return !!t && t !== _this.hostRef; }))
.subscribe(function () { return _this.close(); });
}
};
SelectComponent.prototype.close = function () {
this.opened = false;
this.queryControl.setValue(null);
if (!!this.reference.popover) {
this.reference.popover.hide();
this.reference.popover = null;
}
};
SelectComponent.prototype.writeValue = function (value) {
if (this.mode === SelectMode.multiple && !value) {
throw new Error('Wrong value form multiple select mode');
}
this.selected = (this.mode === SelectMode.single ? (!!value ? [value] : []) : value);
};
SelectComponent.prototype.setDisabledState = function (disabled) {
this.disabled = disabled;
};
var SelectComponent_1;
SelectComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: FormBuilder },
{ type: PopoverService },
{ type: NGXLogger },
{ type: BreakpointService },
{ type: DeviceService }
]; };
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], SelectComponent.prototype, "host", void 0);
__decorate([
PropertyApi({
description: 'Select label field',
type: 'string',
default: 'label'
}),
Input(),
__metadata("design:type", Object)
], SelectComponent.prototype, "labelField", void 0);
__decorate([
PropertyApi({
description: 'Select key field',
type: 'string',
default: 'key'
}),
Input(),
__metadata("design:type", Object)
], SelectComponent.prototype, "keyField", void 0);
__decorate([
PropertyApi({
description: 'Select placeholder',
type: 'string'
}),
Input(),
__metadata("design:type", Object)
], SelectComponent.prototype, "placeholder", void 0);
__decorate([
PropertyApi({
description: 'Select required',
type: 'boolean',
default: 'false'
}),
Input(),
__metadata("design:type", Object)
], SelectComponent.prototype, "required", void 0);
__decorate([
HostBinding('attr.data-mode'),
__metadata("design:type", String)
], SelectComponent.prototype, "_mode", void 0);
__decorate([
HostBinding('attr.data-size'),
__metadata("design:type", String)
], SelectComponent.prototype, "_size", void 0);
__decorate([
HostBinding('attr.data-width'),
__metadata("design:type", String)
], SelectComponent.prototype, "_width", void 0);
__decorate([
PropertyApi({
description: 'Select label',
type: 'string'
}),
Input(),
__metadata("design:type", String)
], SelectComponent.prototype, "label", void 0);
__decorate([
PropertyApi({
description: 'Icon for select',
type: 'string',
}),
Input(),
__metadata("design:type", String)
], SelectComponent.prototype, "icon", void 0);
__decorate([
ViewChild('queryInput', { static: true }),
__metadata("design:type", ElementRef)
], SelectComponent.prototype, "queryInput", void 0);
__decorate([
ViewChild('selectedList', { static: true }),
__metadata("design:type", ElementRef)
], SelectComponent.prototype, "selectedList", void 0);
__decorate([
ViewChild('query'),
__metadata("design:type", ElementRef)
], SelectComponent.prototype, "query", void 0);
__decorate([
PropertyApi({
description: 'Select state',
path: 'ui.state',
options: [State.loading]
}),
HostBinding('attr.data-state'),
Input(),
__metadata("design:type", String)
], SelectComponent.prototype, "state", void 0);
__decorate([
PropertyApi({
description: 'Template for option',
type: 'TemplateRef<any>'
}),
Input(),
__metadata("design:type", TemplateRef)
], SelectComponent.prototype, "optionTemplate", void 0);
__decorate([
PropertyApi({
description: 'Template for empty options',
type: 'TemplateRef<any>'
}),
Input(),
__metadata("design:type", TemplateRef)
], SelectComponent.prototype, "emptyOptionsTemplate", void 0);
__decorate([
PropertyApi({
description: 'Template for options header',
type: 'TemplateRef<any>'
}),
Input(),
__metadata("design:type", TemplateRef)
], SelectComponent.prototype, "optionsHeaderTemplate", void 0);
__decorate([
ContentChildren(SelectOptionComponent),
__metadata("design:type", QueryList)
], SelectComponent.prototype, "optionsFromMarkup", void 0);
__decorate([
ViewChild('optionsTemplate'),
__metadata("design:type", TemplateRef)
], SelectComponent.prototype, "optionsTemplate", void 0);
__decorate([
PropertyApi({
description: 'Selected value',
type: '(selected)='
}),
Output('selected'),
__metadata("design:type", Object)
], SelectComponent.prototype, "updated", void 0);
__decorate([
HostBinding('attr.data-opened'),
__metadata("design:type", Object)
], SelectComponent.prototype, "opened", void 0);
__decorate([
PropertyApi({
description: 'Menu popover placement',
path: 'ui.placement',
default: Placement.absolute,
options: [Placement.absolute, Placement.fixed]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "placement", null);
__decorate([
PropertyApi({
description: 'Select mode',
path: 'ui.select.mode',
default: SelectMode.single,
options: [SelectMode.single, SelectMode.multiple]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "mode", null);
__decorate([
PropertyApi({
description: 'Select features',
path: 'ui.feature',
options: [Feature.search, Feature.multiplex, Feature.allowEmpty]
}),
HostBinding('attr.data-features'),
Input(),
__metadata("design:type", Array),
__metadata("design:paramtypes", [Array])
], SelectComponent.prototype, "features", null);
__decorate([
HostBinding('attr.data-disabled'),
Input(),
__metadata("design:type", Object)
], SelectComponent.prototype, "disabled", void 0);
__decorate([
PropertyApi({
description: 'Select size',
path: 'ui.size',
default: Size.normal,
options: [Size.tiny, Size.small, Size.normal, Size.large]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "size", null);
__decorate([
PropertyApi({
description: 'Select width',
path: 'ui.width',
default: Width.default,
options: [Width.default, Width.fluid]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "width", null);
__decorate([
HostBinding('attr.data-empty'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], SelectComponent.prototype, "empty", null);
__decorate([
PropertyApi({
description: 'Select loader',
type: 'function'
}),
Input(),
__metadata("design:type", Object)
], SelectComponent.prototype, "loader", void 0);
__decorate([
HostListener('document:click', ['$event.path']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Array]),
__metadata("design:returntype", void 0)
], SelectComponent.prototype, "clickOutside", null);
__decorate([
HostListener('click', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], SelectComponent.prototype, "focused", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], SelectComponent.prototype, "blurred", null);
SelectComponent = SelectComponent_1 = __decorate([
Component({
selector: 'jnt-select',
template: "<ng-template #emptyOptionsDefaultTemplate let-query=\"query\">\n <jnt-icon child-of=\"jnt-select-host\" [icon]=\"ui.icons.neutral\"></jnt-icon>\n</ng-template>\n\n<ng-template #optionDefaultTemplate let-icon=\"icon\" let-label=\"label\">\n <jnt-stack child-of=\"jnt-select-host\" [orientation]=\"ui.orientation.horizontal\"\n [gutter]=\"ui.gutter.small\"\n [align]=\"ui.align.center\">\n <jnt-icon child-of=\"jnt-select-host\" *ngIf=\"icon\" [icon]=\"icon\"></jnt-icon>\n <div child-of=\"jnt-select-host\" >{{label}}</div>\n </jnt-stack>\n</ng-template>\n\n<jnt-stack child-of=\"jnt-select-host\" data-select [orientation]=\"ui.orientation.horizontal\"\n [gutter]=\"ui.gutter.tiny\" [align]=\"ui.align.center\"\n tabindex=\"0\">\n <div child-of=\"jnt-select-host\" *ngIf=\"!!label\" data-label>{{label}}</div>\n <jnt-icon child-of=\"jnt-select-host\" *ngIf=\"!!icon && !label\" [icon]=\"icon\"></jnt-icon>\n <ul child-of=\"jnt-select-host\" #selectedList>\n <ng-container *ngIf=\"selected.length\">\n <li child-of=\"jnt-select-host\" *ngFor=\"let key of selected\" (click)=\"mode == ui.select.mode.single ? (opened ? close() : open()) : null\"\n [attr.data-with-template]=\"!!optionTemplate\">\n <ng-template #noOptionTemplate>\n <div child-of=\"jnt-select-host\" data-empty></div>\n </ng-template>\n <div child-of=\"jnt-select-host\" *ngIf=\"(key | getOption:options:changes.selected:changes.options) as o;else noOptionTemplate\">\n <ng-container *ngTemplateOutlet=\"!!optionTemplate ? optionTemplate\n : optionDefaultTemplate;context: {icon: o.icon, label: o.label, value: o.value, selected: true}\">\n </ng-container>\n </div>\n <button child-of=\"jnt-select-host\" data-close type=\"button\" (click)=\"remove(key)\">\n <jnt-icon child-of=\"jnt-select-host\" [icon]=\"ui.icons.closeSmall\"></jnt-icon>\n </button>\n </li>\n </ng-container>\n\n <li child-of=\"jnt-select-host\" data-query [formGroup]=\"form\" (click)=\"opened ? close() : open()\">\n <input child-of=\"jnt-select-host\" #queryInput [placeholder]=\"mode != ui.select.mode.multiple || !selected.length ? placeholder : ''\"\n formControlName=\"query\" />\n </li>\n </ul>\n <div child-of=\"jnt-select-host\" data-loading *ngIf=\"state === ui.state.loading\">\n <jnt-spinner child-of=\"jnt-select-host\" data-spinner></jnt-spinner>\n </div>\n <button child-of=\"jnt-select-host\" data-toggle type=\"button\" (click)=\"opened ? close() : open()\">\n <jnt-icon child-of=\"jnt-select-host\" [icon]=\"opened ? ui.icons.selectOpen : ui.icons.selectClose\"></jnt-icon>\n </button>\n</jnt-stack>\n\n<ng-template #optionsTemplate>\n <div child-of=\"jnt-select-host\" data-options *ngIf=\"opened\" [attr.data-loading]=\"loading\">\n <ng-template #noOptionsTemplate>\n <div child-of=\"jnt-select-host\" data-skeleton>\n <jnt-skeleton child-of=\"jnt-select-host\" *ngIf=\"loading; else optionsNotFoundTemplate\"\n [type]=\"ui.skeleton.type.text\" [lines]=\"5\"></jnt-skeleton>\n </div>\n <ng-template #optionsNotFoundTemplate>\n <div child-of=\"jnt-select-host\" data-empty-options>\n <ng-container *ngTemplateOutlet=\"!!emptyOptionsTemplate ? emptyOptionsTemplate\n : emptyOptionsDefaultTemplate;context: {query: queryControl.value, close: close.bind(this)}\">\n </ng-container>\n </div>\n </ng-template>\n </ng-template>\n <ng-container *ngIf=\"((!!queryControl.value ? options.found : options.persisted)\n | getOptions:changes.selected:changes.options) as options\">\n <ng-container *ngIf=\"options.length;else noOptionsTemplate\">\n <div child-of=\"jnt-select-host\" data-loading *ngIf=\"loading\">\n <jnt-spinner child-of=\"jnt-select-host\" data-spinner></jnt-spinner>\n </div>\n <jnt-stack child-of=\"jnt-select-host\" [align]=\"ui.align.stretch\">\n <div child-of=\"jnt-select-host\" data-options-header *ngIf=\"!!optionsHeaderTemplate\">\n <ng-container *ngTemplateOutlet=\"optionsHeaderTemplate;context: {close: close.bind(this)}\"></ng-container>\n </div>\n <ul child-of=\"jnt-select-host\" [attr.data-windows]=\"device.platform.windows\">\n <li child-of=\"jnt-select-host\" *ngFor=\"let o of options;trackBy:trackOption\"\n [attr.data-selected]=\"selected | includes:o.key\"\n (click)=\"toggle(o)\">\n <ng-container *ngTemplateOutlet=\"!!optionTemplate ? optionTemplate\n : optionDefaultTemplate;context: {icon: o.icon, label: o.label, value: o.value}\">\n </ng-container>\n </li>\n </ul>\n </jnt-stack>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-container *jntFor=\"ui.breakpoint.mobile\">\n <ng-container *ngTemplateOutlet=\"optionsTemplate\"></ng-container>\n</ng-container>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return SelectComponent_1; }),
multi: true
}
]
}),
__metadata("design:paramtypes", [ElementRef,
Renderer2,
FormBuilder,
PopoverService,
NGXLogger,
BreakpointService,
DeviceService])
], SelectComponent);
return SelectComponent;
}());
export { SelectComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BqdW50ZS91aS8iLCJzb3VyY2VzIjpbImxpYi9mb3Jtcy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxF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QztRQUNELEtBQUssRUFBRTs7O2dEQUVQO0lBR0Q7UUFEQyxXQUFXLENBQUMsaUJBQWlCLENBQUM7OztnREFHOUI7SUFPRDtRQUxDLFdBQVcsQ0FBQztZQUNYLFdBQVcsRUFBRSxlQUFlO1lBQzVCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUM7UUFDRCxLQUFLLEVBQUU7O21EQUNNO0lBR2Q7UUFEQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7Ozt1REFLL0M7SUFHRDtRQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7OztrREFXakM7SUFHRDtRQURDLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7a0RBR3BCO0lBdFBVLGVBQWU7UUFYM0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLFlBQVk7WUFDdEIsbzlKQUF5QztZQUN6QyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsaUJBQWUsRUFBZixDQUFlLENBQUM7b0JBQzlDLEtBQUssRUFBRSxJQUFJO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO3lDQThQNkIsVUFBVTtZQUNULFNBQVM7WUFDZixXQUFXO1lBQ04sY0FBYztZQUNmLFNBQVM7WUFDTCxpQkFBaUI7WUFDdEIsYUFBYTtPQW5RN0IsZUFBZSxDQXNhM0I7SUFBRCxzQkFBQztDQUFBLEFBdGFELElBc2FDO1NBdGFZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUJ1aWxkZXIsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmluYWxpemUsIHRha2VXaGlsZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGV2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2RldmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IFByb3BlcnR5QXBpIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzL2FwaSc7XG5pbXBvcnQgeyBCZWhhdmlvdXIgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2JlaGF2aW91cic7XG5pbXBvcnQgeyBCcmVha3BvaW50IH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9icmVha3BvaW50JztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2ZlYXR1cmUnO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9wbGFjZW1lbnQnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvc2l6ZSc7XG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvc3RhdGUnO1xuaW1wb3J0IHsgVUkgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL3VpJztcbmltcG9ydCB7IFdpZHRoIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy93aWR0aCc7XG5pbXBvcnQgeyBCcmVha3BvaW50U2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2JyZWFrcG9pbnQuc2VydmljZSc7XG5pbXBvcnQgeyBQb3BvdmVySW5zdGFuY2UsIFBvcG92ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vb3ZlcmxheXMvcG9wb3Zlci9wb3BvdmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0TW9kZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgSU9wdGlvbiwgS2V5LCBPcHRpb25zIH0gZnJvbSAnLi9tb2RlbCc7XG5cbmNvbnN0IE1JTl9XSURUSCA9IDIwO1xuY29uc3QgQ0hBUl9XSURUSCA9IDg7XG5jb25zdCBDSEVDS0lOR19JTlRFUlZBTCA9IDEwMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LXNlbGVjdC1vcHRpb24nLFxuICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0T3B0aW9uQ29tcG9uZW50IHtcblxuICB1aSA9IFVJO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdJY29uIGZvciBzZWxlY3Qgb3B0aW9uJyxcbiAgICB0eXBlOiAnc3RyaW5nJ1xuICB9KVxuICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGl