UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

543 lines 35.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Component, Input, HostBinding, HostListener, Renderer2, ElementRef } from '@angular/core'; import { convertToBoolProperty } from '../helpers'; /* * Basic button component. * * Default button size is `medium` and status color is `primary`: * @stacked-example(Button Showcase, button/button-showcase.component) * * ```html * <button nbButton></button> * ``` * ### Installation * * Import `NbButtonModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbButtonModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * Buttons are available in multiple colors using `status` property: * @stacked-example(Button Colors, button/button-colors.component.html) * * There are three button sizes: * * @stacked-example(Button Sizes, button/button-sizes.component.html) * * And two additional style types - `outline`: * * @stacked-example(Outline Buttons, button/button-outline.component.html) * * and `hero`: * * @stacked-example(Button Colors, button/button-hero.component.html) * * Buttons available in different shapes, which could be combined with the other properties: * @stacked-example(Button Shapes, button/button-shapes.component) * * `nbButton` could be applied to the following selectors - `button`, `input[type="button"]`, `input[type="submit"]` * and `a`: * @stacked-example(Button Elements, button/button-types.component.html) * * Button can be made `fullWidth`: * @stacked-example(Full Width Button, button/button-full-width.component.html) * * @styles * * btn-fg: * btn-font-family: * btn-line-height: * btn-disabled-opacity: * btn-cursor: * btn-primary-bg: * btn-secondary-bg: * btn-info-bg: * btn-success-bg: * btn-warning-bg: * btn-danger-bg: * btn-secondary-border: * btn-secondary-border-width: * btn-padding-y-lg: * btn-padding-x-lg: * btn-font-size-lg: * btn-padding-y-md: * btn-padding-x-md: * btn-font-size-md: * btn-padding-y-sm: * btn-padding-x-sm: * btn-font-size-sm: * btn-padding-y-xs: * btn-padding-x-xs: * btn-font-size-xs: * btn-border-radius: * btn-rectangle-border-radius: * btn-semi-round-border-radius: * btn-round-border-radius: * btn-hero-shadow: * btn-hero-text-shadow: * btn-hero-bevel-size: * btn-hero-glow-size: * btn-hero-primary-glow-size: * btn-hero-success-glow-size: * btn-hero-warning-glow-size: * btn-hero-info-glow-size: * btn-hero-danger-glow-size: * btn-hero-secondary-glow-size: * btn-hero-degree: * btn-hero-primary-degree: * btn-hero-success-degree: * btn-hero-warning-degree: * btn-hero-info-degree: * btn-hero-danger-degree: * btn-hero-secondary-degree: * btn-hero-border-radius: * btn-outline-fg: * btn-outline-hover-fg: * btn-outline-focus-fg: */ var NbButtonComponent = /** @class */ (function () { function NbButtonComponent(renderer, hostElement) { this.renderer = renderer; this.hostElement = hostElement; this.fullWidth = false; } Object.defineProperty(NbButtonComponent.prototype, "xsmall", { get: /** * @return {?} */ function () { return this.size === NbButtonComponent.SIZE_XSMALL; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "small", { get: /** * @return {?} */ function () { return this.size === NbButtonComponent.SIZE_SMALL; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "medium", { get: /** * @return {?} */ function () { return this.size === NbButtonComponent.SIZE_MEDIUM; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "large", { get: /** * @return {?} */ function () { return this.size === NbButtonComponent.SIZE_LARGE; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "primary", { get: /** * @return {?} */ function () { return this.status === NbButtonComponent.STATUS_PRIMARY; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "info", { get: /** * @return {?} */ function () { return this.status === NbButtonComponent.STATUS_INFO; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "success", { get: /** * @return {?} */ function () { return this.status === NbButtonComponent.STATUS_SUCCESS; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "warning", { get: /** * @return {?} */ function () { return this.status === NbButtonComponent.STATUS_WARNING; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "danger", { get: /** * @return {?} */ function () { return this.status === NbButtonComponent.STATUS_DANGER; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "rectangle", { get: /** * @return {?} */ function () { return this.shape === NbButtonComponent.SHAPE_RECTANGLE; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "round", { get: /** * @return {?} */ function () { return this.shape === NbButtonComponent.SHAPE_ROUND; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "semiRound", { get: /** * @return {?} */ function () { return this.shape === NbButtonComponent.SHAPE_SEMI_ROUND; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "tabbable", { // issue #794 get: // issue #794 /** * @return {?} */ function () { return this.disabled ? '-1' : '0'; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "setSize", { /* * Button size, available sizes: * `xxsmall`, `xsmall`, `small`, `medium`, `large` * @param {string} val */ set: /* * Button size, available sizes: * `xxsmall`, `xsmall`, `small`, `medium`, `large` * @param {string} val */ /** * @private * @param {?} val * @return {?} */ function (val) { this.size = val; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "setStatus", { /* * Button status (adds specific styles): * `primary`, `info`, `success`, `warning`, `danger` * @param {string} val */ set: /* * Button status (adds specific styles): * `primary`, `info`, `success`, `warning`, `danger` * @param {string} val */ /** * @private * @param {?} val * @return {?} */ function (val) { this.status = val; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "setShape", { /* * Button shapes: `rectangle`, `round`, `semi-round` * @param {string} val */ set: /* * Button shapes: `rectangle`, `round`, `semi-round` * @param {string} val */ /** * @private * @param {?} val * @return {?} */ function (val) { this.shape = val; }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "setHero", { /* * Adds `hero` styles * @param {boolean} val */ set: /* * Adds `hero` styles * @param {boolean} val */ /** * @param {?} val * @return {?} */ function (val) { this.hero = convertToBoolProperty(val); }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "setDisabled", { /* * Disables the button * @param {boolean} val */ set: /* * Disables the button * @param {boolean} val */ /** * @param {?} val * @return {?} */ function (val) { this.disabled = convertToBoolProperty(val); this.renderer.setProperty(this.hostElement.nativeElement, 'disabled', this.disabled); }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "setFullWidth", { /* * If set element will fill its container * @param {boolean} */ set: /* * If set element will fill its container * @param {boolean} */ /** * @param {?} value * @return {?} */ function (value) { this.fullWidth = convertToBoolProperty(value); }, enumerable: true, configurable: true }); Object.defineProperty(NbButtonComponent.prototype, "setOutline", { /* * Adds `outline` styles * @param {boolean} val */ set: /* * Adds `outline` styles * @param {boolean} val */ /** * @param {?} val * @return {?} */ function (val) { this.outline = convertToBoolProperty(val); }, enumerable: true, configurable: true }); /* * @private * Keep this handler to partially support anchor disabling. * Unlike button, anchor doesn't have 'disabled' DOM property, * so handler will be called anyway. We preventing navigation and bubbling. * Disabling is partial due to click handlers precedence. Consider example: * <a nbButton [disabled]="true" (click)="clickHandler()">...</a> * 'clickHandler' will be called before our host listener below. We can't prevent * such handlers call. */ /* * @private * Keep this handler to partially support anchor disabling. * Unlike button, anchor doesn't have 'disabled' DOM property, * so handler will be called anyway. We preventing navigation and bubbling. * Disabling is partial due to click handlers precedence. Consider example: * <a nbButton [disabled]="true" (click)="clickHandler()">...</a> * 'clickHandler' will be called before our host listener below. We can't prevent * such handlers call. */ /** * @param {?} event * @return {?} */ NbButtonComponent.prototype.onClick = /* * @private * Keep this handler to partially support anchor disabling. * Unlike button, anchor doesn't have 'disabled' DOM property, * so handler will be called anyway. We preventing navigation and bubbling. * Disabling is partial due to click handlers precedence. Consider example: * <a nbButton [disabled]="true" (click)="clickHandler()">...</a> * 'clickHandler' will be called before our host listener below. We can't prevent * such handlers call. */ /** * @param {?} event * @return {?} */ function (event) { if (this.disabled) { event.preventDefault(); event.stopImmediatePropagation(); } }; NbButtonComponent.SIZE_XSMALL = 'xsmall'; NbButtonComponent.SIZE_SMALL = 'small'; NbButtonComponent.SIZE_MEDIUM = 'medium'; NbButtonComponent.SIZE_LARGE = 'large'; NbButtonComponent.STATUS_PRIMARY = 'primary'; NbButtonComponent.STATUS_INFO = 'info'; NbButtonComponent.STATUS_SUCCESS = 'success'; NbButtonComponent.STATUS_WARNING = 'warning'; NbButtonComponent.STATUS_DANGER = 'danger'; NbButtonComponent.SHAPE_RECTANGLE = 'rectangle'; NbButtonComponent.SHAPE_ROUND = 'round'; NbButtonComponent.SHAPE_SEMI_ROUND = 'semi-round'; NbButtonComponent.decorators = [ { type: Component, args: [{ selector: 'button[nbButton],a[nbButton],input[type="button"][nbButton],input[type="submit"][nbButton]', template: "\n <ng-content></ng-content>\n ", styles: [":host{text-transform:uppercase;letter-spacing:.4px;border:2px solid transparent;transition:none;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;text-align:center;text-decoration:none;display:inline-block;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:host:focus,:host:hover{text-decoration:none}:host.btn-full-width{width:100%}"] }] } ]; /** @nocollapse */ NbButtonComponent.ctorParameters = function () { return [ { type: Renderer2 }, { type: ElementRef } ]; }; NbButtonComponent.propDecorators = { xsmall: [{ type: HostBinding, args: ['class.btn-xsmall',] }], small: [{ type: HostBinding, args: ['class.btn-small',] }], medium: [{ type: HostBinding, args: ['class.btn-medium',] }], large: [{ type: HostBinding, args: ['class.btn-large',] }], primary: [{ type: HostBinding, args: ['class.btn-primary',] }], info: [{ type: HostBinding, args: ['class.btn-info',] }], success: [{ type: HostBinding, args: ['class.btn-success',] }], warning: [{ type: HostBinding, args: ['class.btn-warning',] }], danger: [{ type: HostBinding, args: ['class.btn-danger',] }], rectangle: [{ type: HostBinding, args: ['class.btn-rectangle',] }], round: [{ type: HostBinding, args: ['class.btn-round',] }], semiRound: [{ type: HostBinding, args: ['class.btn-semi-round',] }], hero: [{ type: HostBinding, args: ['class.btn-hero',] }], outline: [{ type: HostBinding, args: ['class.btn-outline',] }], disabled: [{ type: HostBinding, args: ['attr.aria-disabled',] }, { type: HostBinding, args: ['class.btn-disabled',] }], tabbable: [{ type: HostBinding, args: ['attr.tabindex',] }], fullWidth: [{ type: HostBinding, args: ['class.btn-full-width',] }], setSize: [{ type: Input, args: ['size',] }], setStatus: [{ type: Input, args: ['status',] }], setShape: [{ type: Input, args: ['shape',] }], setHero: [{ type: Input, args: ['hero',] }], setDisabled: [{ type: Input, args: ['disabled',] }], setFullWidth: [{ type: Input, args: ['fullWidth',] }], setOutline: [{ type: Input, args: ['outline',] }], onClick: [{ type: HostListener, args: ['click', ['$event'],] }] }; return NbButtonComponent; }()); export { NbButtonComponent }; if (false) { /** @type {?} */ NbButtonComponent.SIZE_XSMALL; /** @type {?} */ NbButtonComponent.SIZE_SMALL; /** @type {?} */ NbButtonComponent.SIZE_MEDIUM; /** @type {?} */ NbButtonComponent.SIZE_LARGE; /** @type {?} */ NbButtonComponent.STATUS_PRIMARY; /** @type {?} */ NbButtonComponent.STATUS_INFO; /** @type {?} */ NbButtonComponent.STATUS_SUCCESS; /** @type {?} */ NbButtonComponent.STATUS_WARNING; /** @type {?} */ NbButtonComponent.STATUS_DANGER; /** @type {?} */ NbButtonComponent.SHAPE_RECTANGLE; /** @type {?} */ NbButtonComponent.SHAPE_ROUND; /** @type {?} */ NbButtonComponent.SHAPE_SEMI_ROUND; /** @type {?} */ NbButtonComponent.prototype.size; /** @type {?} */ NbButtonComponent.prototype.status; /** @type {?} */ NbButtonComponent.prototype.accent; /** @type {?} */ NbButtonComponent.prototype.shape; /** @type {?} */ NbButtonComponent.prototype.hero; /** @type {?} */ NbButtonComponent.prototype.outline; /** @type {?} */ NbButtonComponent.prototype.disabled; /** @type {?} */ NbButtonComponent.prototype.fullWidth; /** * @type {?} * @protected */ NbButtonComponent.prototype.renderer; /** * @type {?} * @protected */ NbButtonComponent.prototype.hostElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2J1dHRvbi9idXR0b24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVHbkQ7SUE0TEUsMkJBQ1ksUUFBbUIsRUFDbkIsV0FBb0M7UUFEcEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUF4RmhELGNBQVMsR0FBRyxLQUFLLENBQUM7SUF5RmYsQ0FBQztJQWxLSixzQkFDSSxxQ0FBTTs7OztRQURWO1lBRUUsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztRQUNyRCxDQUFDOzs7T0FBQTtJQUVELHNCQUNJLG9DQUFLOzs7O1FBRFQ7WUFFRSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsVUFBVSxDQUFDO1FBQ3BELENBQUM7OztPQUFBO0lBRUQsc0JBQ0kscUNBQU07Ozs7UUFEVjtZQUVFLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7UUFDckQsQ0FBQzs7O09BQUE7SUFFRCxzQkFDSSxvQ0FBSzs7OztRQURUO1lBRUUsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztRQUNwRCxDQUFDOzs7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QUFXLFNBQUMsc0JBQXNCO3VCQUtsQyxXQUFXLFNBQUMsZ0JBQWdCOzBCQUM1QixXQUFXLFNBQUMsbUJBQW1COzJCQUUvQixXQUFXLFNBQUMsb0JBQW9CLGNBQ2hDLFdBQVcsU0FBQyxvQkFBb0I7MkJBR2hDLFdBQVcsU0FBQyxlQUFlOzRCQUszQixXQUFXLFNBQUMsc0JBQXNCOzBCQVFsQyxLQUFLLFNBQUMsTUFBTTs0QkFVWixLQUFLLFNBQUMsUUFBUTsyQkFTZCxLQUFLLFNBQUMsT0FBTzswQkFTYixLQUFLLFNBQUMsTUFBTTs4QkFTWixLQUFLLFNBQUMsVUFBVTsrQkFVaEIsS0FBSyxTQUFDLFdBQVc7NkJBU2pCLEtBQUssU0FBQyxTQUFTOzBCQWVmLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBWW5DLHdCQUFDO0NBQUEsQUFoTUQsSUFnTUM7U0F6TFksaUJBQWlCOzs7SUFFNUIsOEJBQXVDOztJQUN2Qyw2QkFBcUM7O0lBQ3JDLDhCQUF1Qzs7SUFDdkMsNkJBQXFDOztJQUVyQyxpQ0FBMkM7O0lBQzNDLDhCQUFxQzs7SUFDckMsaUNBQTJDOztJQUMzQyxpQ0FBMkM7O0lBQzNDLGdDQUF5Qzs7SUFFekMsa0NBQThDOztJQUM5Qyw4QkFBc0M7O0lBQ3RDLG1DQUFnRDs7SUFFaEQsaUNBQWE7O0lBQ2IsbUNBQWU7O0lBQ2YsbUNBQWU7O0lBQ2Ysa0NBQWM7O0lBOERkLGlDQUE2Qzs7SUFDN0Msb0NBQW1EOztJQUVuRCxxQ0FDcUQ7O0lBUXJELHNDQUNrQjs7Ozs7SUF1RmhCLHFDQUE2Qjs7Ozs7SUFDN0Isd0NBQThDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBjb252ZXJ0VG9Cb29sUHJvcGVydHkgfSBmcm9tICcuLi9oZWxwZXJzJztcclxuXHJcbi8qXHJcbiAqIEJhc2ljIGJ1dHRvbiBjb21wb25lbnQuXHJcbiAqXHJcbiAqIERlZmF1bHQgYnV0dG9uIHNpemUgaXMgYG1lZGl1bWAgYW5kIHN0YXR1cyBjb2xvciBpcyBgcHJpbWFyeWA6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQnV0dG9uIFNob3djYXNlLCBidXR0b24vYnV0dG9uLXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8YnV0dG9uIG5iQnV0dG9uPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICogIyMjIEluc3RhbGxhdGlvblxyXG4gKlxyXG4gKiBJbXBvcnQgYE5iQnV0dG9uTW9kdWxlYCB0byB5b3VyIGZlYXR1cmUgbW9kdWxlLlxyXG4gKiBgYGB0c1xyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICBcdC8vIC4uLlxyXG4gKiAgICAgTmJCdXR0b25Nb2R1bGUsXHJcbiAqICAgXSxcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIFBhZ2VNb2R1bGUgeyB9XHJcbiAqIGBgYFxyXG4gKiAjIyMgVXNhZ2VcclxuICpcclxuICogQnV0dG9ucyBhcmUgYXZhaWxhYmxlIGluIG11bHRpcGxlIGNvbG9ycyB1c2luZyBgc3RhdHVzYCBwcm9wZXJ0eTpcclxuICogQHN0YWNrZWQtZXhhbXBsZShCdXR0b24gQ29sb3JzLCBidXR0b24vYnV0dG9uLWNvbG9ycy5jb21wb25lbnQuaHRtbClcclxuICpcclxuICogVGhlcmUgYXJlIHRocmVlIGJ1dHRvbiBzaXplczpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShCdXR0b24gU2l6ZXMsIGJ1dHRvbi9idXR0b24tc2l6ZXMuY29tcG9uZW50Lmh0bWwpXHJcbiAqXHJcbiAqIEFuZCB0d28gYWRkaXRpb25hbCBzdHlsZSB0eXBlcyAtIGBvdXRsaW5lYDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShPdXRsaW5lIEJ1dHRvbnMsIGJ1dHRvbi9idXR0b24tb3V0bGluZS5jb21wb25lbnQuaHRtbClcclxuICpcclxuICogYW5kIGBoZXJvYDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShCdXR0b24gQ29sb3JzLCBidXR0b24vYnV0dG9uLWhlcm8uY29tcG9uZW50Lmh0bWwpXHJcbiAqXHJcbiAqIEJ1dHRvbnMgYXZhaWxhYmxlIGluIGRpZmZlcmVudCBzaGFwZXMsIHdoaWNoIGNvdWxkIGJlIGNvbWJpbmVkIHdpdGggdGhlIG90aGVyIHByb3BlcnRpZXM6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQnV0dG9uIFNoYXBlcywgYnV0dG9uL2J1dHRvbi1zaGFwZXMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBgbmJCdXR0b25gIGNvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGZvbGxvd2luZyBzZWxlY3RvcnMgLSBgYnV0dG9uYCwgYGlucHV0W3R5cGU9XCJidXR0b25cIl1gLCBgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXWBcclxuICogYW5kIGBhYDpcclxuICogQHN0YWNrZWQtZXhhbXBsZShCdXR0b24gRWxlbWVudHMsIGJ1dHRvbi9idXR0b24tdHlwZXMuY29tcG9uZW50Lmh0bWwpXHJcbiAqXHJcbiAqIEJ1dHRvbiBjYW4gYmUgbWFkZSBgZnVsbFdpZHRoYDpcclxuICogQHN0YWNrZWQtZXhhbXBsZShGdWxsIFdpZHRoIEJ1dHRvbiwgYnV0dG9uL2J1dHRvbi1mdWxsLXdpZHRoLmNvbXBvbmVudC5odG1sKVxyXG4gKlxyXG4gKiBAc3R5bGVzXHJcbiAqXHJcbiAqIGJ0bi1mZzpcclxuICogYnRuLWZvbnQtZmFtaWx5OlxyXG4gKiBidG4tbGluZS1oZWlnaHQ6XHJcbiAqIGJ0bi1kaXNhYmxlZC1vcGFjaXR5OlxyXG4gKiBidG4tY3Vyc29yOlxyXG4gKiBidG4tcHJpbWFyeS1iZzpcclxuICogYnRuLXNlY29uZGFyeS1iZzpcclxuICogYnRuLWluZm8tYmc6XHJcbiAqIGJ0bi1zdWNjZXNzLWJnOlxyXG4gKiBidG4td2FybmluZy1iZzpcclxuICogYnRuLWRhbmdlci1iZzpcclxuICogYnRuLXNlY29uZGFyeS1ib3JkZXI6XHJcbiAqIGJ0bi1zZWNvbmRhcnktYm9yZGVyLXdpZHRoOlxyXG4gKiBidG4tcGFkZGluZy15LWxnOlxyXG4gKiBidG4tcGFkZGluZy14LWxnOlxyXG4gKiBidG4tZm9udC1zaXplLWxnOlxyXG4gKiBidG4tcGFkZGluZy15LW1kOlxyXG4gKiBidG4tcGFkZGluZy14LW1kOlxyXG4gKiBidG4tZm9udC1zaXplLW1kOlxyXG4gKiBidG4tcGFkZGluZy15LXNtOlxyXG4gKiBidG4tcGFkZGluZy14LXNtOlxyXG4gKiBidG4tZm9udC1zaXplLXNtOlxyXG4gKiBidG4tcGFkZGluZy15LXhzOlxyXG4gKiBidG4tcGFkZGluZy14LXhzOlxyXG4gKiBidG4tZm9udC1zaXplLXhzOlxyXG4gKiBidG4tYm9yZGVyLXJhZGl1czpcclxuICogYnRuLXJlY3RhbmdsZS1ib3JkZXItcmFkaXVzOlxyXG4gKiBidG4tc2VtaS1yb3VuZC1ib3JkZXItcmFkaXVzOlxyXG4gKiBidG4tcm91bmQtYm9yZGVyLXJhZGl1czpcclxuICogYnRuLWhlcm8tc2hhZG93OlxyXG4gKiBidG4taGVyby10ZXh0LXNoYWRvdzpcclxuICogYnRuLWhlcm8tYmV2ZWwtc2l6ZTpcclxuICogYnRuLWhlcm8tZ2xvdy1zaXplOlxyXG4gKiBidG4taGVyby1wcmltYXJ5LWdsb3ctc2l6ZTpcclxuICogYnRuLWhlcm8tc3VjY2Vzcy1nbG93LXNpemU6XHJcbiAqIGJ0bi1oZXJvLXdhcm5pbmctZ2xvdy1zaXplOlxyXG4gKiBidG4taGVyby1pbmZvLWdsb3ctc2l6ZTpcclxuICogYnRuLWhlcm8tZGFuZ2VyLWdsb3ctc2l6ZTpcclxuICogYnRuLWhlcm8tc2Vjb25kYXJ5LWdsb3ctc2l6ZTpcclxuICogYnRuLWhlcm8tZGVncmVlOlxyXG4gKiBidG4taGVyby1wcmltYXJ5LWRlZ3JlZTpcclxuICogYnRuLWhlcm8tc3VjY2Vzcy1kZWdyZWU6XHJcbiAqIGJ0bi1oZXJvLXdhcm5pbmctZGVncmVlOlxyXG4gKiBidG4taGVyby1pbmZvLWRlZ3JlZTpcclxuICogYnRuLWhlcm8tZGFuZ2VyLWRlZ3JlZTpcclxuICogYnRuLWhlcm8tc2Vjb25kYXJ5LWRlZ3JlZTpcclxuICogYnRuLWhlcm8tYm9yZGVyLXJhZGl1czpcclxuICogYnRuLW91dGxpbmUtZmc6XHJcbiAqIGJ0bi1vdXRsaW5lLWhvdmVyLWZnOlxyXG4gKiBidG4tb3V0bGluZS1mb2N1cy1mZzpcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYnV0dG9uW25iQnV0dG9uXSxhW25iQnV0dG9uXSxpbnB1dFt0eXBlPVwiYnV0dG9uXCJdW25iQnV0dG9uXSxpbnB1dFt0eXBlPVwic3VibWl0XCJdW25iQnV0dG9uXScsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYnV0dG9uLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJCdXR0b25Db21wb25lbnQge1xyXG5cclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9YU01BTEwgPSAneHNtYWxsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9TTUFMTCA9ICdzbWFsbCc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfTUVESVVNID0gJ21lZGl1bSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfTEFSR0UgPSAnbGFyZ2UnO1xyXG5cclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX1BSSU1BUlkgPSAncHJpbWFyeSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19JTkZPID0gJ2luZm8nO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVEFUVVNfU1VDQ0VTUyA9ICdzdWNjZXNzJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX1dBUk5JTkcgPSAnd2FybmluZyc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19EQU5HRVIgPSAnZGFuZ2VyJztcclxuXHJcbiAgc3RhdGljIHJlYWRvbmx5IFNIQVBFX1JFQ1RBTkdMRSA9ICdyZWN0YW5nbGUnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSEFQRV9ST1VORCA9ICdyb3VuZCc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNIQVBFX1NFTUlfUk9VTkQgPSAnc2VtaS1yb3VuZCc7XHJcblxyXG4gIHNpemU6IHN0cmluZztcclxuICBzdGF0dXM6IHN0cmluZztcclxuICBhY2NlbnQ6IHN0cmluZztcclxuICBzaGFwZTogc3RyaW5nO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi14c21hbGwnKVxyXG4gIGdldCB4c21hbGwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TSVpFX1hTTUFMTDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLXNtYWxsJylcclxuICBnZXQgc21hbGwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TSVpFX1NNQUxMO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4tbWVkaXVtJylcclxuICBnZXQgbWVkaXVtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gTmJCdXR0b25Db21wb25lbnQuU0laRV9NRURJVU07XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1sYXJnZScpXHJcbiAgZ2V0IGxhcmdlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gTmJCdXR0b25Db21wb25lbnQuU0laRV9MQVJHRTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLXByaW1hcnknKVxyXG4gIGdldCBwcmltYXJ5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TVEFUVVNfUFJJTUFSWTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLWluZm8nKVxyXG4gIGdldCBpbmZvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TVEFUVVNfSU5GTztcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLXN1Y2Nlc3MnKVxyXG4gIGdldCBzdWNjZXNzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TVEFUVVNfU1VDQ0VTUztcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLXdhcm5pbmcnKVxyXG4gIGdldCB3YXJuaW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TVEFUVVNfV0FSTklORztcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLWRhbmdlcicpXHJcbiAgZ2V0IGRhbmdlcigpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTmJCdXR0b25Db21wb25lbnQuU1RBVFVTX0RBTkdFUjtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLXJlY3RhbmdsZScpXHJcbiAgZ2V0IHJlY3RhbmdsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNoYXBlID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TSEFQRV9SRUNUQU5HTEU7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1yb3VuZCcpXHJcbiAgZ2V0IHJvdW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hhcGUgPT09IE5iQnV0dG9uQ29tcG9uZW50LlNIQVBFX1JPVU5EO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4tc2VtaS1yb3VuZCcpXHJcbiAgZ2V0IHNlbWlSb3VuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnNoYXBlID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TSEFQRV9TRU1JX1JPVU5EO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4taGVybycpIGhlcm86IGJvb2xlYW47XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4tb3V0bGluZScpIG91dGxpbmU6IGJvb2xlYW47XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRpc2FibGVkJylcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1kaXNhYmxlZCcpIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICAvLyBpc3N1ZSAjNzk0XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcclxuICBnZXQgdGFiYmFibGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gJy0xJyA6ICcwJztcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLWZ1bGwtd2lkdGgnKVxyXG4gIGZ1bGxXaWR0aCA9IGZhbHNlO1xyXG5cclxuICAvKlxyXG4gICAqIEJ1dHRvbiBzaXplLCBhdmFpbGFibGUgc2l6ZXM6XHJcbiAgICogYHh4c21hbGxgLCBgeHNtYWxsYCwgYHNtYWxsYCwgYG1lZGl1bWAsIGBsYXJnZWBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXHJcbiAgICovXHJcbiAgQElucHV0KCdzaXplJylcclxuICBwcml2YXRlIHNldCBzZXRTaXplKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNpemUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEJ1dHRvbiBzdGF0dXMgKGFkZHMgc3BlY2lmaWMgc3R5bGVzKTpcclxuICAgKiBgcHJpbWFyeWAsIGBpbmZvYCwgYHN1Y2Nlc3NgLCBgd2FybmluZ2AsIGBkYW5nZXJgXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnc3RhdHVzJylcclxuICBwcml2YXRlIHNldCBzZXRTdGF0dXModmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBCdXR0b24gc2hhcGVzOiBgcmVjdGFuZ2xlYCwgYHJvdW5kYCwgYHNlbWktcm91bmRgXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnc2hhcGUnKVxyXG4gIHByaXZhdGUgc2V0IHNldFNoYXBlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNoYXBlID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBBZGRzIGBoZXJvYCBzdHlsZXNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnaGVybycpXHJcbiAgc2V0IHNldEhlcm8odmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhlcm8gPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogRGlzYWJsZXMgdGhlIGJ1dHRvblxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsXHJcbiAgICovXHJcbiAgQElucHV0KCdkaXNhYmxlZCcpXHJcbiAgc2V0IHNldERpc2FibGVkKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSh2YWwpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIHRoaXMuZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBJZiBzZXQgZWxlbWVudCB3aWxsIGZpbGwgaXRzIGNvbnRhaW5lclxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoJ2Z1bGxXaWR0aCcpXHJcbiAgc2V0IHNldEZ1bGxXaWR0aCh2YWx1ZSkge1xyXG4gICAgdGhpcy5mdWxsV2lkdGggPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBBZGRzIGBvdXRsaW5lYCBzdHlsZXNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnb3V0bGluZScpXHJcbiAgc2V0IHNldE91dGxpbmUodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm91dGxpbmUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBLZWVwIHRoaXMgaGFuZGxlciB0byBwYXJ0aWFsbHkgc3VwcG9ydCBhbmNob3IgZGlzYWJsaW5nLlxyXG4gICAqIFVubGlrZSBidXR0b24sIGFuY2hvciBkb2Vzbid0IGhhdmUgJ2Rpc2FibGVkJyBET00gcHJvcGVydHksXHJcbiAgICogc28gaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBhbnl3YXkuIFdlIHByZXZlbnRpbmcgbmF2aWdhdGlvbiBhbmQgYnViYmxpbmcuXHJcbiAgICogRGlzYWJsaW5nIGlzIHBhcnRpYWwgZHVlIHRvIGNsaWNrIGhhbmRsZXJzIHByZWNlZGVuY2UuIENvbnNpZGVyIGV4YW1wbGU6XHJcbiAgICogPGEgbmJCdXR0b24gW2Rpc2FibGVkXT1cInRydWVcIiAoY2xpY2spPVwiY2xpY2tIYW5kbGVyKClcIj4uLi48L2E+XHJcbiAgICogJ2NsaWNrSGFuZGxlcicgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIG91ciBob3N0IGxpc3RlbmVyIGJlbG93LiBXZSBjYW4ndCBwcmV2ZW50XHJcbiAgICogc3VjaCBoYW5kbGVycyBjYWxsLlxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkNsaWNrKGV2ZW50OiBFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJvdGVjdGVkIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICApIHt9XHJcbn1cclxuIl19