UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

909 lines 62.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, forwardRef, Inject, Input, Output, QueryList, ViewChild, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { take, takeWhile } from 'rxjs/operators'; import { defer, merge } from 'rxjs'; import { NbAdjustment, NbOverlayService, NbPortalDirective, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, } from '../cdk'; import { NbOptionComponent } from './option.component'; import { NbButtonComponent } from '../button/button.component'; import { NB_DOCUMENT } from '../../theme.options'; import { convertToBoolProperty } from '../helpers'; var NbSelectLabelComponent = /** @class */ (function () { function NbSelectLabelComponent() { } NbSelectLabelComponent.decorators = [ { type: Component, args: [{ selector: 'nb-select-label', template: '<ng-content></ng-content>' }] } ]; return NbSelectLabelComponent; }()); export { NbSelectLabelComponent }; /* * The `NbSelectComponent` provides a capability to select one of the passed items. * * @stacked-example(Showcase, select/select-showcase.component) * * ### Installation * * Import `NbSelectModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbSelectModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * If you want to use it as the multi-select control you have to mark it as `multiple`. * In this case, `nb-select` will work only with arrays - accept arrays and propagate arrays. * * @stacked-example(Multiple, select/select-multiple.component) * * Items without values will clean selection. * * @stacked-example(Clean selection, select/select-clean.component) * * Select may be bounded using `selected` input: * * ```html * <nb-select [(selected)]="selected"></nb-selected> * ``` * * Or you can bind control with form controls or ngModel: * * @stacked-example(Select form binding, select/select-form.component) * * Options in the select may be grouped using `nb-option-group` component. * * @stacked-example(Grouping, select/select-groups.component) * * Select may have a placeholder that will be shown when nothing selected: * * @stacked-example(Placeholder, select/select-placeholder.component) * * You can disable select, options and whole groups. * * @stacked-example(Disabled select, select/select-disabled.component) * * Also, the custom label may be provided in select. * This custom label will be used for instead placeholder when something selected. * * @stacked-example(Custom label, select/select-label.component) * * Default `nb-select` size is `medium` and status color is `primary`. * Select is available in multiple colors using `status` property: * * @stacked-example(Select statuses, select/select-status.component) * * There are four select sizes: * * @stacked-example(Select sizes, select/select-sizes.component) * * And two additional style types - `outline`: * * @stacked-example(Outline select, select/select-outline.component) * * and `hero`: * * @stacked-example(Select colors, select/select-hero.component) * * Select is available in different shapes, that could be combined with the other properties: * * @stacked-example(Select shapes, select/select-shapes.component) * * * @styles * * select-border-width: * select-max-height: * select-bg: * select-checkbox-color: * select-checkmark-color: * select-option-disabled-bg: * select-option-disabled-opacity: * select-option-padding: * */ /** * @template T */ var NbSelectComponent = /** @class */ (function () { function NbSelectComponent(document, overlay, hostRef, positionBuilder, cd) { var _this = this; this.document = document; this.overlay = overlay; this.hostRef = hostRef; this.positionBuilder = positionBuilder; this.cd = cd; /* * Select status (adds specific styles): * `primary`, `info`, `success`, `warning`, `danger` */ this.status = 'primary'; /* * Renders select placeholder if nothing selected. * */ this.placeholder = ''; /* * Will be emitted when selected value changes. * */ this.selectedChange = new EventEmitter(); this.multiple = false; /* * List of selected options. * */ this.selectionModel = []; /* * Current overlay position because of we have to toggle overlayPosition * in [ngClass] direction and this directive can use only string. */ this.overlayPosition = (/** @type {?} */ ('')); /* * Stream of events that will fire when one of the options fire selectionChange event. * */ this.selectionChange = defer(function () { return merge.apply(void 0, tslib_1.__spread(_this.options.map(function (it) { return it.selectionChange; }))); }); this.alive = true; /* * Function passed through control value accessor to propagate changes. * */ this.onChange = function () { }; this.onTouched = function () { }; } Object.defineProperty(NbSelectComponent.prototype, "setSelected", { /* * Accepts selected item or array of selected items. * */ set: /* * Accepts selected item or array of selected items. * */ /** * @param {?} value * @return {?} */ function (value) { this.writeValue(value); }, enumerable: true, configurable: true }); Object.defineProperty(NbSelectComponent.prototype, "setMultiple", { /* * Gives capability just write `multiple` over the element. * */ set: /* * Gives capability just write `multiple` over the element. * */ /** * @param {?} multiple * @return {?} */ function (multiple) { this.multiple = convertToBoolProperty(multiple); }, enumerable: true, configurable: true }); Object.defineProperty(NbSelectComponent.prototype, "isOpened", { /* * Determines is select opened. * */ get: /* * Determines is select opened. * */ /** * @return {?} */ function () { return this.ref && this.ref.hasAttached(); }, enumerable: true, configurable: true }); Object.defineProperty(NbSelectComponent.prototype, "isHidden", { /* * Determines is select hidden. * */ get: /* * Determines is select hidden. * */ /** * @return {?} */ function () { return !this.isOpened; }, enumerable: true, configurable: true }); Object.defineProperty(NbSelectComponent.prototype, "hostWidth", { /* * Returns width of the select button. * */ get: /* * Returns width of the select button. * */ /** * @return {?} */ function () { return this.hostRef.nativeElement.getBoundingClientRect().width; }, enumerable: true, configurable: true }); Object.defineProperty(NbSelectComponent.prototype, "selectionView", { /* * Content rendered in the label. * */ get: /* * Content rendered in the label. * */ /** * @return {?} */ function () { if (this.selectionModel.length > 1) { return this.selectionModel.map(function (option) { return option.content; }).join(', '); } return this.selectionModel[0].content; }, enumerable: true, configurable: true }); /** * @return {?} */ NbSelectComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.createOverlay(); }; /** * @return {?} */ NbSelectComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.subscribeOnTriggers(); this.subscribeOnPositionChange(); this.subscribeOnSelectionChange(); }; /** * @return {?} */ NbSelectComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { if (this.queue) { this.writeValue(this.queue); this.cd.detectChanges(); } }; /** * @return {?} */ NbSelectComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.ref.dispose(); }; /** * @return {?} */ NbSelectComponent.prototype.show = /** * @return {?} */ function () { if (this.isHidden) { this.ref.attach(this.portal); this.cd.markForCheck(); } }; /** * @return {?} */ NbSelectComponent.prototype.hide = /** * @return {?} */ function () { if (this.isOpened) { this.ref.detach(); this.cd.markForCheck(); } }; /** * @param {?} fn * @return {?} */ NbSelectComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ NbSelectComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * @param {?} isDisabled * @return {?} */ NbSelectComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { this.disabled = isDisabled; this.cd.detectChanges(); }; /** * @param {?} value * @return {?} */ NbSelectComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (!value) { return; } if (this.options) { this.setSelection(value); } else { this.queue = value; } }; /* * Selects option or clear all selected options if value is null. * */ /* * Selects option or clear all selected options if value is null. * */ /** * @protected * @param {?} option * @return {?} */ NbSelectComponent.prototype.handleSelect = /* * Selects option or clear all selected options if value is null. * */ /** * @protected * @param {?} option * @return {?} */ function (option) { if (option.value) { this.selectOption(option); } else { this.reset(); } this.cd.detectChanges(); }; /* * Deselect all selected options. * */ /* * Deselect all selected options. * */ /** * @protected * @return {?} */ NbSelectComponent.prototype.reset = /* * Deselect all selected options. * */ /** * @protected * @return {?} */ function () { this.selectionModel.forEach(function (option) { return option.deselect(); }); this.selectionModel = []; this.hide(); this.button.nativeElement.focus(); this.emitSelected(null); }; /* * Determines how to select option as multiple or single. * */ /* * Determines how to select option as multiple or single. * */ /** * @protected * @param {?} option * @return {?} */ NbSelectComponent.prototype.selectOption = /* * Determines how to select option as multiple or single. * */ /** * @protected * @param {?} option * @return {?} */ function (option) { if (this.multiple) { this.handleMultipleSelect(option); } else { this.handleSingleSelect(option); } }; /* * Select single option. * */ /* * Select single option. * */ /** * @protected * @param {?} option * @return {?} */ NbSelectComponent.prototype.handleSingleSelect = /* * Select single option. * */ /** * @protected * @param {?} option * @return {?} */ function (option) { /** @type {?} */ var selected = this.selectionModel.pop(); if (selected && selected !== option) { selected.deselect(); } this.selectionModel = [option]; option.select(); this.hide(); this.button.nativeElement.focus(); this.emitSelected(option.value); }; /* * Select for multiple options. * */ /* * Select for multiple options. * */ /** * @protected * @param {?} option * @return {?} */ NbSelectComponent.prototype.handleMultipleSelect = /* * Select for multiple options. * */ /** * @protected * @param {?} option * @return {?} */ function (option) { if (option.selected) { this.selectionModel = this.selectionModel.filter(function (s) { return s.value !== option.value; }); option.deselect(); } else { this.selectionModel.push(option); option.select(); } this.emitSelected(this.selectionModel.map(function (opt) { return opt.value; })); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.createOverlay = /** * @protected * @return {?} */ function () { /** @type {?} */ var scrollStrategy = this.createScrollStrategy(); this.positionStrategy = this.createPositionStrategy(); this.ref = this.overlay.create({ positionStrategy: this.positionStrategy, scrollStrategy: scrollStrategy }); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.createPositionStrategy = /** * @protected * @return {?} */ function () { return this.positionBuilder .connectedTo(this.hostRef) .position(NbPosition.BOTTOM) .offset(0) .adjustment(NbAdjustment.VERTICAL); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.createScrollStrategy = /** * @protected * @return {?} */ function () { return this.overlay.scrollStrategies.block(); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.subscribeOnTriggers = /** * @protected * @return {?} */ function () { var _this = this; /** @type {?} */ var triggerStrategy = new NbTriggerStrategyBuilder() .document(this.document) .trigger(NbTrigger.CLICK) .host(this.hostRef.nativeElement) .container(function () { return _this.getContainer(); }) .build(); triggerStrategy.show$ .pipe(takeWhile(function () { return _this.alive; })) .subscribe(function () { return _this.show(); }); triggerStrategy.hide$ .pipe(takeWhile(function () { return _this.alive; })) .subscribe(function ($event) { _this.hide(); if (!_this.isClickedWithinComponent($event)) { _this.onTouched(); } }); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.subscribeOnPositionChange = /** * @protected * @return {?} */ function () { var _this = this; this.positionStrategy.positionChange .pipe(takeWhile(function () { return _this.alive; })) .subscribe(function (position) { return _this.overlayPosition = position; }); this.positionStrategy.positionChange .pipe(take(1)) .subscribe(function () { return _this.cd.detectChanges(); }); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.subscribeOnSelectionChange = /** * @protected * @return {?} */ function () { var _this = this; this.selectionChange .pipe(takeWhile(function () { return _this.alive; })) .subscribe(function (option) { return _this.handleSelect(option); }); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.getContainer = /** * @protected * @return {?} */ function () { return this.ref && this.ref.hasAttached() && (/** @type {?} */ ({ location: { nativeElement: this.ref.overlayElement, }, })); }; /* * Propagate selected value. * */ /* * Propagate selected value. * */ /** * @protected * @param {?} selected * @return {?} */ NbSelectComponent.prototype.emitSelected = /* * Propagate selected value. * */ /** * @protected * @param {?} selected * @return {?} */ function (selected) { this.onChange(selected); this.selectedChange.emit(selected); }; /* * Set selected value in model. * */ /* * Set selected value in model. * */ /** * @protected * @param {?} value * @return {?} */ NbSelectComponent.prototype.setSelection = /* * Set selected value in model. * */ /** * @protected * @param {?} value * @return {?} */ function (value) { var _this = this; /** @type {?} */ var isArray = Array.isArray(value); if (this.multiple && !isArray) { throw new Error('Can\'t assign single value if select is marked as multiple'); } if (!this.multiple && isArray) { throw new Error('Can\'t assign array if select is not marked as multiple'); } this.cleanSelection(); if (isArray) { ((/** @type {?} */ (value))).forEach(function (option) { return _this.selectValue(option); }); } else { this.selectValue((/** @type {?} */ (value))); } this.cd.markForCheck(); this.cd.detectChanges(); }; /** * @protected * @return {?} */ NbSelectComponent.prototype.cleanSelection = /** * @protected * @return {?} */ function () { this.selectionModel.forEach(function (option) { return option.deselect(); }); this.selectionModel = []; }; /* * Selects value. * */ /* * Selects value. * */ /** * @protected * @param {?} value * @return {?} */ NbSelectComponent.prototype.selectValue = /* * Selects value. * */ /** * @protected * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var corresponding = this.options.find(function (option) { return option.value === value; }); if (corresponding) { corresponding.select(); this.selectionModel.push(corresponding); } }; /* * Sets touched if focus moved outside of button and overlay, * ignoring the case when focus moved to options overlay. */ /* * Sets touched if focus moved outside of button and overlay, * ignoring the case when focus moved to options overlay. */ /** * @return {?} */ NbSelectComponent.prototype.trySetTouched = /* * Sets touched if focus moved outside of button and overlay, * ignoring the case when focus moved to options overlay. */ /** * @return {?} */ function () { if (this.isHidden) { this.onTouched(); } }; /** * @protected * @param {?} $event * @return {?} */ NbSelectComponent.prototype.isClickedWithinComponent = /** * @protected * @param {?} $event * @return {?} */ function ($event) { return this.hostRef.nativeElement === $event.target || this.hostRef.nativeElement.contains((/** @type {?} */ ($event.target))); }; NbSelectComponent.decorators = [ { type: Component, args: [{ selector: 'nb-select', template: "<button\r\n nbButton\r\n [size]=\"size\"\r\n [status]=\"status\"\r\n [shape]=\"shape\"\r\n [hero]=\"hero\"\r\n [disabled]=\"disabled\"\r\n [fullWidth]=\"fullWidth\"\r\n [outline]=\"outline\"\r\n [class.opened]=\"isOpened\"\r\n [ngClass]=\"overlayPosition\"\r\n (blur)=\"trySetTouched()\"\r\n type=\"button\">\r\n\r\n <ng-container *ngIf=\"selectionModel?.length\">\r\n\r\n <ng-container *ngIf=\"customLabel\">\r\n <ng-content select=\"nb-select-label\"></ng-content>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!customLabel\">{{ selectionView }}</ng-container>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!selectionModel?.length\">{{ placeholder }}</ng-container>\r\n\r\n</button>\r\n\r\n<nb-card *nbPortal class=\"select\" [ngClass]=\"[status, overlayPosition]\" [style.width.px]=\"hostWidth\">\r\n <nb-card-body>\r\n <ng-content select=\"nb-option, nb-option-group\"></ng-content>\r\n </nb-card-body>\r\n</nb-card>\r\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return NbSelectComponent; }), multi: true, }, ], styles: ["/*!\r\n * @license\r\n * Copyright Akveo. All Rights Reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n */:host{display:block}:host button{position:relative;width:100%;text-align:start;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:none}:host button::after{top:50%;right:.75rem;position:absolute;display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:'';border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}"] }] } ]; /** @nocollapse */ NbSelectComponent.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: NbOverlayService }, { type: ElementRef }, { type: NbPositionBuilderService }, { type: ChangeDetectorRef } ]; }; NbSelectComponent.propDecorators = { size: [{ type: Input }], status: [{ type: Input }], shape: [{ type: Input }], hero: [{ type: Input }], disabled: [{ type: Input }], fullWidth: [{ type: Input }], outline: [{ type: Input }], placeholder: [{ type: Input }], selectedChange: [{ type: Output }], setSelected: [{ type: Input, args: ['selected',] }], setMultiple: [{ type: Input, args: ['multiple',] }], options: [{ type: ContentChildren, args: [NbOptionComponent, { descendants: true },] }], customLabel: [{ type: ContentChild, args: [NbSelectLabelComponent,] }], portal: [{ type: ViewChild, args: [NbPortalDirective,] }], button: [{ type: ViewChild, args: [NbButtonComponent, { read: ElementRef },] }] }; return NbSelectComponent; }()); export { NbSelectComponent }; if (false) { /** @type {?} */ NbSelectComponent.prototype.size; /** @type {?} */ NbSelectComponent.prototype.status; /** @type {?} */ NbSelectComponent.prototype.shape; /** @type {?} */ NbSelectComponent.prototype.hero; /** @type {?} */ NbSelectComponent.prototype.disabled; /** @type {?} */ NbSelectComponent.prototype.fullWidth; /** @type {?} */ NbSelectComponent.prototype.outline; /** @type {?} */ NbSelectComponent.prototype.placeholder; /** @type {?} */ NbSelectComponent.prototype.selectedChange; /** @type {?} */ NbSelectComponent.prototype.options; /** @type {?} */ NbSelectComponent.prototype.customLabel; /** @type {?} */ NbSelectComponent.prototype.portal; /** @type {?} */ NbSelectComponent.prototype.button; /** @type {?} */ NbSelectComponent.prototype.multiple; /** @type {?} */ NbSelectComponent.prototype.selectionModel; /** @type {?} */ NbSelectComponent.prototype.positionStrategy; /** @type {?} */ NbSelectComponent.prototype.overlayPosition; /** @type {?} */ NbSelectComponent.prototype.selectionChange; /** * @type {?} * @protected */ NbSelectComponent.prototype.ref; /** * @type {?} * @protected */ NbSelectComponent.prototype.alive; /** * @type {?} * @protected */ NbSelectComponent.prototype.queue; /** * @type {?} * @protected */ NbSelectComponent.prototype.onChange; /** * @type {?} * @protected */ NbSelectComponent.prototype.onTouched; /** * @type {?} * @protected */ NbSelectComponent.prototype.document; /** * @type {?} * @protected */ NbSelectComponent.prototype.overlay; /** * @type {?} * @protected */ NbSelectComponent.prototype.hostRef; /** * @type {?} * @protected */ NbSelectComponent.prototype.positionBuilder; /** * @type {?} * @protected */ NbSelectComponent.prototype.cd; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFFTCxZQUFZLEVBRVosZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLFNBQVMsRUFFVCx3QkFBd0IsR0FDekIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUduRDtJQUFBO0lBS0EsQ0FBQzs7Z0JBTEEsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDOztJQUVELDZCQUFDO0NBQUEsQUFMRCxJQUtDO1NBRFksc0JBQXNCOzs7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QUU1QixrQ0FBZ0M7Ozs7O0lBT2hDLGtDQUF5Qjs7Ozs7SUFLekIscUNBQXdDOzs7OztJQUN4QyxzQ0FBeUM7Ozs7O0lBRTdCLHFDQUF1Qzs7Ozs7SUFDdkMsb0NBQW1DOzs7OztJQUNuQyxvQ0FBMEM7Ozs7O0lBQzFDLDRDQUFtRDs7Ozs7SUFDbkQsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRSZWYsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IHRha2UsIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgZGVmZXIsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgTmJBZGp1c3RtZW50LFxyXG4gIE5iT3ZlcmxheVJlZixcclxuICBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gIE5iUG9ydGFsRGlyZWN0aXZlLFxyXG4gIE5iUG9zaXRpb24sXHJcbiAgTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLCBOYlNjcm9sbFN0cmF0ZWd5LFxyXG4gIE5iVHJpZ2dlcixcclxuICBOYlRyaWdnZXJTdHJhdGVneSxcclxuICBOYlRyaWdnZXJTdHJhdGVneUJ1aWxkZXIsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTmJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL29wdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOYkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTkJfRE9DVU1FTlQgfSBmcm9tICcuLi8uLi90aGVtZS5vcHRpb25zJztcclxuaW1wb3J0IHsgY29udmVydFRvQm9vbFByb3BlcnR5IH0gZnJvbSAnLi4vaGVscGVycyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYi1zZWxlY3QtbGFiZWwnLFxyXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYlNlbGVjdExhYmVsQ29tcG9uZW50IHtcclxufVxyXG5cclxuLypcclxuICogVGhlIGBOYlNlbGVjdENvbXBvbmVudGAgcHJvdmlkZXMgYSBjYXBhYmlsaXR5IHRvIHNlbGVjdCBvbmUgb2YgdGhlIHBhc3NlZCBpdGVtcy5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShTaG93Y2FzZSwgc2VsZWN0L3NlbGVjdC1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYlNlbGVjdE1vZHVsZWAgdG8geW91ciBmZWF0dXJlIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iU2VsZWN0TW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIElmIHlvdSB3YW50IHRvIHVzZSBpdCBhcyB0aGUgbXVsdGktc2VsZWN0IGNvbnRyb2wgeW91IGhhdmUgdG8gbWFyayBpdCBhcyBgbXVsdGlwbGVgLlxyXG4gKiBJbiB0aGlzIGNhc2UsIGBuYi1zZWxlY3RgIHdpbGwgd29yayBvbmx5IHdpdGggYXJyYXlzIC0gYWNjZXB0IGFycmF5cyBhbmQgcHJvcGFnYXRlIGFycmF5cy5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShNdWx0aXBsZSwgc2VsZWN0L3NlbGVjdC1tdWx0aXBsZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEl0ZW1zIHdpdGhvdXQgdmFsdWVzIHdpbGwgY2xlYW4gc2VsZWN0aW9uLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKENsZWFuIHNlbGVjdGlvbiwgc2VsZWN0L3NlbGVjdC1jbGVhbi5jb21wb25lbnQpXHJcbiAqXHJcbiAqIFNlbGVjdCBtYXkgYmUgYm91bmRlZCB1c2luZyBgc2VsZWN0ZWRgIGlucHV0OlxyXG4gKlxyXG4gKiBgYGBodG1sXHJcbiAqIDxuYi1zZWxlY3QgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRcIj48L25iLXNlbGVjdGVkPlxyXG4gKiBgYGBcclxuICpcclxuICogT3IgeW91IGNhbiBiaW5kIGNvbnRyb2wgd2l0aCBmb3JtIGNvbnRyb2xzIG9yIG5nTW9kZWw6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IGZvcm0gYmluZGluZywgc2VsZWN0L3NlbGVjdC1mb3JtLmNvbXBvbmVudClcclxuICpcclxuICogT3B0aW9ucyBpbiB0aGUgc2VsZWN0IG1heSBiZSBncm91cGVkIHVzaW5nIGBuYi1vcHRpb24tZ3JvdXBgIGNvbXBvbmVudC5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShHcm91cGluZywgc2VsZWN0L3NlbGVjdC1ncm91cHMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBTZWxlY3QgbWF5IGhhdmUgYSBwbGFjZWhvbGRlciB0aGF0IHdpbGwgYmUgc2hvd24gd2hlbiBub3RoaW5nIHNlbGVjdGVkOlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFBsYWNlaG9sZGVyLCBzZWxlY3Qvc2VsZWN0LXBsYWNlaG9sZGVyLmNvbXBvbmVudClcclxuICpcclxuICogWW91IGNhbiBkaXNhYmxlIHNlbGVjdCwgb3B0aW9ucyBhbmQgd2hvbGUgZ3JvdXBzLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKERpc2FibGVkIHNlbGVjdCwgc2VsZWN0L3NlbGVjdC1kaXNhYmxlZC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEFsc28sIHRoZSBjdXN0b20gbGFiZWwgbWF5IGJlIHByb3ZpZGVkIGluIHNlbGVjdC5cclxuICogVGhpcyBjdXN0b20gbGFiZWwgd2lsbCBiZSB1c2VkIGZvciBpbnN0ZWFkIHBsYWNlaG9sZGVyIHdoZW4gc29tZXRoaW5nIHNlbGVjdGVkLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEN1c3RvbSBsYWJlbCwgc2VsZWN0L3NlbGVjdC1sYWJlbC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIERlZmF1bHQgYG5iLXNlbGVjdGAgc2l6ZSBpcyBgbWVkaXVtYCBhbmQgc3RhdHVzIGNvbG9yIGlzIGBwcmltYXJ5YC5cclxuICogU2VsZWN0IGlzIGF2YWlsYWJsZSBpbiBtdWx0aXBsZSBjb2xvcnMgdXNpbmcgYHN0YXR1c2AgcHJvcGVydHk6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IHN0YXR1c2VzLCBzZWxlY3Qvc2VsZWN0LXN0YXR1cy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSBmb3VyIHNlbGVjdCBzaXplczpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShTZWxlY3Qgc2l6ZXMsIHNlbGVjdC9zZWxlY3Qtc2l6ZXMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBBbmQgdHdvIGFkZGl0aW9uYWwgc3R5bGUgdHlwZXMgLSBgb3V0bGluZWA6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoT3V0bGluZSBzZWxlY3QsIHNlbGVjdC9zZWxlY3Qtb3V0bGluZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGFuZCBgaGVyb2A6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IGNvbG9ycywgc2VsZWN0L3NlbGVjdC1oZXJvLmNvbXBvbmVudClcclxuICpcclxuICogU2VsZWN0IGlzIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnQgc2hhcGVzLCB0aGF0IGNvdWxkIGJlIGNvbWJpbmVkIHdpdGggdGhlIG90aGVyIHByb3BlcnRpZXM6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IHNoYXBlcywgc2VsZWN0L3NlbGVjdC1zaGFwZXMuY29tcG9uZW50KVxyXG4gKlxyXG4gKlxyXG4gKiBAc3R5bGVzXHJcbiAqXHJcbiAqIHNlbGVjdC1ib3JkZXItd2lkdGg6XHJcbiAqIHNlbGVjdC1tYXgtaGVpZ2h0OlxyXG4gKiBzZWxlY3QtYmc6XHJcbiAqIHNlbGVjdC1jaGVja2JveC1jb2xvcjpcclxuICogc2VsZWN0LWNoZWNrbWFyay1jb2xvcjpcclxuICogc2VsZWN0LW9wdGlvbi1kaXNhYmxlZC1iZzpcclxuICogc2VsZWN0LW9wdGlvbi1kaXNhYmxlZC1vcGFjaXR5OlxyXG4gKiBzZWxlY3Qtb3B0aW9uLXBhZGRpbmc6XHJcbiAqICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmItc2VsZWN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5iU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYlNlbGVjdENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgLypcclxuICAgKiBTZWxlY3Qgc2l6ZSwgYXZhaWxhYmxlIHNpemVzOlxyXG4gICAqIGB4eHNtYWxsYCwgYHhzbWFsbGAsIGBzbWFsbGAsIGBtZWRpdW1gLCBgbGFyZ2VgXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2l6ZTogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIFNlbGVjdCBzdGF0dXMgKGFkZHMgc3BlY2lmaWMgc3R5bGVzKTpcclxuICAgKiBgcHJpbWFyeWAsIGBpbmZvYCwgYHN1Y2Nlc3NgLCBgd2FybmluZ2AsIGBkYW5nZXJgXHJcbiAgICovXHJcbiAgQElucHV0KCkgc3RhdHVzOiBzdHJpbmcgPSAncHJpbWFyeSc7XHJcblxyXG4gIC8qXHJcbiAgICogU2VsZWN0IHNoYXBlczogYHJlY3RhbmdsZWAsIGByb3VuZGAsIGBzZW1pLXJvdW5kYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNoYXBlOiBzdHJpbmc7XHJcblxyXG4gIC8qXHJcbiAgICogQWRkcyBgaGVyb2Agc3R5bGVzXHJcbiAgICovXHJcbiAgQElucHV0KCkgaGVybzogYm9vbGVhbjtcclxuXHJcbiAgLypcclxuICAgKiBEaXNhYmxlcyB0aGUgc2VsZWN0XHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8qXHJcbiAgICogSWYgc2V0IGVsZW1lbnQgd2lsbCBmaWxsIGl0cyBjb250YWluZXJcclxuICAgKi9cclxuICBASW5wdXQoKSBmdWxsV2lkdGg6IGJvb2xlYW47XHJcblxyXG4gIC8qXHJcbiAgICogQWRkcyBgb3V0bGluZWAgc3R5bGVzXHJcbiAgICovXHJcbiAgQElucHV0KCkgb3V0bGluZTogYm9vbGVhbjtcclxuXHJcbiAgLypcclxuICAgKiBSZW5kZXJzIHNlbGVjdCBwbGFjZWhvbGRlciBpZiBub3RoaW5nIHNlbGVjdGVkLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKlxyXG4gICAqIFdpbGwgYmUgZW1pdHRlZCB3aGVuIHNlbGVjdGVkIHZhbHVlIGNoYW5nZXMuXHJcbiAgICogKi9cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxUIHwgVFtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLypcclxuICAgKiBBY2NlcHRzIHNlbGVjdGVkIGl0ZW0gb3IgYXJyYXkgb2Ygc2VsZWN0ZWQgaXRlbXMuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ3NlbGVjdGVkJylcclxuICBzZXQgc2V0U2VsZWN0ZWQodmFsdWU6IFQgfCBUW10pIHtcclxuICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEdpdmVzIGNhcGFiaWxpdHkganVzdCB3cml0ZSBgbXVsdGlwbGVgIG92ZXIgdGhlIGVsZW1lbnQuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ211bHRpcGxlJylcclxuICBzZXQgc2V0TXVsdGlwbGUobXVsdGlwbGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubXVsdGlwbGUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkobXVsdGlwbGUpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBMaXN0IG9mIGBOYk9wdGlvbkNvbXBvbmVudGAncyBjb21wb25lbnRzIHBhc3NlZCBhcyBjb250ZW50LlxyXG4gICAqIFRPRE8gbWF5YmUgaXQgd291bGQgYmUgYmV0dGVyIHByb3ZpZGUgd3JhcHBlclxyXG4gICAqICovXHJcbiAgQENvbnRlbnRDaGlsZHJlbihOYk9wdGlvbkNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBvcHRpb25zOiBRdWVyeUxpc3Q8TmJPcHRpb25Db21wb25lbnQ8VD4+O1xyXG5cclxuICAvKlxyXG4gICAqIEN1c3RvbSBzZWxlY3QgbGFiZWwsIHdpbGwgYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBkZWZhdWx0IGVudW1lcmF0aW9uIHdpdGggY29tYS5cclxuICAgKiAqL1xyXG4gIEBDb250ZW50Q2hpbGQoTmJTZWxlY3RMYWJlbENvbXBvbmVudCkgY3VzdG9tTGFiZWw7XHJcblxyXG4gIC8qXHJcbiAgICogTmJDYXJkIHdpdGggb3B0aW9ucyBjb250ZW50LlxyXG4gICAqICovXHJcbiAgQFZpZXdDaGlsZChOYlBvcnRhbERpcmVjdGl2ZSkgcG9ydGFsOiBOYlBvcnRhbERpcmVjdGl2ZTtcclxuXHJcbiAgQFZpZXdDaGlsZChOYkJ1dHRvbkNvbXBvbmVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGJ1dHRvbjogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XHJcblxyXG4gIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qXHJcbiAgICogTGlzdCBvZiBzZWxlY3RlZCBvcHRpb25zLlxy