UNPKG

jw-bootstrap-switch-ng2

Version:
644 lines (638 loc) 54.9 kB
import { Component, Input, Output, HostListener, forwardRef, EventEmitter, ViewChild, Renderer2, ChangeDetectorRef, NgModule } from '@angular/core'; import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ const callback = () => { }; /** @type {?} */ const CUSTOM_INPUT = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => JwBootstrapSwitchNg2Component), multi: true }; class JwBootstrapSwitchNg2Component { /** * @param {?} cd * @param {?} render */ constructor(cd, render) { this.cd = cd; this.render = render; // Defining Default Options for Switch this.handleWidth = 0; this.labelWidth = 0; this.labelText = ''; this.inverse = false; this.baseClass = 'bootstrap-switch'; this.onText = 'ON'; this.offText = 'OFF'; this.disabled = false; this.readonly = false; this._focused = false; this._size = 'normal'; this._animate = true; this._innerAnimate = true; this._indeterminate = false; this._onColor = 'primary'; this._offColor = 'default'; this._wrapperClass = 'wrapper'; this._innerState = false; this._innerHandleWidth = 'auto'; this._innerLabelWidth = 'auto'; this._dragStart = null; this._dragEnd = null; this._onTouchedCallback = callback; this._onChangeCallback = callback; this.changeState = new EventEmitter(); } /** * @private * @return {?} */ $on() { return this.on.nativeElement; } /** * @private * @return {?} */ $off() { return this.off.nativeElement; } /** * @private * @return {?} */ $label() { return this.label.nativeElement; } /** * @private * @return {?} */ $container() { return this.container.nativeElement; } /** * \@description: Function to set the Classes for the Wrapper Div * @return {?} string */ getWrapperClasses() { /** @type {?} */ let output = this.baseClass + ' ' + this.baseClass + '-' + this._wrapperClass; if (this._focused) { output += ' ' + this.baseClass + '-focused'; } if (this.readonly) { output += ' ' + this.baseClass + '-readonly'; } if (this._size != null) { output += ' ' + this.baseClass + '-' + this._size; } if (this._innerState) { output += ' ' + this.baseClass + '-on'; } else { output += ' ' + this.baseClass + '-off'; } if (this._animate) { output += ' ' + this.baseClass + '-animate'; } if (this.disabled) { output += ' ' + this.baseClass + '-disabled'; } if (this._indeterminate || this._innerState === null || typeof this._innerState === 'undefined') { output += ' ' + this.baseClass + '-indeterminate'; } if (this.inverse) { output += ' ' + this.baseClass + '-inverse'; } return output; } /** * \@description Function to set the css classes for #on * @return {?} string */ getOnClasses() { /** @type {?} */ let output = this.baseClass + '-handle-on'; if (this._onColor) { output += ' ' + this.baseClass + '-' + this._onColor; } return output; } /** * \@description Function to set the css classes for #off * @return {?} string */ getOffClasses() { /** @type {?} */ let output = this.baseClass + '-handle-off'; if (this._offColor) { output += ' ' + this.baseClass + '-' + this._offColor; } return output; } /** * \@description Function set the marging of the #label when change the state * @return {?} string */ getLabelMarginLeft() { /** @type {?} */ let width = (this.inverse) ? -this.handleWidth : 0; if (this._indeterminate || this._innerState === null || typeof this._innerState === 'undefined') { width = -(this.handleWidth / 2); } else if (this._dragEnd) { width = this._dragEnd; } else if (!this._innerState) { if (!this.inverse) { width = -this.handleWidth; } else { width = 0; } } return width + 'px'; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes['setLabelText'] || changes['setOnText'] || changes['setHandleWidth'] || changes['setLabelWidth'] || changes['setOffText'] || changes['setSize']) { this.calculateWith(true); } } /** * @return {?} */ ngAfterViewInit() { this.calculateWith(); } /** * @return {?} */ onClick() { if (!this.disabled && !this.readonly && !this._dragEnd) { this.setStateValue(!this._innerState); } else if (this._dragEnd) { this._dragEnd = null; } } /** * @param {?} e * @return {?} */ onKeyDown(e) { if (!e.which || this.disabled || this.readonly) { return; } switch (e.which) { case 37: e.preventDefault(); e.stopImmediatePropagation(); this.setStateValue(false); break; case 39: e.preventDefault(); e.stopImmediatePropagation(); this.setStateValue(true); break; } } /** * @private * @param {?} e * @return {?} */ onDragStart(e) { if (e.target === this.$label()) { if (this._dragStart || this.disabled || this.readonly) { return; } e.preventDefault(); e.stopPropagation(); this._dragStart = (e.pageX || e.touches[0].pageX) - parseInt(this.$container().style.marginLeft, 10); if (this._animate) { this._animate = !this._animate; } } } /** * @private * @param {?} e * @return {?} */ onDragMove(e) { if (this._dragStart) { e.preventDefault(); /** @type {?} */ const difference = (e.pageX || e.touches[0].pageX) - this._dragStart; if (difference < -Number(this.handleWidth) || difference > 0) { return; } this._dragEnd = difference; } } /** * @private * @param {?} e * @param {?=} removeDragEnd * @return {?} */ onDragEnd(e, removeDragEnd = false) { if (this._dragStart) { e.preventDefault(); e.stopPropagation(); if (this._dragEnd) { /** @type {?} */ const state = this._dragEnd > -(Number(this.handleWidth) / 2); this.setStateValue((this.inverse) ? !state : state); } this._dragStart = null; if (removeDragEnd) { this._dragEnd = null; } if (this._innerAnimate) { this._animate = true; } } } /** * @param {?} e * @return {?} */ onTouchStart(e) { this.onDragStart(e); } /** * @param {?} e * @return {?} */ onMouseDown(e) { this.onDragStart(e); } /** * @param {?} e * @return {?} */ onTouchMove(e) { this.onDragMove(e); } /** * @param {?} e * @return {?} */ onMouseMove(e) { this.onDragMove(e); } /** * @param {?} e * @return {?} */ onMouseUp(e) { this.onDragEnd(e); } /** * @param {?} e * @return {?} */ onTouchEnd(e) { this.onDragEnd(e, true); } /** * @param {?} e * @return {?} */ onMouseLeave(e) { this.onDragEnd(e, true); } /** * @return {?} */ onFocus() { this._focused = true; } /** * @return {?} */ onBlur() { this._focused = false; this._onTouchedCallback(); } /** * \@description Function to make recalculate the size of the elements when options change * @private * @param {?=} disableAnimation * @return {?} */ calculateWith(disableAnimation = false) { if (disableAnimation && this._innerAnimate) { this._animate = false; } setTimeout(() => { this.render.setStyle(this.$on(), 'width', 'auto'); this.render.setStyle(this.$off(), 'width', 'auto'); this.render.setStyle(this.$label(), 'width', 'auto'); /** @type {?} */ const width = (this._innerHandleWidth === 'auto') ? Math.max(this.$on().offsetWidth, this.$off().offsetWidth) : this._innerHandleWidth; if (this.$label().offsetWidth < width) { if (this._innerLabelWidth === 'auto') { this.labelWidth = Number(width); } else { this.labelWidth = Number(this._innerLabelWidth); } } else { if (this._innerLabelWidth === 'auto') { this.labelWidth = this.$label().offsetWidth; } else { this.labelWidth = Number(this._innerLabelWidth); } } this.handleWidth = Number(width); this.render.setStyle(this.$label(), 'width', this.labelWidth + 'px'); this.render.setStyle(this.$on(), 'width', this.handleWidth + 'px'); this.render.setStyle(this.$off(), 'width', this.handleWidth + 'px'); setTimeout(() => { if (disableAnimation && this._innerAnimate) { this._animate = true; } }); this.cd.markForCheck(); }); } // Functions to set inputs and the private variables of the Switch /** * @param {?} value * @return {?} */ set setBaseClass(value) { this.baseClass = value; } /** * @param {?} value * @return {?} */ set setWrapperClass(value) { this._wrapperClass = value; } /** * @param {?} value * @return {?} */ set setOffText(value) { this.offText = (value) ? value : 'OFF'; } /** * @param {?} value * @return {?} */ set setLabelText(value) { this.labelText = value; } /** * @param {?} value * @return {?} */ set setOnText(value) { this.onText = (value) ? value : 'ON'; } /** * @param {?} value * @return {?} */ set setSize(value) { if (value) { this._size = value; } } /** * @param {?} value * @return {?} */ set setAnimate(value) { this._animate = value; this._innerAnimate = value; } /** * @param {?} value * @return {?} */ set setOnColor(value) { if (value) { this._onColor = value; } } /** * @param {?} value * @return {?} */ set setOffColor(value) { if (value) { this._offColor = value; } } /** * @param {?} value * @return {?} */ set setDisabled(value) { this.disabled = value; } /** * @param {?} value * @return {?} */ set setReadOnly(value) { this.readonly = value; } /** * @param {?} value * @return {?} */ set setIndeterminate(value) { this._indeterminate = value; } /** * @param {?} value * @return {?} */ set setInverse(value) { this.inverse = value; } /** * @param {?} value * @return {?} */ set setHandleWidth(value) { this._innerHandleWidth = (typeof (value) !== 'undefined') ? value : 'auto'; } /** * @param {?} value * @return {?} */ set setLabelWidth(value) { this._innerLabelWidth = (typeof (value) !== 'undefined') ? value : 'auto'; } /** * @return {?} */ get value() { return this._innerState; } /** * @param {?} v * @return {?} */ set value(v) { if (v === null || typeof v === 'undefined') { this._indeterminate = true; } this.setStateValue(v); } /** * @private * @param {?} v * @return {?} */ setStateValue(v) { if (v !== this._innerState) { this._onChangeCallback(v); this.changeState.emit({ previousValue: this._innerState, currentValue: v }); this._innerState = v; } } /** * @param {?} value * @return {?} */ writeValue(value) { if (value !== this._innerState) { this._innerState = value; this.cd.markForCheck(); } } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this._onChangeCallback = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this._onTouchedCallback = fn; } } JwBootstrapSwitchNg2Component.decorators = [ { type: Component, args: [{ selector: 'bSwitch', providers: [CUSTOM_INPUT], template: ` <div [ngClass]="getWrapperClasses()" [style.width]="(handleWidth + labelWidth ) +'px'"> <div #container [ngClass]="baseClass + '-container'" [style.width]="((handleWidth * 2) + labelWidth) +'px'" [style.margin-left]="getLabelMarginLeft()"><!-- --><span #on [innerHTML]="(inverse) ? offText : onText" [ngClass]="(inverse) ? getOffClasses() : getOnClasses()"></span><!-- --><span #label [ngClass]="baseClass + '-label'">&nbsp;{{ labelText }}</span><!-- --><span #off [innerHTML]="(inverse) ? onText : offText" [ngClass]="(inverse) ? getOnClasses() : getOffClasses()"></span><!-- --><input type="checkbox" [(ngModel)]="value" [readonly]="readonly" [disabled]="disabled" (focus)="onFocus()" (blur)="onBlur()"> </div> </div>` },] }, ]; /** @nocollapse */ JwBootstrapSwitchNg2Component.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: Renderer2 } ]; JwBootstrapSwitchNg2Component.propDecorators = { changeState: [{ type: Output }], container: [{ type: ViewChild, args: ['container',] }], on: [{ type: ViewChild, args: ['on',] }], label: [{ type: ViewChild, args: ['label',] }], off: [{ type: ViewChild, args: ['off',] }], onClick: [{ type: HostListener, args: ['click',] }], onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }], onTouchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }], onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }], onTouchMove: [{ type: HostListener, args: ['touchmove', ['$event'],] }], onMouseMove: [{ type: HostListener, args: ['mousemove', ['$event'],] }], onMouseUp: [{ type: HostListener, args: ['mouseup', ['$event'],] }], onTouchEnd: [{ type: HostListener, args: ['touchend', ['$event'],] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave', ['$event'],] }], setBaseClass: [{ type: Input, args: ['switch-base-class',] }], setWrapperClass: [{ type: Input, args: ['switch-wrapper-class',] }], setOffText: [{ type: Input, args: ['switch-off-text',] }], setLabelText: [{ type: Input, args: ['switch-label-text',] }], setOnText: [{ type: Input, args: ['switch-on-text',] }], setSize: [{ type: Input, args: ['switch-size',] }], setAnimate: [{ type: Input, args: ['switch-animate',] }], setOnColor: [{ type: Input, args: ['switch-on-color',] }], setOffColor: [{ type: Input, args: ['switch-off-color',] }], setDisabled: [{ type: Input, args: ['switch-disabled',] }], setReadOnly: [{ type: Input, args: ['switch-readonly',] }], setIndeterminate: [{ type: Input, args: ['switch-indeterminate',] }], setInverse: [{ type: Input, args: ['switch-inverse',] }], setHandleWidth: [{ type: Input, args: ['switch-handle-width',] }], setLabelWidth: [{ type: Input, args: ['switch-label-width',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class JwBootstrapSwitchNg2Module { } JwBootstrapSwitchNg2Module.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule, FormsModule ], declarations: [JwBootstrapSwitchNg2Component], exports: [JwBootstrapSwitchNg2Component] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export { JwBootstrapSwitchNg2Component, JwBootstrapSwitchNg2Module }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianctYm9vdHN0cmFwLXN3aXRjaC1uZzIuanMubWFwIiwic291cmNlcyI6WyJuZzovL2p3LWJvb3RzdHJhcC1zd2l0Y2gtbmcyL2xpYi9qdy1ib290c3RyYXAtc3dpdGNoLW5nMi5jb21wb25lbnQudHMiLCJuZzovL2p3LWJvb3RzdHJhcC1zd2l0Y2gtbmcyL2xpYi9qdy1ib290c3RyYXAtc3dpdGNoLW5nMi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBJbnB1dCxcclxuICAgIE91dHB1dCxcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBmb3J3YXJkUmVmLFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIENoYW5nZURldGVjdG9yUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcclxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XHJcbn07XHJcblxyXG5jb25zdCBDVVNUT01fSU5QVVQ6IGFueSA9IHtcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSndCb290c3RyYXBTd2l0Y2hOZzJDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiU3dpdGNoJyxcclxuICAgIHByb3ZpZGVyczogW0NVU1RPTV9JTlBVVF0sXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldFdyYXBwZXJDbGFzc2VzKClcIiBbc3R5bGUud2lkdGhdPVwiKGhhbmRsZVdpZHRoICArIGxhYmVsV2lkdGggKSArJ3B4J1wiPlxyXG4gICAgICAgICAgPGRpdiAjY29udGFpbmVyIFtuZ0NsYXNzXT1cImJhc2VDbGFzcyArICctY29udGFpbmVyJ1wiXHJcbiAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCIoKGhhbmRsZVdpZHRoICogMikgKyBsYWJlbFdpZHRoKSArJ3B4J1wiXHJcbiAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW4tbGVmdF09XCJnZXRMYWJlbE1hcmdpbkxlZnQoKVwiPjwhLS1cclxuICAgICAgICAgICAgICAtLT48c3BhbiAjb24gW2lubmVySFRNTF09XCIoaW52ZXJzZSkgPyBvZmZUZXh0IDogb25UZXh0XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihpbnZlcnNlKSA/IGdldE9mZkNsYXNzZXMoKSA6IGdldE9uQ2xhc3NlcygpXCI+PC9zcGFuPjwhLS1cclxuICAgICAgICAgICAgICAtLT48c3BhbiAjbGFiZWwgW25nQ2xhc3NdPVwiYmFzZUNsYXNzICsgJy1sYWJlbCdcIj4mbmJzcDt7eyBsYWJlbFRleHQgfX08L3NwYW4+PCEtLVxyXG4gICAgICAgICAgICAgIC0tPjxzcGFuICNvZmYgW2lubmVySFRNTF09XCIoaW52ZXJzZSkgPyBvblRleHQgOiBvZmZUZXh0XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihpbnZlcnNlKSA/IGdldE9uQ2xhc3NlcygpIDogZ2V0T2ZmQ2xhc3NlcygpXCI+PC9zcGFuPjwhLS1cclxuICAgICAgICAgICAgICAtLT48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIiAoYmx1cik9XCJvbkJsdXIoKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBKd0Jvb3RzdHJhcFN3aXRjaE5nMkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xyXG4gICAgLy8gRGVmaW5pbmcgRGVmYXVsdCBPcHRpb25zIGZvciBTd2l0Y2hcclxuICAgIHB1YmxpYyBoYW5kbGVXaWR0aDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsYWJlbFdpZHRoOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxhYmVsVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgICBwdWJsaWMgaW52ZXJzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGJhc2VDbGFzczogc3RyaW5nID0gJ2Jvb3RzdHJhcC1zd2l0Y2gnO1xyXG4gICAgcHVibGljIG9uVGV4dDogc3RyaW5nID0gJ09OJztcclxuICAgIHB1YmxpYyBvZmZUZXh0OiBzdHJpbmcgPSAnT0ZGJztcclxuICAgIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfc2l6ZTogYW55ID0gJ25vcm1hbCc7XHJcbiAgICBwcml2YXRlIF9hbmltYXRlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX2lubmVyQW5pbWF0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9pbmRldGVybWluYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9vbkNvbG9yOiBzdHJpbmcgPSAncHJpbWFyeSc7XHJcbiAgICBwcml2YXRlIF9vZmZDb2xvcjogc3RyaW5nID0gJ2RlZmF1bHQnO1xyXG4gICAgcHJpdmF0ZSBfd3JhcHBlckNsYXNzOiBzdHJpbmcgPSAnd3JhcHBlcic7XHJcbiAgICBwcml2YXRlIF9pbm5lclN0YXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pbm5lckhhbmRsZVdpZHRoOiBzdHJpbmcgfCBudW1iZXIgPSAnYXV0byc7XHJcbiAgICBwcml2YXRlIF9pbm5lckxhYmVsV2lkdGg6IHN0cmluZyB8IG51bWJlciA9ICdhdXRvJztcclxuXHJcbiAgICBwcml2YXRlIF9kcmFnU3RhcnQ6IGFueSA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9kcmFnRW5kOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gY2FsbGJhY2s7XHJcbiAgICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gY2FsbGJhY2s7XHJcblxyXG4gICAgQE91dHB1dCgpIGNoYW5nZVN0YXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHJcbiAgICAvLyBEZWZpbmluZyBET00gRWxlbWVudHNcclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ29uJykgb246IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdsYWJlbCcpIGxhYmVsOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnb2ZmJykgb2ZmOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIHByaXZhdGUgJG9uKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub24ubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlICRvZmYoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vZmYubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlICRsYWJlbCgpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxhYmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSAkY29udGFpbmVyKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb246ICBGdW5jdGlvbiB0byBzZXQgdGhlIENsYXNzZXMgZm9yIHRoZSBXcmFwcGVyIERpdlxyXG4gICAgICogQHJldHVybnMgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRXcmFwcGVyQ2xhc3NlcygpIHtcclxuICAgICAgICBsZXQgb3V0cHV0OiBzdHJpbmcgPSB0aGlzLmJhc2VDbGFzcyArICcgJyArIHRoaXMuYmFzZUNsYXNzICsgJy0nICsgdGhpcy5fd3JhcHBlckNsYXNzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZm9jdXNlZCkge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gJyAnICsgdGhpcy5iYXNlQ2xhc3MgKyAnLWZvY3VzZWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yZWFkb25seSkge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gJyAnICsgdGhpcy5iYXNlQ2xhc3MgKyAnLXJlYWRvbmx5JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zaXplICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9ICcgJyArIHRoaXMuYmFzZUNsYXNzICsgJy0nICsgdGhpcy5fc2l6ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pbm5lclN0YXRlKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctb24nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctb2ZmJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hbmltYXRlKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctYW5pbWF0ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gJyAnICsgdGhpcy5iYXNlQ2xhc3MgKyAnLWRpc2FibGVkJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pbmRldGVybWluYXRlIHx8IHRoaXMuX2lubmVyU3RhdGUgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2lubmVyU3RhdGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctaW5kZXRlcm1pbmF0ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbnZlcnNlKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctaW52ZXJzZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gc2V0IHRoZSBjc3MgY2xhc3NlcyBmb3IgI29uXHJcbiAgICAgKiBAcmV0dXJucyBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9uQ2xhc3NlcygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBvdXRwdXQ6IHN0cmluZyA9IHRoaXMuYmFzZUNsYXNzICsgJy1oYW5kbGUtb24nO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb25Db2xvcikge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gJyAnICsgdGhpcy5iYXNlQ2xhc3MgKyAnLScgKyB0aGlzLl9vbkNvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBzZXQgdGhlIGNzcyBjbGFzc2VzIGZvciAjb2ZmXHJcbiAgICAgKiBAcmV0dXJucyBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9mZkNsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgb3V0cHV0OiBzdHJpbmcgPSB0aGlzLmJhc2VDbGFzcyArICctaGFuZGxlLW9mZic7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vZmZDb2xvcikge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gJyAnICsgdGhpcy5iYXNlQ2xhc3MgKyAnLScgKyB0aGlzLl9vZmZDb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gIEZ1bmN0aW9uIHNldCB0aGUgbWFyZ2luZyBvZiB0aGUgI2xhYmVsIHdoZW4gY2hhbmdlIHRoZSBzdGF0ZVxyXG4gICAgICogQHJldHVybnMgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRMYWJlbE1hcmdpbkxlZnQoKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5pbnZlcnNlKSA/IC10aGlzLmhhbmRsZVdpZHRoIDogMDtcclxuICAgICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSB8fCB0aGlzLl9pbm5lclN0YXRlID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLl9pbm5lclN0YXRlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICB3aWR0aCA9IC0odGhpcy5oYW5kbGVXaWR0aCAvIDIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhZ0VuZCkge1xyXG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuX2RyYWdFbmQ7XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5faW5uZXJTdGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW52ZXJzZSkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSAtdGhpcy5oYW5kbGVXaWR0aDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gd2lkdGggKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHJlbmRlcjogUmVuZGVyZXIyKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZXRMYWJlbFRleHQnXSB8fFxyXG4gICAgICAgICAgICBjaGFuZ2VzWydzZXRPblRleHQnXSB8fFxyXG4gICAgICAgICAgICBjaGFuZ2VzWydzZXRIYW5kbGVXaWR0aCddIHx8XHJcbiAgICAgICAgICAgIGNoYW5nZXNbJ3NldExhYmVsV2lkdGgnXSB8fFxyXG4gICAgICAgICAgICBjaGFuZ2VzWydzZXRPZmZUZXh0J10gfHxcclxuICAgICAgICAgICAgY2hhbmdlc1snc2V0U2l6ZSddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlV2l0aCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlV2l0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJykgb25DbGljaygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMuX2RyYWdFbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZVZhbHVlKCF0aGlzLl9pbm5lclN0YXRlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RyYWdFbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0VuZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICghZS53aGljaCB8fCB0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGUud2hpY2gpIHtcclxuICAgICAgICAgICAgY2FzZSAzNzpcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlVmFsdWUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMzk6XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZVZhbHVlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0YXJ0KGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcy4kbGFiZWwoKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJhZ1N0YXJ0IHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0ID0gKGUucGFnZVggfHwgZS50b3VjaGVzWzBdLnBhZ2VYKSAtIHBhcnNlSW50KHRoaXMuJGNvbnRhaW5lcigpLnN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdGUgPSAhdGhpcy5fYW5pbWF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZ01vdmUoZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdTdGFydCkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSAoZS5wYWdlWCB8fCBlLnRvdWNoZXNbMF0ucGFnZVgpIC0gdGhpcy5fZHJhZ1N0YXJ0O1xyXG4gICAgICAgICAgICBpZiAoZGlmZmVyZW5jZSA8IC1OdW1iZXIodGhpcy5oYW5kbGVXaWR0aCkgfHwgZGlmZmVyZW5jZSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kcmFnRW5kID0gZGlmZmVyZW5jZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkRyYWdFbmQoZTogRXZlbnQsIHJlbW92ZURyYWdFbmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnU3RhcnQpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJhZ0VuZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9kcmFnRW5kID4gLShOdW1iZXIodGhpcy5oYW5kbGVXaWR0aCkgLyAyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGVWYWx1ZSgodGhpcy5pbnZlcnNlKSA/ICFzdGF0ZSA6IHN0YXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kcmFnU3RhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAocmVtb3ZlRHJhZ0VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhZ0VuZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lubmVyQW5pbWF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pIG9uVG91Y2hTdGFydChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0KGUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pIG9uTW91c2VEb3duKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25EcmFnU3RhcnQoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSkgb25Ub3VjaE1vdmUoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkRyYWdNb3ZlKGUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZScsIFsnJGV2ZW50J10pIG9uTW91c2VNb3ZlKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25EcmFnTW92ZShlKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJywgWyckZXZlbnQnXSkgb25Nb3VzZVVwKGU6IEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5vbkRyYWdFbmQoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKSBvblRvdWNoRW5kKGU6IEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5vbkRyYWdFbmQoZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnJGV2ZW50J10pIG9uTW91c2VMZWF2ZShlOiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMub25EcmFnRW5kKGUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgb25CbHVyKCkge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIG1ha2UgcmVjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnRzIHdoZW4gb3B0aW9ucyBjaGFuZ2VcclxuICAgICAqIEBwYXJhbSBkaXNhYmxlQW5pbWF0aW9uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlV2l0aChkaXNhYmxlQW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZGlzYWJsZUFuaW1hdGlvbiAmJiB0aGlzLl9pbm5lckFuaW1hdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUodGhpcy4kb24oKSwgJ3dpZHRoJywgJ2F1dG8nKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUodGhpcy4kb2ZmKCksICd3aWR0aCcsICdhdXRvJyk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuJGxhYmVsKCksICd3aWR0aCcsICdhdXRvJyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9ICh0aGlzLl9pbm5lckhhbmRsZVdpZHRoID09PSAnYXV0bycpXHJcbiAgICAgICAgICAgICAgICA/IE1hdGgubWF4KHRoaXMuJG9uKCkub2Zmc2V0V2lkdGgsIHRoaXMuJG9mZigpLm9mZnNldFdpZHRoKVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9pbm5lckhhbmRsZVdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuJGxhYmVsKCkub2Zmc2V0V2lkdGggPCB3aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lubmVyTGFiZWxXaWR0aCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbFdpZHRoID0gTnVtYmVyKHdpZHRoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbFdpZHRoID0gTnVtYmVyKHRoaXMuX2lubmVyTGFiZWxXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5uZXJMYWJlbFdpZHRoID09PSAnYXV0bycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsV2lkdGggPSB0aGlzLiRsYWJlbCgpLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsV2lkdGggPSBOdW1iZXIodGhpcy5faW5uZXJMYWJlbFdpZHRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVXaWR0aCA9IE51bWJlcih3aWR0aCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZSh0aGlzLiRsYWJlbCgpLCAnd2lkdGgnLCB0aGlzLmxhYmVsV2lkdGggKyAncHgnKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUodGhpcy4kb24oKSwgJ3dpZHRoJywgdGhpcy5oYW5kbGVXaWR0aCArICdweCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZSh0aGlzLiRvZmYoKSwgJ3dpZHRoJywgdGhpcy5oYW5kbGVXaWR0aCArICdweCcpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlQW5pbWF0aW9uICYmIHRoaXMuX2lubmVyQW5pbWF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGdW5jdGlvbnMgdG8gc2V0IGlucHV0cyBhbmQgdGhlIHByaXZhdGUgdmFyaWFibGVzIG9mIHRoZSBTd2l0Y2hcclxuICAgIEBJbnB1dCgnc3dpdGNoLWJhc2UtY2xhc3MnKSBzZXQgc2V0QmFzZUNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmJhc2VDbGFzcyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLXdyYXBwZXItY2xhc3MnKSBzZXQgc2V0V3JhcHBlckNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl93cmFwcGVyQ2xhc3MgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoJ3N3aXRjaC1vZmYtdGV4dCcpIHNldCBzZXRPZmZUZXh0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9mZlRleHQgPSAodmFsdWUpID8gdmFsdWUgOiAnT0ZGJztcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoJ3N3aXRjaC1sYWJlbC10ZXh0Jykgc2V0IHNldExhYmVsVGV4dCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbFRleHQgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoJ3N3aXRjaC1vbi10ZXh0Jykgc2V0IHNldE9uVGV4dCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vblRleHQgPSAodmFsdWUpID8gdmFsdWUgOiAnT04nO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLXNpemUnKSBzZXQgc2V0U2l6ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpemUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCdzd2l0Y2gtYW5pbWF0ZScpIHNldCBzZXRBbmltYXRlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuX2lubmVyQW5pbWF0ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLW9uLWNvbG9yJykgc2V0IHNldE9uQ29sb3IodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkNvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLW9mZi1jb2xvcicpIHNldCBzZXRPZmZDb2xvcih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29mZkNvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLWRpc2FibGVkJykgc2V0IHNldERpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLXJlYWRvbmx5Jykgc2V0IHNldFJlYWRPbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5yZWFkb25seSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLWluZGV0ZXJtaW5hdGUnKSBzZXQgc2V0SW5kZXRlcm1pbmF0ZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoJ3N3aXRjaC1pbnZlcnNlJykgc2V0IHNldEludmVyc2UodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmludmVyc2UgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoJ3N3aXRjaC1oYW5kbGUtd2lkdGgnKSBzZXQgc2V0SGFuZGxlV2lkdGgodmFsdWU6IG51bWJlciB8ICdhdXRvJykge1xyXG4gICAgICAgIHRoaXMuX2lubmVySGFuZGxlV2lkdGggPSAodHlwZW9mICh2YWx1ZSkgIT09ICd1bmRlZmluZWQnKSA/IHZhbHVlIDogJ2F1dG8nO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnc3dpdGNoLWxhYmVsLXdpZHRoJykgc2V0IHNldExhYmVsV2lkdGgodmFsdWU6IG51bWJlciB8ICdhdXRvJykge1xyXG4gICAgICAgIHRoaXMuX2lubmVyTGFiZWxXaWR0aCA9ICh0eXBlb2YgKHZhbHVlKSAhPT0gJ3VuZGVmaW5lZCcpID8gdmFsdWUgOiAnYXV0byc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbm5lclN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCB2YWx1ZSh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFN0YXRlVmFsdWUodik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRTdGF0ZVZhbHVlKHY6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodiAhPT0gdGhpcy5faW5uZXJTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlU3RhdGUuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c1ZhbHVlOiB0aGlzLl9pbm5lclN0YXRlLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlOiB2XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9pbm5lclN0YXRlID0gdjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5faW5uZXJTdGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbm5lclN0YXRlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSndCb290c3RyYXBTd2l0Y2hOZzJDb21wb25lbnQgfSBmcm9tICcuL2p3LWJvb3RzdHJhcC1zd2l0Y2gtbmcyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZVxyXG4gIF0sXHJcbiAgZGVjbGFyYXRpb25zOiBbSndCb290c3RyYXBTd2l0Y2hOZzJDb21wb25lbnRdLFxyXG4gIGV4cG9ydHM6IFtKd0Jvb3RzdHJhcFN3aXRjaE5nMkNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEp3Qm9vdHN0cmFwU3dpdGNoTmcyTW9kdWxlIHsgfVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtNQW9CTSxRQUFRLEdBQUc7Q0FDaEI7O01BRUssWUFBWSxHQUFRO0lBQ3RCLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIs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