@tarienna/ng-tri-state-checkbox
Version:
A TriStateCheckbox for Angular 9
170 lines • 21.2 kB
JavaScript
var NgTriStateCheckboxComponent_1;
import { __decorate } from "tslib";
import { Component, ElementRef, forwardRef, Input, OnDestroy, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { TriStateCheckboxState } from './tri-state-checkbox.types';
let NgTriStateCheckboxComponent = NgTriStateCheckboxComponent_1 = class NgTriStateCheckboxComponent {
constructor(renderer) {
this.renderer = renderer;
this.checkboxClass = 'tri-state-checkbox-default';
this._isDisabled = false;
this.controls = new Map();
this.currentState = TriStateCheckboxState.NONE;
this.onChanged = (_) => { };
this.onTouched = () => { };
}
ngOnDestroy() {
this.controls.clear();
}
registerOnChange(fn) {
if (typeof fn === 'function') {
this.onChanged = fn;
}
else {
this.onChanged = (_) => { };
}
}
registerOnTouched(fn) {
if (typeof fn === 'function') {
this.onTouched = fn;
}
else {
this.onTouched = () => { };
}
}
setDisabledState(isDisabled) {
this._isDisabled = isDisabled;
for (const currentControl of this.controls.keys()) {
currentControl.setDisabled(isDisabled);
}
}
get isDisabled() {
return this._isDisabled;
}
addControl(control) {
if (!!control) {
this.controls.set(control, control.readValue());
this.refreshState();
setTimeout(() => {
this.emitValueChanged();
});
}
}
removeControl(control) {
this.controls.delete(control);
this.refreshState();
setTimeout(() => {
this.emitValueChanged();
});
}
changeControlValue(control, value) {
this.controls.set(control, value);
this.refreshState();
this.emitValueChanged();
}
refreshState() {
this.currentState = this.getState();
this.refreshCheckboxState();
}
getState() {
let anyWasFalse = false;
let result = TriStateCheckboxState.NONE;
for (const currentValue of this.controls.values()) {
if (!!currentValue) {
result = TriStateCheckboxState.SOME;
}
if (!currentValue) {
anyWasFalse = true;
}
}
if (!anyWasFalse && result === TriStateCheckboxState.SOME) {
result = TriStateCheckboxState.ALL;
}
return result;
}
onClick() {
const currentState = this.getState();
if (currentState === TriStateCheckboxState.SOME || currentState === TriStateCheckboxState.ALL) {
// gets unselected
this.writeAllControlValues(false);
this.currentState = TriStateCheckboxState.NONE;
}
else if (currentState === TriStateCheckboxState.NONE) {
this.writeAllControlValues(true);
this.currentState = TriStateCheckboxState.ALL;
}
this.refreshCheckboxState();
this.emitValueChanged();
}
writeAllControlValues(nValue) {
for (const currentControl of this.controls.keys()) {
if (currentControl) {
currentControl.writeValue(nValue);
}
}
}
refreshCheckboxState() {
if (this.customCheckbox && this.customCheckbox.nativeElement) {
let checked = false;
let indeterminate = false;
if (this.currentState === TriStateCheckboxState.ALL) {
checked = true;
indeterminate = false;
}
else if (this.currentState === TriStateCheckboxState.SOME) {
checked = true;
indeterminate = true;
}
this.renderer.setProperty(this.customCheckbox.nativeElement, 'checked', checked);
// Browser Support for indeterminate: https://caniuse.com/#search=indeterminate
this.customCheckbox.nativeElement.indeterminate = indeterminate;
}
}
emitValueChanged() {
const values = [];
for (const value of this.controls.values()) {
if (!!value) {
values.push(value);
}
}
this.onChanged(values);
this.onTouched();
}
reset() {
this.writeAllControlValues(false);
this.refreshState();
this.emitValueChanged();
}
writeValue(obj) {
if (!!obj && obj.hasOwnProperty('length') && obj.length > 0) {
console.warn('It\'s currently not possible to set values. Maybe later there is a solution to do that.');
}
}
};
NgTriStateCheckboxComponent.ctorParameters = () => [
{ type: Renderer2 }
];
__decorate([
Input()
], NgTriStateCheckboxComponent.prototype, "checkboxClass", void 0);
__decorate([
ViewChild('customCheckbox', { static: false })
], NgTriStateCheckboxComponent.prototype, "customCheckbox", void 0);
NgTriStateCheckboxComponent = NgTriStateCheckboxComponent_1 = __decorate([
Component({
selector: 'ng-tri-state-checkbox',
template: "<input type=\"checkbox\" [class]=\"checkboxClass\" (change)=\"onClick()\" #customCheckbox [disabled]=\"isDisabled\">\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgTriStateCheckboxComponent_1),
multi: true
}
],
exportAs: 'ngTriStateCheckbox',
encapsulation: ViewEncapsulation.None,
styles: [".tri-state-checkbox-default{height:1rem;width:1rem;display:block;position:relative;pointer-events:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-image:none;border:1px solid #adb5bd;border-radius:.15rem;box-sizing:border-box}.tri-state-checkbox-default:checked:not(:indeterminate){background-color:#0099da;color:#fff}.tri-state-checkbox-default:checked:not(:indeterminate):after{content:\"\";display:block;position:absolute;top:-1px;left:-1px;width:1rem;height:1rem;pointer-events:none;color:#fff;background-color:#0099da;background-repeat:no-repeat;background-size:50% 50%;background-position:50%;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");border:1px solid #0099da;border-radius:.15rem}.tri-state-checkbox-default:indeterminate{background-color:#fff;color:#adb5bd;border-color:#0099da}.tri-state-checkbox-default:indeterminate:after{content:\"\";display:block;position:absolute;top:calc(.225rem - 1px);left:calc(.225rem - 1px);width:.55rem;height:.55rem;pointer-events:none;background-color:#0099da;border:1px solid #0099da;border-radius:.15rem}"]
})
], NgTriStateCheckboxComponent);
export { NgTriStateCheckboxComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdHJpLXN0YXRlLWNoZWNrYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YXJpZW5uYS9uZy10cmktc3RhdGUtY2hlY2tib3gvIiwic291cmNlcyI6WyJsaWIvbmctdHJpLXN0YXRlLWNoZWNrYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0QsTUFBTSw0QkFBNEIsQ0FBQztBQWdCbkgsSUFBYSwyQkFBMkIsbUNBQXhDLE1BQWEsMkJBQTJCO0lBZ0JwQyxZQUFzQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBZHpDLGtCQUFhLEdBQUcsNEJBQTRCLENBQUM7UUFFckMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFNUIsYUFBUSxHQUF1QyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztRQUV4RixpQkFBWSxHQUEwQixxQkFBcUIsQ0FBQyxJQUFJLENBQUM7UUFLakUsY0FBUyxHQUFxQixDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQzdDLGNBQVMsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFVyxDQUFDO0lBRTdDLFdBQVc7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3BCLElBQUksT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFO1lBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxH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O2dCQUMxRCxLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0o7UUFDRCxRQUFRLEVBQUUsb0JBQW9CO1FBQzlCLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOztLQUN4QyxDQUFDO0dBQ1csMkJBQTJCLENBaUt2QztTQWpLWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJpU3RhdGVDaGVja2JveFN0YXRlLCBJVHJpU3RhdGVDaGVja2JveENvbnRyb2wsIElUcmlDaGVja2JveFJlZ2lzdGVyIH0gZnJvbSAnLi90cmktc3RhdGUtY2hlY2tib3gudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25nLXRyaS1zdGF0ZS1jaGVja2JveCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25nLXRyaS1zdGF0ZS1jaGVja2JveC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmctdHJpLXN0YXRlLWNoZWNrYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdUcmlTdGF0ZUNoZWNrYm94Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdLFxuICAgIGV4cG9ydEFzOiAnbmdUcmlTdGF0ZUNoZWNrYm94JyxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIE5nVHJpU3RhdGVDaGVja2JveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIElUcmlDaGVja2JveFJlZ2lzdGVyIHtcbiAgICBASW5wdXQoKVxuICAgIGNoZWNrYm94Q2xhc3MgPSAndHJpLXN0YXRlLWNoZWNrYm94LWRlZmF1bHQnO1xuXG4gICAgcHJpdmF0ZSBfaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgY29udHJvbHM6IE1hcDxJVHJpU3RhdGVDaGVja2JveENvbnRyb2wsIGFueT4gPSBuZXcgTWFwPElUcmlTdGF0ZUNoZWNrYm94Q29udHJvbCwgYW55PigpO1xuXG4gICAgY3VycmVudFN0YXRlOiBUcmlTdGF0ZUNoZWNrYm94U3RhdGUgPSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuTk9ORTtcblxuICAgIEBWaWV3Q2hpbGQoJ2N1c3RvbUNoZWNrYm94JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY3VzdG9tQ2hlY2tib3g6IEVsZW1lbnRSZWY7XG5cbiAgICBvbkNoYW5nZWQ6IChfOiBhbnkpID0+IHZvaWQgPSAoXzogYW55KSA9PiB7fTtcbiAgICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZWQgPSBmbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkID0gKF86IGFueSkgPT4ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9ICgpID0+IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb250cm9sIG9mIHRoaXMuY29udHJvbHMua2V5cygpKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29udHJvbC5zZXREaXNhYmxlZChpc0Rpc2FibGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpc0Rpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBhZGRDb250cm9sKGNvbnRyb2w6IElUcmlTdGF0ZUNoZWNrYm94Q29udHJvbCk6IHZvaWQge1xuICAgICAgICBpZiAoISFjb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnNldChjb250cm9sLCBjb250cm9sLnJlYWRWYWx1ZSgpKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFN0YXRlKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRWYWx1ZUNoYW5nZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlQ29udHJvbChjb250cm9sOiBJVHJpU3RhdGVDaGVja2JveENvbnRyb2wpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250cm9scy5kZWxldGUoY29udHJvbCk7XG4gICAgICAgIHRoaXMucmVmcmVzaFN0YXRlKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0VmFsdWVDaGFuZ2VkKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbnRyb2xWYWx1ZShjb250cm9sOiBJVHJpU3RhdGVDaGVja2JveENvbnRyb2wsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jb250cm9scy5zZXQoY29udHJvbCwgdmFsdWUpO1xuICAgICAgICB0aGlzLnJlZnJlc2hTdGF0ZSgpO1xuICAgICAgICB0aGlzLmVtaXRWYWx1ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICByZWZyZXNoU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDaGVja2JveFN0YXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0U3RhdGUoKTogVHJpU3RhdGVDaGVja2JveFN0YXRlIHtcbiAgICAgICAgbGV0IGFueVdhc0ZhbHNlID0gZmFsc2U7XG4gICAgICAgIGxldCByZXN1bHQ6IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZSA9IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5OT05FO1xuXG4gICAgICAgIGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIHRoaXMuY29udHJvbHMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmICghIWN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5TT01FO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhbnlXYXNGYWxzZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWFueVdhc0ZhbHNlICYmIHJlc3VsdCA9PT0gVHJpU3RhdGVDaGVja2JveFN0YXRlLlNPTUUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5BTEw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gVHJpU3RhdGVDaGVja2JveFN0YXRlLlNPTUUgfHwgY3VycmVudFN0YXRlID09PSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuQUxMKSB7XG4gICAgICAgICAgICAvLyBnZXRzIHVuc2VsZWN0ZWRcbiAgICAgICAgICAgIHRoaXMud3JpdGVBbGxDb250cm9sVmFsdWVzKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gVHJpU3RhdGVDaGVja2JveFN0YXRlLk5PTkU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFN0YXRlID09PSBUcmlTdGF0ZUNoZWNrYm94U3RhdGUuTk9ORSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZUFsbENvbnRyb2xWYWx1ZXModHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5BTEw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWZyZXNoQ2hlY2tib3hTdGF0ZSgpO1xuICAgICAgICB0aGlzLmVtaXRWYWx1ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVBbGxDb250cm9sVmFsdWVzKG5WYWx1ZTogYm9vbGVhbikge1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb250cm9sIG9mIHRoaXMuY29udHJvbHMua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29udHJvbC53cml0ZVZhbHVlKG5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZyZXNoQ2hlY2tib3hTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hlY2tib3ggJiYgdGhpcy5jdXN0b21DaGVja2JveC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBsZXQgY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gVHJpU3RhdGVDaGVja2JveFN0YXRlLkFMTCkge1xuICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50U3RhdGUgPT09IFRyaVN0YXRlQ2hlY2tib3hTdGF0ZS5TT01FKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuY3VzdG9tQ2hlY2tib3gubmF0aXZlRWxlbWVudCwgJ2NoZWNrZWQnLCBjaGVja2VkKTtcblxuICAgICAgICAgICAgLy8gQnJvd3NlciBTdXBwb3J0IGZvciBpbmRldGVybWluYXRlOiBodHRwczovL2Nhbml1c2UuY29tLyNzZWFyY2g9aW5kZXRlcm1pbmF0ZVxuICAgICAgICAgICAgdGhpcy5jdXN0b21DaGVja2JveC5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1pdFZhbHVlQ2hhbmdlZCgpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5jb250cm9scy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKCEhdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uQ2hhbmdlZCh2YWx1ZXMpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlQWxsQ29udHJvbFZhbHVlcyhmYWxzZSk7XG4gICAgICAgIHRoaXMucmVmcmVzaFN0YXRlKCk7XG4gICAgICAgIHRoaXMuZW1pdFZhbHVlQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEhb2JqICYmIG9iai5oYXNPd25Qcm9wZXJ0eSgnbGVuZ3RoJykgJiYgb2JqLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSXRcXCdzIGN1cnJlbnRseSBub3QgcG9zc2libGUgdG8gc2V0IHZhbHVlcy4gTWF5YmUgbGF0ZXIgdGhlcmUgaXMgYSBzb2x1dGlvbiB0byBkbyB0aGF0LicpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19