@blox/material
Version:
Material Components for Angular
250 lines • 30.8 kB
JavaScript
import { Directive, ElementRef, HostBinding, Input, Optional, Renderer2, Self, forwardRef, Output, EventEmitter, ContentChildren, HostListener } from '@angular/core';
import { NgControl } from '@angular/forms';
import { MDCSwitchFoundation } from '@material/switch';
import { AbstractMdcInput } from '../abstract/abstract.mdc.input';
import { asBoolean } from '../../utils/value.utils';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
/**
* Directive for the native input element of an <code>MdcSwitchDirective</code>.
*/
export class MdcSwitchInputDirective extends AbstractMdcInput {
constructor(_elm, _cntr) {
super();
this._elm = _elm;
this._cntr = _cntr;
/** @internal */
this._cls = true;
/** @internal */
this._role = 'switch';
this.onDestroy$ = new Subject();
/** @internal */
this._checkedChange = new EventEmitter();
/** @internal */
this._disabledChange = new EventEmitter();
/** @internal */
this._change = new EventEmitter();
this._id = null;
this._disabled = false;
this._checked = false;
}
ngOnInit() {
var _a;
(_a = this._cntr) === null || _a === void 0 ? void 0 : _a.valueChanges.pipe(takeUntil(this.onDestroy$)).subscribe((value) => {
this.updateValue(value, true);
});
}
ngOnDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
}
/** @docs-private */
get id() {
return this._id;
}
set id(value) {
this._id = value;
}
/** @docs-private */
get disabled() {
return this._cntr ? !!this._cntr.disabled : this._disabled;
}
set disabled(value) {
const newVal = asBoolean(value);
if (newVal != this._disabled) {
this._disabled = asBoolean(newVal);
this._disabledChange.emit(newVal);
}
}
/** @docs-private */
get checked() {
return this._checked;
}
set checked(value) {
this.updateValue(value, false);
}
/** @internal */
_onChange(event) {
// update checked value, but not via this.checked, so we bypass events being sent to:
// - _checkedChange -> foundation is already updated via _change
// - _cntr.control.setValue -> control is already updated through its own handling of user events
this._checked = this._elm.nativeElement.checked; // bypass
this._change.emit(event);
}
updateValue(value, fromControl) {
// When the 'checked' property is the source of the change, we want to coerce boolean
// values using asBoolean, so that initializing with an attribute with no value works
// as expected.
// When the NgControl is the source of the change we don't want that. The value should
// be interpreted like NgControl/NgForms handles non-boolean values when binding.
const newVal = fromControl ? !!value : asBoolean(value);
if (newVal !== this._checked) {
this._checked = newVal;
this._checkedChange.emit(newVal);
}
if (!fromControl && this._cntr && newVal !== this._cntr.value) {
this._cntr.control.setValue(newVal);
}
}
}
MdcSwitchInputDirective.decorators = [
{ type: Directive, args: [{
selector: 'input[mdcSwitchInput][type=checkbox]',
providers: [{ provide: AbstractMdcInput, useExisting: forwardRef(() => MdcSwitchInputDirective) }]
},] }
];
MdcSwitchInputDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
];
MdcSwitchInputDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-switch__native-control',] }],
_role: [{ type: HostBinding, args: ['attr.role',] }],
_checkedChange: [{ type: Output }],
_disabledChange: [{ type: Output }],
_change: [{ type: Output }],
id: [{ type: HostBinding }, { type: Input }],
disabled: [{ type: HostBinding }, { type: Input }],
checked: [{ type: HostBinding }, { type: Input }],
_onChange: [{ type: HostListener, args: ['change', ['$event'],] }]
};
/**
* Directive for the mandatory thumb element of an `mdcSwitch`. See `mdcSwitch` for more
* information.
*/
export class MdcSwitchThumbDirective {
constructor(elm, rndr) {
this.elm = elm;
this.rndr = rndr;
/** @internal */
this._cls = true;
this.addThumb();
}
addThumb() {
const thumb = this.rndr.createElement('div');
this.rndr.addClass(thumb, 'mdc-switch__thumb');
this.rndr.appendChild(this.elm.nativeElement, thumb);
}
}
MdcSwitchThumbDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcSwitchThumb]'
},] }
];
MdcSwitchThumbDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
MdcSwitchThumbDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-switch__thumb-underlay',] }]
};
/**
* Directive for creating a Material Design switch component. The switch is driven by an
* underlying native checkbox input, which must use the `mdcSwitchInput` directive. The
* `mdcSwitchInput` must be wrapped by an `mdcSwitchThumb`, which must be a direct child of this
* `mdcSwitch` directive.
*
* The current implementation will add all other required DOM elements (such as the
* switch-track). Future implementations will also support supplying (customized) elements
* for those.
*
* This directive can be used together with an <code>mdcFormField</code> to
* easily position switches and their labels, see
* <a href="/components/form-field">mdcFormField</a>.
*/
export class MdcSwitchDirective {
constructor(rndr, root) {
this.rndr = rndr;
this.root = root;
/** @internal */
this._cls = true;
this.onDestroy$ = new Subject();
this.onInputChange$ = new Subject();
this.mdcAdapter = {
addClass: (className) => {
this.rndr.addClass(this.root.nativeElement, className);
},
removeClass: (className) => {
this.rndr.removeClass(this.root.nativeElement, className);
},
setNativeControlAttr: (attr, value) => this.rndr.setAttribute(this._input._elm.nativeElement, attr, value),
setNativeControlChecked: () => undefined,
setNativeControlDisabled: () => undefined // nothing to do, enabling/disabling is done directly on the input
};
this.foundation = null;
this.addTrack();
}
ngAfterContentInit() {
if (this._input) {
this.initFoundation();
}
this._inputs.changes.pipe(takeUntil(this.onDestroy$)).subscribe(() => {
if (this.foundation)
this.foundation.destroy();
if (this._input)
this.initFoundation();
else
this.foundation = null;
this.subscribeInputChanges();
});
this.subscribeInputChanges();
}
ngOnDestroy() {
this.onInputChange$.next();
this.onInputChange$.complete();
this.onDestroy$.next();
this.onDestroy$.complete();
if (this.foundation) {
this.foundation.destroy();
this.foundation = null;
}
}
initFoundation() {
this.foundation = new MDCSwitchFoundation(this.mdcAdapter);
this.foundation.init();
// The foundation doesn't correctly set the aria-checked attribute and the checked/disabled styling
// on initialization. So let's help it to not forget that:
this.foundation.setChecked(this._input.checked);
this.foundation.setDisabled(this._input.disabled);
}
addTrack() {
const track = this.rndr.createElement('div');
this.rndr.addClass(track, 'mdc-switch__track');
this.rndr.appendChild(this.root.nativeElement, track);
}
subscribeInputChanges() {
var _a, _b, _c;
this.onInputChange$.next();
(_a = this._input) === null || _a === void 0 ? void 0 : _a._checkedChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(checked => { var _a; return (_a = this.foundation) === null || _a === void 0 ? void 0 : _a.setChecked(checked); });
(_b = this._input) === null || _b === void 0 ? void 0 : _b._disabledChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(disabled => {
var _a;
(_a = this.foundation) === null || _a === void 0 ? void 0 : _a.setDisabled(disabled);
});
(_c = this._input) === null || _c === void 0 ? void 0 : _c._change.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe((event) => {
var _a;
(_a = this.foundation) === null || _a === void 0 ? void 0 : _a.handleChange(event);
});
}
get _input() {
return this._inputs && this._inputs.length > 0 ? this._inputs.first : null;
}
}
MdcSwitchDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcSwitch]'
},] }
];
MdcSwitchDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef }
];
MdcSwitchDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-switch',] }],
_inputs: [{ type: ContentChildren, args: [MdcSwitchInputDirective, { descendants: true },] }]
};
export const SWITCH_DIRECTIVES = [
MdcSwitchInputDirective,
MdcSwitchThumbDirective,
MdcSwitchDirective
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnN3aXRjaC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zd2l0Y2gvbWRjLnN3aXRjaC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksRUFDekUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXFCLGVBQWUsRUFBYSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0M7O0dBRUc7QUFLSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsZ0JBQWdCO0lBZ0J6RCxZQUFtQixJQUFnQixFQUE2QixLQUFnQjtRQUM1RSxLQUFLLEVBQUUsQ0FBQztRQURPLFNBQUksR0FBSixJQUFJLENBQVk7UUFBNkIsVUFBSyxHQUFMLEtBQUssQ0FBVztRQWZoRixnQkFBZ0I7UUFDMEMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUN0RSxnQkFBZ0I7UUFDVSxVQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ25DLGVBQVUsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNqRCxnQkFBZ0I7UUFDRyxtQkFBYyxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3ZGLGdCQUFnQjtRQUNH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WUFDekYsTUFBQSxJQUFJLENBQUMsVUFBVSwwQ0FBRSxZQUFZLENBQUMsS0FBSyxFQUFFO1FBQ3pDLENBQUMsRUFBRTtJQUNQLENBQUM7SUFFRCxJQUFZLE1BQU07UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9FLENBQUM7OztZQWpGSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGFBQWE7YUFDMUI7OztZQXJKNkQsU0FBUztZQUFuRCxVQUFVOzs7bUJBd0p6QixXQUFXLFNBQUMsa0JBQWtCO3NCQUk5QixlQUFlLFNBQUMsdUJBQXVCLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDOztBQTJFakUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDN0IsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtJQUN2QixrQkFBa0I7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBPcHRpb25hbCwgUmVuZGVyZXIyLCBTZWxmLFxuICAgIGZvcndhcmRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIEhvc3RMaXN0ZW5lcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNRENTd2l0Y2hGb3VuZGF0aW9uLCBNRENTd2l0Y2hBZGFwdGVyIH0gZnJvbSAnQG1hdGVyaWFsL3N3aXRjaCc7XG5pbXBvcnQgeyBBYnN0cmFjdE1kY0lucHV0IH0gZnJvbSAnLi4vYWJzdHJhY3QvYWJzdHJhY3QubWRjLmlucHV0JztcbmltcG9ydCB7IGFzQm9vbGVhbiB9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbHVlLnV0aWxzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBvZiBhbiA8Y29kZT5NZGNTd2l0Y2hEaXJlY3RpdmU8L2NvZGU+LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2lucHV0W21kY1N3aXRjaElucHV0XVt0eXBlPWNoZWNrYm94XScsXG4gICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IEFic3RyYWN0TWRjSW5wdXQsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1kY1N3aXRjaElucHV0RGlyZWN0aXZlKSB9XVxufSlcbmV4cG9ydCBjbGFzcyBNZGNTd2l0Y2hJbnB1dERpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXN3aXRjaF9fbmF0aXZlLWNvbnRyb2wnKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSBfcm9sZSA9ICdzd2l0Y2gnO1xuICAgIHByaXZhdGUgb25EZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IF9jaGVja2VkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBfZGlzYWJsZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IF9jaGFuZ2U6IEV2ZW50RW1pdHRlcjxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICAgIHByaXZhdGUgX2lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NoZWNrZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBfZWxtOiBFbGVtZW50UmVmLCBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBfY250cjogTmdDb250cm9sKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX2NudHI/LnZhbHVlQ2hhbmdlcyEucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIEBIb3N0QmluZGluZygpXG4gICAgQElucHV0KCkgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICBcbiAgICBzZXQgaWQodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIEBIb3N0QmluZGluZygpXG4gICAgQElucHV0KCkgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY250ciA/ICEhdGhpcy5fY250ci5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBuZXdWYWwgPSBhc0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsICE9IHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGFzQm9vbGVhbihuZXdWYWwpO1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWRDaGFuZ2UuZW1pdChuZXdWYWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBib29sZWFuIHwgJyc7XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIEBIb3N0QmluZGluZygpXG4gICAgQElucHV0KCkgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICAgIH1cblxuICAgIHNldCBjaGVja2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfY2hlY2tlZDogYm9vbGVhbiB8ICcnO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pIF9vbkNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gdXBkYXRlIGNoZWNrZWQgdmFsdWUsIGJ1dCBub3QgdmlhIHRoaXMuY2hlY2tlZCwgc28gd2UgYnlwYXNzIGV2ZW50cyBiZWluZyBzZW50IHRvOlxuICAgICAgICAvLyAtIF9jaGVja2VkQ2hhbmdlIC0+IGZvdW5kYXRpb24gaXMgYWxyZWFkeSB1cGRhdGVkIHZpYSBfY2hhbmdlXG4gICAgICAgIC8vIC0gX2NudHIuY29udHJvbC5zZXRWYWx1ZSAtPiBjb250cm9sIGlzIGFscmVhZHkgdXBkYXRlZCB0aHJvdWdoIGl0cyBvd24gaGFuZGxpbmcgb2YgdXNlciBldmVudHNcbiAgICAgICAgdGhpcy5fY2hlY2tlZCA9IHRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LmNoZWNrZWQ7IC8vIGJ5cGFzcyBcbiAgICAgICAgdGhpcy5fY2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsdWUodmFsdWU6IGFueSwgZnJvbUNvbnRyb2w6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gV2hlbiB0aGUgJ2NoZWNrZWQnIHByb3BlcnR5IGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGNoYW5nZSwgd2Ugd2FudCB0byBjb2VyY2UgYm9vbGVhblxuICAgICAgICAvLyB2YWx1ZXMgdXNpbmcgYXNCb29sZWFuLCBzbyB0aGF0IGluaXRpYWxpemluZyB3aXRoIGFuIGF0dHJpYnV0ZSB3aXRoIG5vIHZhbHVlIHdvcmtzXG4gICAgICAgIC8vIGFzIGV4cGVjdGVkLlxuICAgICAgICAvLyBXaGVuIHRoZSBOZ0NvbnRyb2wgaXMgdGhlIHNvdXJjZSBvZiB0aGUgY2hhbmdlIHdlIGRvbid0IHdhbnQgdGhhdC4gVGhlIHZhbHVlIHNob3VsZFxuICAgICAgICAvLyBiZSBpbnRlcnByZXRlZCBsaWtlIE5nQ29udHJvbC9OZ0Zvcm1zIGhhbmRsZXMgbm9uLWJvb2xlYW4gdmFsdWVzIHdoZW4gYmluZGluZy5cbiAgICAgICAgY29uc3QgbmV3VmFsID0gZnJvbUNvbnRyb2wgPyAhIXZhbHVlIDogYXNCb29sZWFuKHZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbCAhPT0gdGhpcy5fY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tlZCA9IG5ld1ZhbDtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrZWRDaGFuZ2UuZW1pdChuZXdWYWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZnJvbUNvbnRyb2wgJiYgdGhpcy5fY250ciAmJiBuZXdWYWwgIT09IHRoaXMuX2NudHIudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NudHIuY29udHJvbCEuc2V0VmFsdWUobmV3VmFsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIHRoZSBtYW5kYXRvcnkgdGh1bWIgZWxlbWVudCBvZiBhbiBgbWRjU3dpdGNoYC4gU2VlIGBtZGNTd2l0Y2hgIGZvciBtb3JlXG4gKiBpbmZvcm1hdGlvbi5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbbWRjU3dpdGNoVGh1bWJdJ1xufSlcbmV4cG9ydCBjbGFzcyBNZGNTd2l0Y2hUaHVtYkRpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXN3aXRjaF9fdGh1bWItdW5kZXJsYXknKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxtOiBFbGVtZW50UmVmLCBwcml2YXRlIHJuZHI6IFJlbmRlcmVyMikge1xuICAgICAgICB0aGlzLmFkZFRodW1iKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUaHVtYigpIHtcbiAgICAgICAgY29uc3QgdGh1bWIgPSB0aGlzLnJuZHIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucm5kci5hZGRDbGFzcyh0aHVtYiwgJ21kYy1zd2l0Y2hfX3RodW1iJyk7XG4gICAgICAgIHRoaXMucm5kci5hcHBlbmRDaGlsZCh0aGlzLmVsbS5uYXRpdmVFbGVtZW50LCB0aHVtYik7XG4gICAgfVxufVxuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgY3JlYXRpbmcgYSBNYXRlcmlhbCBEZXNpZ24gc3dpdGNoIGNvbXBvbmVudC4gVGhlIHN3aXRjaCBpcyBkcml2ZW4gYnkgYW5cbiAqIHVuZGVybHlpbmcgbmF0aXZlIGNoZWNrYm94IGlucHV0LCB3aGljaCBtdXN0IHVzZSB0aGUgYG1kY1N3aXRjaElucHV0YCBkaXJlY3RpdmUuIFRoZVxuICogYG1kY1N3aXRjaElucHV0YCBtdXN0IGJlIHdyYXBwZWQgYnkgYW4gYG1kY1N3aXRjaFRodW1iYCwgd2hpY2ggbXVzdCBiZSBhIGRpcmVjdCBjaGlsZCBvZiB0aGlzXG4gKiBgbWRjU3dpdGNoYCBkaXJlY3RpdmUuXG4gKiBcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgYWRkIGFsbCBvdGhlciByZXF1aXJlZCBET00gZWxlbWVudHMgKHN1Y2ggYXMgdGhlXG4gKiBzd2l0Y2gtdHJhY2spLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwgYWxzbyBzdXBwb3J0IHN1cHBseWluZyAoY3VzdG9taXplZCkgZWxlbWVudHNcbiAqIGZvciB0aG9zZS5cbiAqIFxuICogVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBhbiA8Y29kZT5tZGNGb3JtRmllbGQ8L2NvZGU+IHRvXG4gKiBlYXNpbHkgcG9zaXRpb24gc3dpdGNoZXMgYW5kIHRoZWlyIGxhYmVscywgc2VlXG4gKiA8YSBocmVmPVwiL2NvbXBvbmVudHMvZm9ybS1maWVsZFwiPm1kY0Zvcm1GaWVsZDwvYT4uXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY1N3aXRjaF0nXG59KVxuZXhwb3J0IGNsYXNzIE1kY1N3aXRjaERpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXN3aXRjaCcpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIHByaXZhdGUgb25EZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBwcml2YXRlIG9uSW5wdXRDaGFuZ2UkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKE1kY1N3aXRjaElucHV0RGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBfaW5wdXRzPzogUXVlcnlMaXN0PE1kY1N3aXRjaElucHV0RGlyZWN0aXZlPjtcbiAgICBwcml2YXRlIG1kY0FkYXB0ZXI6IE1EQ1N3aXRjaEFkYXB0ZXIgPSB7XG4gICAgICAgIGFkZENsYXNzOiAoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm5kci5hZGRDbGFzcyh0aGlzLnJvb3QubmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlQ2xhc3M6IChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5ybmRyLnJlbW92ZUNsYXNzKHRoaXMucm9vdC5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXROYXRpdmVDb250cm9sQXR0cjogKGF0dHI6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdGhpcy5ybmRyLnNldEF0dHJpYnV0ZSh0aGlzLl9pbnB1dCEuX2VsbS5uYXRpdmVFbGVtZW50LCBhdHRyLCB2YWx1ZSksXG4gICAgICAgIHNldE5hdGl2ZUNvbnRyb2xDaGVja2VkOiAoKSA9PiB1bmRlZmluZWQsIC8vIG5vdGhpbmcgdG8gZG8sIGNoZWNraW5nL3VuY2hlY2tpbmcgaXMgZG9uZSBkaXJlY3RseSBvbiB0aGUgaW5wdXRcbiAgICAgICAgc2V0TmF0aXZlQ29udHJvbERpc2FibGVkOiAoKSA9PiB1bmRlZmluZWQgLy8gbm90aGluZyB0byBkbywgZW5hYmxpbmcvZGlzYWJsaW5nIGlzIGRvbmUgZGlyZWN0bHkgb24gdGhlIGlucHV0XG4gICAgfTtcbiAgICBwcml2YXRlIGZvdW5kYXRpb246IE1EQ1N3aXRjaEZvdW5kYXRpb24gfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcm5kcjogUmVuZGVyZXIyLCBwcml2YXRlIHJvb3Q6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5hZGRUcmFjaygpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRGb3VuZGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5wdXRzIS5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3VuZGF0aW9uKVxuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5wdXQpXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Rm91bmRhdGlvbigpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUlucHV0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVJbnB1dENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5vbklucHV0Q2hhbmdlJC5uZXh0KCk7IHRoaXMub25JbnB1dENoYW5nZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTsgdGhpcy5vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIGlmICh0aGlzLmZvdW5kYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmZvdW5kYXRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Rm91bmRhdGlvbigpIHtcbiAgICAgICAgdGhpcy5mb3VuZGF0aW9uID0gbmV3IE1EQ1N3aXRjaEZvdW5kYXRpb24odGhpcy5tZGNBZGFwdGVyKTtcbiAgICAgICAgdGhpcy5mb3VuZGF0aW9uLmluaXQoKTtcbiAgICAgICAgLy8gVGhlIGZvdW5kYXRpb24gZG9lc24ndCBjb3JyZWN0bHkgc2V0IHRoZSBhcmlhLWNoZWNrZWQgYXR0cmlidXRlIGFuZCB0aGUgY2hlY2tlZC9kaXNhYmxlZCBzdHlsaW5nXG4gICAgICAgIC8vIG9uIGluaXRpYWxpemF0aW9uLiBTbyBsZXQncyBoZWxwIGl0IHRvIG5vdCBmb3JnZXQgdGhhdDpcbiAgICAgICAgdGhpcy5mb3VuZGF0aW9uLnNldENoZWNrZWQodGhpcy5faW5wdXQhLmNoZWNrZWQpO1xuICAgICAgICB0aGlzLmZvdW5kYXRpb24uc2V0RGlzYWJsZWQodGhpcy5faW5wdXQhLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRyYWNrKCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMucm5kci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5ybmRyLmFkZENsYXNzKHRyYWNrLCAnbWRjLXN3aXRjaF9fdHJhY2snKTtcbiAgICAgICAgdGhpcy5ybmRyLmFwcGVuZENoaWxkKHRoaXMucm9vdC5uYXRpdmVFbGVtZW50LCB0cmFjayk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHN1YnNjcmliZUlucHV0Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5vbklucHV0Q2hhbmdlJC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2lucHV0Py5fY2hlY2tlZENoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uSW5wdXRDaGFuZ2UkKSkuc3Vic2NyaWJlKGNoZWNrZWQgPT4gdGhpcy5mb3VuZGF0aW9uPy5zZXRDaGVja2VkKGNoZWNrZWQpKTtcbiAgICAgICAgdGhpcy5faW5wdXQ/Ll9kaXNhYmxlZENoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uSW5wdXRDaGFuZ2UkKSkuc3Vic2NyaWJlKGRpc2FibGVkID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRhdGlvbj8uc2V0RGlzYWJsZWQoZGlzYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faW5wdXQ/Ll9jaGFuZ2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5vbklucHV0Q2hhbmdlJCkpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRhdGlvbj8uaGFuZGxlQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX2lucHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRzICYmIHRoaXMuX2lucHV0cy5sZW5ndGggPiAwID8gdGhpcy5faW5wdXRzLmZpcnN0IDogbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBTV0lUQ0hfRElSRUNUSVZFUyA9IFtcbiAgICBNZGNTd2l0Y2hJbnB1dERpcmVjdGl2ZSxcbiAgICBNZGNTd2l0Y2hUaHVtYkRpcmVjdGl2ZSxcbiAgICBNZGNTd2l0Y2hEaXJlY3RpdmVcbl07XG4iXX0=