UNPKG

@kushki/ng-suka

Version:

<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>

380 lines 24.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, EventEmitter, Output, HostBinding, ElementRef, HostListener, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; var Search = /** @class */ (function () { /** * Creates an instance of `Search`. */ function Search(elementRef) { this.elementRef = elementRef; /** * Set to `true` for a disabled search input. */ this.disabled = false; /** * Set to `true` for a toolbar search component. */ this.toolbar = false; /** * Set to `true` for a loading search component. */ this.skeleton = false; /** * Set to `true` to expand the toolbar search component. */ this.active = false; /** * Specifies whether the search component is used in the table toolbar. */ this.tableSearch = false; /** * The unique id for the search component. */ this.id = "search-" + Search.searchCount; /** * Sets the value attribute on the `input` element. */ this.value = ''; /** * Sets the autocomplete attribute on the `input` element. * For refernece: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Values */ this.autocomplete = 'on'; /** * Sets the text inside the `label` tag. */ this.label = 'Búsqueda'; // TODO: i18n // TODO: i18n /** * Sets the placeholder attribute on the `input` element. */ this.placeholder = 'Buscar'; // TODO: i18n // TODO: i18n /** * Used to set the `title` attribute of the clear button. */ this.clearButtonTitle = 'Limpiar'; // TODO: i18n // TODO: i18n /** * Emits an event when value is changed. */ this.valueChange = new EventEmitter(); /** * Emits an event when the clear button is clicked. */ this.clear = new EventEmitter(); /** * Called when search input is blurred. Needed to properly implement `ControlValueAccessor`. */ this.onTouched = (/** * @return {?} */ function () { }); /** * Method set in `registerOnChange` to propagate changes back to the form. */ this.propagateChange = (/** * @param {?} _ * @return {?} */ function (_) { }); Search.searchCount++; } Object.defineProperty(Search.prototype, "containerClass", { get: /** * @return {?} */ function () { return !this.toolbar; }, enumerable: true, configurable: true }); /** * This is the initial value set to the component * @param value The input value. */ /** * This is the initial value set to the component * @param {?} value The input value. * @return {?} */ Search.prototype.writeValue = /** * This is the initial value set to the component * @param {?} value The input value. * @return {?} */ function (value) { this.value = value; }; /** * Sets a method in order to propagate changes back to the form. */ /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ Search.prototype.registerOnChange = /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ function (fn) { this.propagateChange = fn; }; /** * Registers a callback to be triggered when the control has been touched. * @param fn Callback to be triggered when the search input is touched. */ /** * Registers a callback to be triggered when the control has been touched. * @param {?} fn Callback to be triggered when the search input is touched. * @return {?} */ Search.prototype.registerOnTouched = /** * Registers a callback to be triggered when the control has been touched. * @param {?} fn Callback to be triggered when the search input is touched. * @return {?} */ function (fn) { this.onTouched = fn; }; /** * Called when text is written in the input. * @param search The input text. */ /** * Called when text is written in the input. * @param {?} search The input text. * @return {?} */ Search.prototype.onSearch = /** * Called when text is written in the input. * @param {?} search The input text. * @return {?} */ function (search) { this.value = search; this.doValueChange(); }; /** * Called when clear button is clicked. */ /** * Called when clear button is clicked. * @return {?} */ Search.prototype.clearSearch = /** * Called when clear button is clicked. * @return {?} */ function () { this.value = ''; this.clear.emit(); this.propagateChange(this.value); }; /** * @return {?} */ Search.prototype.doValueChange = /** * @return {?} */ function () { this.valueChange.emit(this.value); this.propagateChange(this.value); }; /** * @return {?} */ Search.prototype.openSearch = /** * @return {?} */ function () { var _this = this; this.active = true; setTimeout((/** * @return {?} */ function () { return _this.inputRef.nativeElement.focus(); })); }; /** * @param {?} event * @return {?} */ Search.prototype.keyDown = /** * @param {?} event * @return {?} */ function (event) { if (this.toolbar) { if (event.key === 'Escape') { this.active = false; } else if (event.key === 'Enter') { this.openSearch(); } } }; /** * @param {?} event * @return {?} */ Search.prototype.focusOut = /** * @param {?} event * @return {?} */ function (event) { if (this.toolbar && this.inputRef.nativeElement.value === '' && event.relatedTarget === null) { this.active = false; } }; /** * Variable used for creating unique ids for search components. */ Search.searchCount = 0; Search.decorators = [ { type: Component, args: [{ selector: 'suka-search', template: "\n <div\n class=\"search\"\n [ngClass]=\"{\n 'skeleton': skeleton,\n 'toolbar-search': toolbar,\n 'toolbar-search--active': toolbar && active\n }\"\n role=\"search\"\n >\n <label class=\"label\" [for]=\"id\">{{label}}</label>\n\n <div *ngIf=\"skeleton; else enableInput\" class=\"search-input\"></div>\n <ng-template #enableInput>\n <input\n #input\n *ngIf=\"!toolbar || active || value !== ''\"\n class=\"search-input\"\n [type]=\"tableSearch || !toolbar ? 'text' : 'search'\"\n role=\"search\"\n [id]=\"id\"\n [value]=\"value\"\n [autocomplete]=\"autocomplete\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (input)=\"onSearch($event.target.value)\"/>\n <button *ngIf=\"!tableSearch && toolbar\" class=\"toolbar-search__btn\" (click)=\"openSearch()\">\n <suka-icon icon=\"search\"></suka-icon>\n </button>\n <suka-icon icon=\"search\" *ngIf=\"tableSearch || !toolbar\" (click)=\"openSearch()\" class=\"search-magnifier\"></suka-icon>\n </ng-template>\n\n <button\n *ngIf=\"tableSearch || !toolbar\"\n class=\"search-close\"\n [ngClass]=\"{\n 'search-close--hidden': !value || value.length === 0\n }\"\n [title]=\"clearButtonTitle\"\n [attr.aria-label]=\"clearButtonTitle\"\n (click)=\"clearSearch()\"\n >\n <suka-icon icon=\"x-circle\"></suka-icon>\n </button>\n </div>\n ", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Search, multi: true } ] }] } ]; /** @nocollapse */ Search.ctorParameters = function () { return [ { type: ElementRef } ]; }; Search.propDecorators = { containerClass: [{ type: HostBinding, args: ['class.form-item',] }], disabled: [{ type: Input }], toolbar: [{ type: Input }], skeleton: [{ type: Input }], active: [{ type: Input }], tableSearch: [{ type: Input }], name: [{ type: Input }], id: [{ type: Input }], required: [{ type: Input }], value: [{ type: Input }], autocomplete: [{ type: Input }], label: [{ type: Input }], placeholder: [{ type: Input }], clearButtonTitle: [{ type: Input }], valueChange: [{ type: Output }], clear: [{ type: Output }], inputRef: [{ type: ViewChild, args: ['input', { static: false },] }], keyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }], focusOut: [{ type: HostListener, args: ['focusout', ['$event'],] }] }; return Search; }()); export { Search }; if (false) { /** * Variable used for creating unique ids for search components. * @type {?} */ Search.searchCount; /** * Set to `true` for a disabled search input. * @type {?} */ Search.prototype.disabled; /** * Set to `true` for a toolbar search component. * @type {?} */ Search.prototype.toolbar; /** * Set to `true` for a loading search component. * @type {?} */ Search.prototype.skeleton; /** * Set to `true` to expand the toolbar search component. * @type {?} */ Search.prototype.active; /** * Specifies whether the search component is used in the table toolbar. * @type {?} */ Search.prototype.tableSearch; /** * Sets the name attribute on the `input` element. * @type {?} */ Search.prototype.name; /** * The unique id for the search component. * @type {?} */ Search.prototype.id; /** * Reflects the required attribute of the `input` element. * @type {?} */ Search.prototype.required; /** * Sets the value attribute on the `input` element. * @type {?} */ Search.prototype.value; /** * Sets the autocomplete attribute on the `input` element. * For refernece: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Values * @type {?} */ Search.prototype.autocomplete; /** * Sets the text inside the `label` tag. * @type {?} */ Search.prototype.label; /** * Sets the placeholder attribute on the `input` element. * @type {?} */ Search.prototype.placeholder; /** * Used to set the `title` attribute of the clear button. * @type {?} */ Search.prototype.clearButtonTitle; /** * Emits an event when value is changed. * @type {?} */ Search.prototype.valueChange; /** * Emits an event when the clear button is clicked. * @type {?} */ Search.prototype.clear; /** @type {?} */ Search.prototype.inputRef; /** * Called when search input is blurred. Needed to properly implement `ControlValueAccessor`. * @type {?} */ Search.prototype.onTouched; /** * Method set in `registerOnChange` to propagate changes back to the form. * @type {?} */ Search.prototype.propagateChange; /** * @type {?} * @protected */ Search.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9zZWFyY2gvc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBRXpFO0lBa0lFOztPQUVHO0lBQ0gsZ0JBQXNCLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7Ozs7UUFoRW5DLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJakIsWUFBTyxHQUFHLEtBQUssQ0FBQzs7OztRQUloQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLFdBQU0sR0FBRyxLQUFLLENBQUM7Ozs7UUFJZixnQkFBVyxHQUFHLEtBQUssQ0FBQzs7OztRQVFwQixPQUFFLEdBQUcsWUFBVSxNQUFNLENBQUMsV0FBYSxDQUFDOzs7O1FBUXBDLFVBQUssR0FBRyxFQUFFLENBQUM7Ozs7O1FBS1gsaUJBQVksR0FBRyxJQUFJLENBQUM7Ozs7UUFJcEIsVUFBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLGFBQWE7Ozs7O1FBSWpDLGdCQUFXLEdBQUcsUUFBUSxDQUFDLENBQUMsYUFBYTs7Ozs7UUFJckMscUJBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUMsYUFBYTs7Ozs7UUFJMUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDOzs7O1FBSXpDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBcUNyQyxjQUFTOzs7UUFBYyxjQUFRLENBQUMsRUFBQzs7OztRQUtqQyxvQkFBZTs7OztRQUFHLFVBQUMsQ0FBTSxJQUFPLENBQUMs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QkFJTCxLQUFLOytCQUtMLEtBQUs7d0JBSUwsS0FBSzs4QkFJTCxLQUFLO21DQUlMLEtBQUs7OEJBSUwsTUFBTTt3QkFJTixNQUFNOzJCQUVOLFNBQVMsU0FBQyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDOzBCQXNFbEMsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzsyQkFXbEMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7SUFRdEMsYUFBQztDQUFBLEFBek5ELElBeU5DO1NBL0pZLE1BQU07Ozs7OztJQUlqQixtQkFBdUI7Ozs7O0lBT3ZCLDBCQUEwQjs7Ozs7SUFJMUIseUJBQXlCOzs7OztJQUl6QiwwQkFBMEI7Ozs7O0lBSTFCLHdCQUF3Qjs7Ozs7SUFJeEIsNkJBQTZCOzs7OztJQUk3QixzQkFBc0I7Ozs7O0lBSXRCLG9CQUE2Qzs7Ozs7SUFJN0MsMEJBQTJCOzs7OztJQUkzQix1QkFBb0I7Ozs7OztJQUtwQiw4QkFBNkI7Ozs7O0lBSTdCLHVCQUE0Qjs7Ozs7SUFJNUIsNkJBQWdDOzs7OztJQUloQyxrQ0FBc0M7Ozs7O0lBSXRDLDZCQUFtRDs7Ozs7SUFJbkQsdUJBQXFDOztJQUVyQywwQkFBMEQ7Ozs7O0lBbUMxRCwyQkFBaUM7Ozs7O0lBS2pDLGlDQUFrQzs7Ozs7SUFuQ3RCLDRCQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBIb3N0QmluZGluZyxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2Etc2VhcmNoJyxcbiAgdGVtcGxhdGU6IGBcbiAgPGRpdlxuICAgIGNsYXNzPVwic2VhcmNoXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnc2tlbGV0b24nOiBza2VsZXRvbixcbiAgICAgICd0b29sYmFyLXNlYXJjaCc6IHRvb2xiYXIsXG4gICAgICAndG9vbGJhci1zZWFyY2gtLWFjdGl2ZSc6IHRvb2xiYXIgJiYgYWN0aXZlXG4gICAgfVwiXG4gICAgcm9sZT1cInNlYXJjaFwiXG4gID5cbiAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIj57e2xhYmVsfX08L2xhYmVsPlxuXG4gICAgPGRpdiAqbmdJZj1cInNrZWxldG9uOyBlbHNlIGVuYWJsZUlucHV0XCIgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIj48L2Rpdj5cbiAgICA8bmctdGVtcGxhdGUgI2VuYWJsZUlucHV0PlxuICAgICAgPGlucHV0XG4gICAgICAgICNpbnB1dFxuICAgICAgICAqbmdJZj1cIiF0b29sYmFyIHx8IGFjdGl2ZSB8fCB2YWx1ZSAhPT0gJydcIlxuICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgIFt0eXBlXT1cInRhYmxlU2VhcmNoIHx8ICF0b29sYmFyID8gJ3RleHQnIDogJ3NlYXJjaCdcIlxuICAgICAgICByb2xlPVwic2VhcmNoXCJcbiAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGVcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2goJGV2ZW50LnRhcmdldC52YWx1ZSlcIi8+XG4gICAgICA8YnV0dG9uICpuZ0lmPVwiIXRhYmxlU2VhcmNoICYmIHRvb2xiYXJcIiBjbGFzcz1cInRvb2xiYXItc2VhcmNoX19idG5cIiAoY2xpY2spPVwib3BlblNlYXJjaCgpXCI+XG4gICAgICAgIDxzdWthLWljb24gaWNvbj1cInNlYXJjaFwiPjwvc3VrYS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3VrYS1pY29uIGljb249XCJzZWFyY2hcIiAgKm5nSWY9XCJ0YWJsZVNlYXJjaCB8fCAhdG9vbGJhclwiIChjbGljayk9XCJvcGVuU2VhcmNoKClcIiBjbGFzcz1cInNlYXJjaC1tYWduaWZpZXJcIj48L3N1a2EtaWNvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJ0YWJsZVNlYXJjaCB8fCAhdG9vbGJhclwiXG4gICAgICBjbGFzcz1cInNlYXJjaC1jbG9zZVwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdzZWFyY2gtY2xvc2UtLWhpZGRlbic6ICF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDBcbiAgICAgIH1cIlxuICAgICAgW3RpdGxlXT1cImNsZWFyQnV0dG9uVGl0bGVcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjbGVhckJ1dHRvblRpdGxlXCJcbiAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaCgpXCJcbiAgICA+XG4gICAgICA8c3VrYS1pY29uIGljb249XCJ4LWNpcmNsZVwiPjwvc3VrYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogU2VhcmNoLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBTZWFyY2ggaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB1c2VkIGZvciBjcmVhdGluZyB1bmlxdWUgaWRzIGZvciBzZWFyY2ggY29tcG9uZW50cy5cbiAgICovXG4gIHN0YXRpYyBzZWFyY2hDb3VudCA9IDA7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mb3JtLWl0ZW0nKSBnZXQgY29udGFpbmVyQ2xhc3MoKSB7IHJldHVybiAhdGhpcy50b29sYmFyOyB9XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgZGlzYWJsZWQgc2VhcmNoIGlucHV0LlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgdG9vbGJhciBzZWFyY2ggY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgdG9vbGJhciA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIHNlYXJjaCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBleHBhbmQgdGhlIHRvb2xiYXIgc2VhcmNoIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGFjdGl2ZSA9IGZhbHNlO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNlYXJjaCBjb21wb25lbnQgaXMgdXNlZCBpbiB0aGUgdGFibGUgdG9vbGJhci5cbiAgICovXG4gIEBJbnB1dCgpIHRhYmxlU2VhcmNoID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuYW1lIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHNlYXJjaCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBpZCA9IGBzZWFyY2gtJHtTZWFyY2guc2VhcmNoQ291bnR9YDtcbiAgLyoqXG4gICAqIFJlZmxlY3RzIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUgb2YgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuICAvKipcbiAgICogU2V0cyB0aGUgYXV0b2NvbXBsZXRlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKiBGb3IgcmVmZXJuZWNlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvYXV0b2NvbXBsZXRlI1ZhbHVlc1xuICAgKi9cbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlID0gJ29uJztcbiAgLyoqXG4gICAqIFNldHMgdGhlIHRleHQgaW5zaWRlIHRoZSBgbGFiZWxgIHRhZy5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJ0LDunNxdWVkYSc7IC8vIFRPRE86IGkxOG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnQnVzY2FyJzsgLy8gVE9ETzogaTE4blxuICAvKipcbiAgICogVXNlZCB0byBzZXQgdGhlIGB0aXRsZWAgYXR0cmlidXRlIG9mIHRoZSBjbGVhciBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKSBjbGVhckJ1dHRvblRpdGxlID0gJ0xpbXBpYXInOyAvLyBUT0RPOiBpMThuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHZhbHVlIGlzIGNoYW5nZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGNsZWFyIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIGNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0Jywge3N0YXRpYzogZmFsc2V9KSBpbnB1dFJlZjogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBgU2VhcmNoYC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgU2VhcmNoLnNlYXJjaENvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGlucHV0IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udHJvbCBoYXMgYmVlbiB0b3VjaGVkLlxuICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHNlYXJjaCBpbnB1dCBpcyB0b3VjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHNlYXJjaCBpbnB1dCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IGBDb250cm9sVmFsdWVBY2Nlc3NvcmAuXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKipcbiAgICogTWV0aG9kIHNldCBpbiBgcmVnaXN0ZXJPbkNoYW5nZWAgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGV4dCBpcyB3cml0dGVuIGluIHRoZSBpbnB1dC5cbiAgICogQHBhcmFtIHNlYXJjaCBUaGUgaW5wdXQgdGV4dC5cbiAgICovXG4gIG9uU2VhcmNoKHNlYXJjaDogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHNlYXJjaDtcbiAgICB0aGlzLmRvVmFsdWVDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBjbGVhciBidXR0b24gaXMgY2xpY2tlZC5cbiAgICovXG4gIGNsZWFyU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICB0aGlzLmNsZWFyLmVtaXQoKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGRvVmFsdWVDaGFuZ2UoKSB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgb3BlblNlYXJjaCgpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAga2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLnRvb2xiYXIpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICB0aGlzLm9wZW5TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcsIFsnJGV2ZW50J10pXG4gIGZvY3VzT3V0KGV2ZW50KSB7XG4gICAgaWYgKHRoaXMudG9vbGJhciAmJlxuICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID09PSAnJyAmJlxuICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==