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>

301 lines 20.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, HostBinding, Output, EventEmitter } from '@angular/core'; var Progress = /** @class */ (function () { function Progress() { this.baseClass = true; /** * Set to `true` to make the progress linear. This allows the user to access any of the steps at any time (like tabs). */ this.linear = false; /** * Set to `true` to allow the user to edit a step after completed. */ this.editable = false; /** * Emits an event when a index is selected */ this.selected = new EventEmitter(); /** * Emits an event when the steps change. */ this.stepsChange = new EventEmitter(); } Object.defineProperty(Progress.prototype, "steps", { /** * Sets the steps for the `Progress` component. */ get: /** * Sets the steps for the `Progress` component. * @return {?} */ function () { return this._steps; }, set: /** * @param {?} value * @return {?} */ function (value) { this._steps = value; this.stepsChange.emit(this._steps); }, enumerable: true, configurable: true }); /** * @param {?} newIndex * @return {?} */ Progress.prototype.select = /** * @param {?} newIndex * @return {?} */ function (newIndex) { this._steps.forEach((/** * @param {?} step * @param {?} index * @return {?} */ function (step, index) { if (index === newIndex) { step.current = true; } else if (step.current) { delete step.current; } })); this.selected.emit(newIndex); this.steps = this._steps; }; /** * Step is completed. */ /** * Step is completed. * @param {?} step * @return {?} */ Progress.prototype.isComplete = /** * Step is completed. * @param {?} step * @return {?} */ function (step) { return step.state === 'complete'; }; /** * Step is editable. */ /** * Step is editable. * @param {?} step * @return {?} */ Progress.prototype.isEditable = /** * Step is editable. * @param {?} step * @return {?} */ function (step) { return step.state === 'complete' && this.editable; }; /** * Step is unclickable. */ /** * Step is unclickable. * @param {?} step * @param {?} index * @return {?} */ Progress.prototype.isUnclickable = /** * Step is unclickable. * @param {?} step * @param {?} index * @return {?} */ function (step, index) { if (step.state === 'complete' && !this.editable) { return true; } if (step.state === 'incomplete' && !this.linear && index !== this.getNextUncompletedStepIndex()) { return true; } return false; }; /** * Returns the index of the next uncompleted step. */ /** * Returns the index of the next uncompleted step. * @return {?} */ Progress.prototype.getNextUncompletedStepIndex = /** * Returns the index of the next uncompleted step. * @return {?} */ function () { var e_1, _a; try { for (var _b = tslib_1.__values(this.steps.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { var _d = tslib_1.__read(_c.value, 2), index = _d[0], step = _d[1]; if (step.state === 'incomplete') { return index; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } return -1; }; /** * Returns the current step. */ /** * Returns the current step. * @return {?} */ Progress.prototype.currentStep = /** * Returns the current step. * @return {?} */ function () { var e_2, _a; try { for (var _b = tslib_1.__values(this.steps.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { var _d = tslib_1.__read(_c.value, 2), _ = _d[0], step = _d[1]; if (step.current) { return step; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } return null; }; /** * Returns the next step. */ /** * Returns the next step. * @return {?} */ Progress.prototype.nextStep = /** * Returns the next step. * @return {?} */ function () { var e_3, _a; /** @type {?} */ var currentIndex = -1; try { for (var _b = tslib_1.__values(this.steps.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { var _d = tslib_1.__read(_c.value, 2), index = _d[0], step = _d[1]; if (step.current) { currentIndex = index; } if (currentIndex >= 0 && currentIndex + 1 === index) { return step; } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_3) throw e_3.error; } } return null; }; /** * Returns the current step index. */ /** * Returns the current step index. * @return {?} */ Progress.prototype.getCurrentStepIndex = /** * Returns the current step index. * @return {?} */ function () { var e_4, _a; try { for (var _b = tslib_1.__values(this.steps.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { var _d = tslib_1.__read(_c.value, 2), index = _d[0], step = _d[1]; if (step.current) { return index; } } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_4) throw e_4.error; } } return -1; }; Progress.decorators = [ { type: Component, args: [{ selector: 'suka-progress', template: "\n <div class=\"mobile-progress\">\n <div class=\"mobile-progress__label\">\n <h3 class=\"mobile-progress__label__current-step\">{{currentStep().label}}</h3>\n <p class=\"mobile-progress__label__next-step\" *ngIf=\"getCurrentStepIndex() + 1 < steps.length\">Pr\u00F3ximo paso: {{nextStep().label}}</p>\n <p class=\"mobile-progress__label__next-step\" *ngIf=\"getCurrentStepIndex() + 1 >= steps.length\">\u00DAltimo paso</p>\n </div>\n\n <div\n class=\"mobile-progress__status\"\n [ngClass]=\"[\n 'radial-progress-' + (getCurrentStepIndex() + 1) * 100 / steps.length\n ]\"\n >\n <div class=\"mobile-progress__status-overlay\">\n {{getCurrentStepIndex() + 1}} de {{steps.length}}\n </div>\n </div>\n </div>\n <div class=\"progress__wrapper\">\n <ul class=\"progress-bar\">\n <li\n *ngFor=\"let step of steps; let i = index\"\n class=\"progress-bar__step\"\n [ngClass]=\"{\n 'progress-bar__step--complete': isComplete(step),\n 'progress-bar__step--editable': isEditable(step),\n 'progress-bar__step--error': step.state === 'error',\n 'progress-bar__step--current': step.current,\n 'progress-bar__step--unclickable': isUnclickable(step, i)\n }\"\n >\n <div class=\"step\" role=\"button\" (click)=\"select(i)\">\n <div class=\"step__indicator\">\n <ng-container *ngIf=\"step.state !== 'complete' || step.current\">{{ i + 1 }}</ng-container>\n <suka-icon icon=\"check\" *ngIf=\"isComplete(step) && !isEditable(step) && !step.current\"></suka-icon>\n <suka-icon icon=\"edit-2\" *ngIf=\"isEditable(step) && !step.current\"></suka-icon>\n </div>\n <span class=\"step__label\"> {{ step.label }}</span>\n </div>\n </li>\n </ul>\n </div>\n " }] } ]; Progress.propDecorators = { baseClass: [{ type: HostBinding, args: ['class.progress',] }], linear: [{ type: Input }], editable: [{ type: Input }], selected: [{ type: Output }], stepsChange: [{ type: Output }], steps: [{ type: Input }] }; return Progress; }()); export { Progress }; if (false) { /** * @type {?} * @private */ Progress.prototype._steps; /** @type {?} */ Progress.prototype.baseClass; /** * Set to `true` to make the progress linear. This allows the user to access any of the steps at any time (like tabs). * @type {?} */ Progress.prototype.linear; /** * Set to `true` to allow the user to edit a step after completed. * @type {?} */ Progress.prototype.editable; /** * Emits an event when a index is selected * @type {?} */ Progress.prototype.selected; /** * Emits an event when the steps change. * @type {?} */ Progress.prototype.stepsChange; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL3Byb2dyZXNzL3Byb2dyZXNzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRzVGO0lBQUE7UUFrRGlDLGNBQVMsR0FBRyxJQUFJLENBQUM7Ozs7UUFLdkMsV0FBTSxHQUFHLEtBQUssQ0FBQzs7OztRQUtmLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFLaEIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7UUFLOUIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBZ0g3QyxDQUFDO0lBNUdDLHNCQUFhLDJCQUFLO1FBSGxCOztXQUVHOzs7OztRQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7Ozs7O1FBQ0QsVUFBVSxLQUFLO1lBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFFcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7OztPQUxBOzs7OztJQU9ELHlCQUFNOzs7O0lBQU4sVUFBTyxRQUFRO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPOzs7OztRQUFDLFVBQUMsSUFBSSxFQUFFLEtBQUs7WUFDOUIsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzthQUNyQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNyQjtRQUNILENBQUMsRUFBQyxDQUFDO1FBRUgsSUFB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UUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRSxrNkRBMkNUO2lCQUNGOzs7NEJBSUUsV0FBVyxTQUFDLGdCQUFnQjt5QkFLNUIsS0FBSzsyQkFLTCxLQUFLOzJCQUtMLE1BQU07OEJBS04sTUFBTTt3QkFJTixLQUFLOztJQTRHUixlQUFDO0NBQUEsQUF0TEQsSUFzTEM7U0F2SVksUUFBUTs7Ozs7O0lBQ25CLDBCQUFvQzs7SUFFcEMsNkJBQWdEOzs7OztJQUtoRCwwQkFBd0I7Ozs7O0lBS3hCLDRCQUEwQjs7Ozs7SUFLMUIsNEJBQXdDOzs7OztJQUt4QywrQkFBMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBIb3N0QmluZGluZywgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NTdGVwIH0gZnJvbSAnLi9wcm9ncmVzcy1zdGVwLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtcHJvZ3Jlc3MnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NfX2xhYmVsXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cIm1vYmlsZS1wcm9ncmVzc19fbGFiZWxfX2N1cnJlbnQtc3RlcFwiPnt7Y3VycmVudFN0ZXAoKS5sYWJlbH19PC9oMz5cbiAgICAgICAgPHAgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NfX2xhYmVsX19uZXh0LXN0ZXBcIiAqbmdJZj1cImdldEN1cnJlbnRTdGVwSW5kZXgoKSArIDEgPCBzdGVwcy5sZW5ndGhcIj5QcsOzeGltbyBwYXNvOiB7e25leHRTdGVwKCkubGFiZWx9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NfX2xhYmVsX19uZXh0LXN0ZXBcIiAqbmdJZj1cImdldEN1cnJlbnRTdGVwSW5kZXgoKSArIDEgPj0gc3RlcHMubGVuZ3RoXCI+w5psdGltbyBwYXNvPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NfX3N0YXR1c1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAncmFkaWFsLXByb2dyZXNzLScgKyAoZ2V0Q3VycmVudFN0ZXBJbmRleCgpICsgMSkgKiAxMDAgLyBzdGVwcy5sZW5ndGhcbiAgICAgICAgXVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NfX3N0YXR1cy1vdmVybGF5XCI+XG4gICAgICAgICAge3tnZXRDdXJyZW50U3RlcEluZGV4KCkgKyAxfX0gZGUge3tzdGVwcy5sZW5ndGh9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc19fd3JhcHBlclwiPlxuICAgICAgPHVsIGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgIDxsaVxuICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cInByb2dyZXNzLWJhcl9fc3RlcFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3Byb2dyZXNzLWJhcl9fc3RlcC0tY29tcGxldGUnOiBpc0NvbXBsZXRlKHN0ZXApLFxuICAgICAgICAgICAgJ3Byb2dyZXNzLWJhcl9fc3RlcC0tZWRpdGFibGUnOiBpc0VkaXRhYmxlKHN0ZXApLFxuICAgICAgICAgICAgJ3Byb2dyZXNzLWJhcl9fc3RlcC0tZXJyb3InOiBzdGVwLnN0YXRlID09PSAnZXJyb3InLFxuICAgICAgICAgICAgJ3Byb2dyZXNzLWJhcl9fc3RlcC0tY3VycmVudCc6IHN0ZXAuY3VycmVudCxcbiAgICAgICAgICAgICdwcm9ncmVzcy1iYXJfX3N0ZXAtLXVuY2xpY2thYmxlJzogaXNVbmNsaWNrYWJsZShzdGVwLCBpKVxuICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXBcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbGVjdChpKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXBfX2luZGljYXRvclwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcC5zdGF0ZSAhPT0gJ2NvbXBsZXRlJyB8fCBzdGVwLmN1cnJlbnRcIj57eyBpICsgMSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8c3VrYS1pY29uIGljb249XCJjaGVja1wiICpuZ0lmPVwiaXNDb21wbGV0ZShzdGVwKSAmJiAhaXNFZGl0YWJsZShzdGVwKSAmJiAhc3RlcC5jdXJyZW50XCI+PC9zdWthLWljb24+XG4gICAgICAgICAgICAgIDxzdWthLWljb24gaWNvbj1cImVkaXQtMlwiICpuZ0lmPVwiaXNFZGl0YWJsZShzdGVwKSAmJiAhc3RlcC5jdXJyZW50XCI+PC9zdWthLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RlcF9fbGFiZWxcIj4ge3sgc3RlcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3Mge1xuICBwcml2YXRlIF9zdGVwczogQXJyYXk8UHJvZ3Jlc3NTdGVwPjtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnByb2dyZXNzJykgYmFzZUNsYXNzID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBwcm9ncmVzcyBsaW5lYXIuIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGFjY2VzcyBhbnkgb2YgdGhlIHN0ZXBzIGF0IGFueSB0aW1lIChsaWtlIHRhYnMpLlxuICAgKi9cbiAgQElucHV0KCkgbGluZWFyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgdG8gYWxsb3cgdGhlIHVzZXIgdG8gZWRpdCBhIHN0ZXAgYWZ0ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgQElucHV0KCkgZWRpdGFibGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGluZGV4IGlzIHNlbGVjdGVkXG4gICAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHN0ZXBzIGNoYW5nZS5cbiAgICovXG4gIEBPdXRwdXQoKSBzdGVwc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0ZXBzIGZvciB0aGUgYFByb2dyZXNzYCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBnZXQgc3RlcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0ZXBzO1xuICB9XG4gIHNldCBzdGVwcyh2YWx1ZSkge1xuICAgIHRoaXMuX3N0ZXBzID0gdmFsdWU7XG5cbiAgICB0aGlzLnN0ZXBzQ2hhbmdlLmVtaXQodGhpcy5fc3RlcHMpO1xuICB9XG5cbiAgc2VsZWN0KG5ld0luZGV4KTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcHMuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gbmV3SW5kZXgpIHtcbiAgICAgICAgc3RlcC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcC5jdXJyZW50KSB7XG4gICAgICAgIGRlbGV0ZSBzdGVwLmN1cnJlbnQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3SW5kZXgpO1xuXG4gICAgdGhpcy5zdGVwcyA9IHRoaXMuX3N0ZXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgaXMgY29tcGxldGVkLlxuICAgKi9cbiAgaXNDb21wbGV0ZShzdGVwOiBQcm9ncmVzc1N0ZXApIHtcbiAgICByZXR1cm4gc3RlcC5zdGF0ZSA9PT0gJ2NvbXBsZXRlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIGlzIGVkaXRhYmxlLlxuICAgKi9cbiAgaXNFZGl0YWJsZShzdGVwOiBQcm9ncmVzc1N0ZXApIHtcbiAgICByZXR1cm4gc3RlcC5zdGF0ZSA9PT0gJ2NvbXBsZXRlJyAmJiB0aGlzLmVkaXRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgaXMgdW5jbGlja2FibGUuXG4gICAqL1xuICBpc1VuY2xpY2thYmxlKHN0ZXA6IFByb2dyZXNzU3RlcCwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChzdGVwLnN0YXRlID09PSAnY29tcGxldGUnICYmICF0aGlzLmVkaXRhYmxlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHN0ZXAuc3RhdGUgPT09ICdpbmNvbXBsZXRlJyAmJiAhdGhpcy5saW5lYXIgJiYgaW5kZXggIT09IHRoaXMuZ2V0TmV4dFVuY29tcGxldGVkU3RlcEluZGV4KCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB1bmNvbXBsZXRlZCBzdGVwLlxuICAgKi9cbiAgZ2V0TmV4dFVuY29tcGxldGVkU3RlcEluZGV4KCk6IG51bWJlciB7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHN0ZXBdIG9mIHRoaXMuc3RlcHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoc3RlcC5zdGF0ZSA9PT0gJ2luY29tcGxldGUnKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0ZXAuXG4gICAqL1xuICBjdXJyZW50U3RlcCgpIHtcbiAgICBmb3IgKGNvbnN0IFtfLCBzdGVwXSBvZiB0aGlzLnN0ZXBzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHN0ZXAuY3VycmVudCkge1xuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBuZXh0IHN0ZXAuXG4gICAqL1xuICBuZXh0U3RlcCgpIHtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gLTE7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc3RlcF0gb2YgdGhpcy5zdGVwcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChzdGVwLmN1cnJlbnQpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudEluZGV4ID49IDAgJiYgY3VycmVudEluZGV4ICsgMSA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGVwIGluZGV4LlxuICAgKi9cbiAgZ2V0Q3VycmVudFN0ZXBJbmRleCgpIHtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc3RlcF0gb2YgdGhpcy5zdGVwcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChzdGVwLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxufVxuIl19