@js-sugar/angular-bootstrap
Version:
JS-Sugar Bootstrap components for Angular
104 lines • 18.4 kB
JavaScript
import { HostListener } from '@angular/core';
import { Component, Input, ContentChild, Optional, HostBinding, Inject, ElementRef } from '@angular/core';
import { FormControl, NgControl } from '@angular/forms';
import { Locale, LOCALE } from '@js-sugar/angular';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
export class FormFieldComponent {
constructor(_renderer, _form, _localSpecifier) {
this._renderer = _renderer;
this._form = _form;
this._localSpecifier = _localSpecifier;
this.showErrors = true;
this.showRequiredMarker = true;
this.showSubscripts = true;
this._isRequired = false;
}
get firstLocalizedError() { return this._firstLocalizedError; }
get localizedErrors() { return this._localizedErrors; }
get touched() { return this._ngControl.touched; }
get dirty() { return this._ngControl.dirty; }
get isRequired() { return this._isRequired; }
_onFocusOut() { this._validate(); }
ngOnInit() {
if (!this._ngControl) {
throw Error('FormFieldComponent requires a NgControl');
}
if (this._localSpecifier) {
if (this._localSpecifier instanceof Locale) {
this._locale = this._localSpecifier;
}
else {
this._locale = this._localSpecifier.get();
this._localeChangeSubscription = this._localSpecifier.change.subscribe(e => this._locale = e.newLocale);
}
}
}
ngAfterContentInit() {
this._isRequired = this._isRequiredField();
this._statusChangeSubscription = this._ngControl.statusChanges.subscribe(change => {
if (this.dirty || this.touched) {
this._validate();
}
});
}
_validate() {
const invalid = this._ngControl.status === 'INVALID';
if (invalid && this._locale) {
this._localizedErrors = this._locale.translateErrors(this._ngControl.errors);
const firstKey = Object.keys(this._localizedErrors)[0];
this._firstLocalizedError = this._localizedErrors[firstKey];
}
else {
this._localizedErrors = this._firstLocalizedError = undefined;
}
this._renderer.addClass(this._ngControlElement.nativeElement, invalid ? 'is-invalid' : 'is-valid');
this._renderer.removeClass(this._ngControlElement.nativeElement, invalid ? 'is-valid' : 'is-invalid');
}
_isRequiredField() {
const validator = this._ngControl?.validator;
const errors = validator && validator(new FormControl(null));
return errors != null && errors['required'] === true;
}
ngOnDestroy() {
this._localeChangeSubscription?.unsubscribe();
this._statusChangeSubscription?.unsubscribe();
}
}
FormFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: FormFieldComponent, deps: [{ token: i0.Renderer2 }, { token: i1.NgForm, optional: true }, { token: LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
FormFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: FormFieldComponent, selector: "jss-form-field, jss-field, jssb-form-field, jssb-field", inputs: { label: "label", hint: "hint", showErrors: "showErrors", showRequiredMarker: "showRequiredMarker", showSubscripts: "showSubscripts" }, host: { listeners: { "focusout": "_onFocusOut()" }, properties: { "class.jss-required-form-field": "this.isRequired" } }, queries: [{ propertyName: "_ngControl", first: true, predicate: NgControl, descendants: true, static: true }, { propertyName: "_ngControlElement", first: true, predicate: NgControl, descendants: true, read: ElementRef, static: true }], exportAs: ["jssFormField"], ngImport: i0, template: "<label *ngIf=\"label\" class=\"jss-form-field-label\">\r\n {{label}}\r\n <span *ngIf=\"isRequired && showRequiredMarker\" class=\"jss-form-field-required-marker\">*</span>\r\n</label>\r\n\r\n<div class=\"input-group\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<small *ngIf=\"showSubscripts\" class=\"jss-form-field-subscript\">\r\n <span *ngIf=\"showErrors && firstLocalizedError && (touched || dirty); else hintTemplate\" class=\"jss-form-field-error text-danger\">\r\n {{firstLocalizedError.text}}\r\n </span>\r\n <ng-template #hintTemplate>\r\n <span *ngIf=\"hint\" class=\"jss-form-field-hint\">{{hint}}</span>\r\n </ng-template>\r\n</small>\r\n", styles: [":host{display:block}.jss-form-field-subscript{display:block;height:1.5em;line-height:1.5em}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: FormFieldComponent, decorators: [{
type: Component,
args: [{ selector: 'jss-form-field, jss-field, jssb-form-field, jssb-field', exportAs: 'jssFormField', template: "<label *ngIf=\"label\" class=\"jss-form-field-label\">\r\n {{label}}\r\n <span *ngIf=\"isRequired && showRequiredMarker\" class=\"jss-form-field-required-marker\">*</span>\r\n</label>\r\n\r\n<div class=\"input-group\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<small *ngIf=\"showSubscripts\" class=\"jss-form-field-subscript\">\r\n <span *ngIf=\"showErrors && firstLocalizedError && (touched || dirty); else hintTemplate\" class=\"jss-form-field-error text-danger\">\r\n {{firstLocalizedError.text}}\r\n </span>\r\n <ng-template #hintTemplate>\r\n <span *ngIf=\"hint\" class=\"jss-form-field-hint\">{{hint}}</span>\r\n </ng-template>\r\n</small>\r\n", styles: [":host{display:block}.jss-form-field-subscript{display:block;height:1.5em;line-height:1.5em}\n"] }]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.NgForm, decorators: [{
type: Optional
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [LOCALE]
}] }]; }, propDecorators: { label: [{
type: Input
}], hint: [{
type: Input
}], showErrors: [{
type: Input
}], showRequiredMarker: [{
type: Input
}], showSubscripts: [{
type: Input
}], _ngControl: [{
type: ContentChild,
args: [NgControl, { static: true }]
}], _ngControlElement: [{
type: ContentChild,
args: [NgControl, { static: true, read: ElementRef }]
}], isRequired: [{
type: HostBinding,
args: ['class.jss-required-form-field']
}], _onFocusOut: [{
type: HostListener,
args: ['focusout']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWJvb3RzdHJhcC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1maWVsZC9mb3JtLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWZpZWxkL2Zvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQW9CLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFxQixVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDMUosT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQVUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLEVBQTRCLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFTN0YsTUFBTSxPQUFPLGtCQUFrQjtJQXFDN0IsWUFDVSxTQUFvQixFQUNSLEtBQWEsRUFDRyxlQUF5QztRQUZyRSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ1IsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNHLG9CQUFlLEdBQWYsZUFBZSxDQUEwQjtRQXJDdEUsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDMUIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFHdkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFrQzVCLENBQUM7SUF4QkQsSUFBSSxtQkFBbUIsS0FBSyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFNL0QsSUFBSSxlQUFlLEtBQUssT0FB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UUFDN0QsT0FBTyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDdkQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMseUJBQXlCLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ2hELENBQUM7OytHQTNGVSxrQkFBa0IsaUZBd0NQLE1BQU07bUdBeENqQixrQkFBa0IsZ1pBTWYsU0FBUyxrR0FDVCxTQUFTLDJCQUF3QixVQUFVLHVFQ25CM0QsOHBCQWlCQTsyRkRMYSxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBQ0Usd0RBQXdELFlBQ3hELGNBQWM7OzBCQTJDckIsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxNQUFNOzRDQXZDbkIsS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUM2QyxVQUFVO3NCQUE1RCxZQUFZO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQzRCLGlCQUFpQjtzQkFBckYsWUFBWTt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBMEJULFVBQVU7c0JBQTNELFdBQVc7dUJBQUMsK0JBQStCO2dCQUVWLFdBQVc7c0JBQTVDLFlBQVk7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDb250ZW50Q2hpbGQsIEFmdGVyQ29udGVudEluaXQsIE9wdGlvbmFsLCBIb3N0QmluZGluZywgSW5qZWN0LCBPbkluaXQsIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBOZ0NvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTG9jYWxlLCBMb2NhbGVQcm92aWRlciwgTE9DQUxFLCBMb2NhbGl6ZWRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdAanMtc3VnYXIvYW5ndWxhcic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdqc3MtZm9ybS1maWVsZCwganNzLWZpZWxkLCBqc3NiLWZvcm0tZmllbGQsIGpzc2ItZmllbGQnLFxyXG4gIGV4cG9ydEFzOiAnanNzRm9ybUZpZWxkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1maWVsZC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhpbnQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2hvd0Vycm9ycyA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd1JlcXVpcmVkTWFya2VyID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93U3Vic2NyaXB0cyA9IHRydWU7XHJcbiAgQENvbnRlbnRDaGlsZChOZ0NvbnRyb2wsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgX25nQ29udHJvbCE6IE5nQ29udHJvbDtcclxuICBAQ29udGVudENoaWxkKE5nQ29udHJvbCwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSBfbmdDb250cm9sRWxlbWVudCE6IEVsZW1lbnRSZWY7XHJcbiAgcHJpdmF0ZSBfaXNSZXF1aXJlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2xvY2FsZT86IExvY2FsZTtcclxuICBwcml2YXRlIF9sb2NhbGl6ZWRFcnJvcnM/OiB7IFtrZXk6IHN0cmluZ106IExvY2FsaXplZFZhbGlkYXRpb25FcnJvciB9O1xyXG4gIHByaXZhdGUgX2ZpcnN0TG9jYWxpemVkRXJyb3I/OiBMb2NhbGl6ZWRWYWxpZGF0aW9uRXJyb3I7XHJcbiAgcHJpdmF0ZSBfc3RhdHVzQ2hhbmdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2xvY2FsZUNoYW5nZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZmlyc3QgKGxvY2FsaXplZCkgZXJyb3Igb2YgdGhlIGNvbnRyb2wgXHJcbiAgICovXHJcbiAgZ2V0IGZpcnN0TG9jYWxpemVkRXJyb3IoKSB7IHJldHVybiB0aGlzLl9maXJzdExvY2FsaXplZEVycm9yOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgbG9jYWxpemVkIHZhbGlkYXRpb24gZXJyb3JzIG9mIHRoZSBjb250cm9sIFxyXG4gICAqIElmIG5vIGxvY2FsZSBpcyBwcm92aWRlZCBpbiB0aGUgcHJvamVjdCwgcmV0dXJucyB1bmRlZmluZWQuXHJcbiAgICovXHJcbiAgZ2V0IGxvY2FsaXplZEVycm9ycygpIHsgcmV0dXJuIHRoaXMuX2xvY2FsaXplZEVycm9yczsgfVxyXG5cclxuICAvKiogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIHRvdWNoZWQuICovXHJcbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9uZ0NvbnRyb2wudG91Y2hlZCE7IH1cclxuXHJcbiAgLyoqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCBpcyBkaXJ0eS4gKi9cclxuICBnZXQgZGlydHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9uZ0NvbnRyb2wuZGlydHkhOyB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmb3JtLWZpZWxkIGlzIHJlcXVpcmVkLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4gKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmpzcy1yZXF1aXJlZC1mb3JtLWZpZWxkJykgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc1JlcXVpcmVkOyB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JykgcHJpdmF0ZSBfb25Gb2N1c091dCgpIHsgdGhpcy5fdmFsaWRhdGUoKTsgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9mb3JtOiBOZ0Zvcm0sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KExPQ0FMRSkgcHJpdmF0ZSBfbG9jYWxTcGVjaWZpZXI/OiBMb2NhbGUgfCBMb2NhbGVQcm92aWRlcixcclxuICApIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl9uZ0NvbnRyb2wpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0Zvcm1GaWVsZENvbXBvbmVudCByZXF1aXJlcyBhIE5nQ29udHJvbCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9sb2NhbFNwZWNpZmllcikge1xyXG4gICAgICBpZiAodGhpcy5fbG9jYWxTcGVjaWZpZXIgaW5zdGFuY2VvZiBMb2NhbGUpIHtcclxuICAgICAgICB0aGlzLl9sb2NhbGUgPSB0aGlzLl9sb2NhbFNwZWNpZmllcjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9sb2NhbGUgPSB0aGlzLl9sb2NhbFNwZWNpZmllci5nZXQoKTtcclxuICAgICAgICB0aGlzLl9sb2NhbGVDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLl9sb2NhbFNwZWNpZmllci5jaGFuZ2Uuc3Vic2NyaWJlKGUgPT4gdGhpcy5fbG9jYWxlID0gZS5uZXdMb2NhbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pc1JlcXVpcmVkID0gdGhpcy5faXNSZXF1aXJlZEZpZWxkKCk7XHJcbiAgICB0aGlzLl9zdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLl9uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcyEuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmRpcnR5IHx8IHRoaXMudG91Y2hlZCkge1xyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmFsaWRhdGUoKSB7XHJcbiAgICBjb25zdCBpbnZhbGlkID0gdGhpcy5fbmdDb250cm9sLnN0YXR1cyA9PT0gJ0lOVkFMSUQnO1xyXG4gICAgaWYgKGludmFsaWQgJiYgdGhpcy5fbG9jYWxlKSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsaXplZEVycm9ycyA9IHRoaXMuX2xvY2FsZS50cmFuc2xhdGVFcnJvcnModGhpcy5fbmdDb250cm9sLmVycm9ycyk7XHJcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gT2JqZWN0LmtleXModGhpcy5fbG9jYWxpemVkRXJyb3JzKVswXTtcclxuICAgICAgdGhpcy5fZmlyc3RMb2NhbGl6ZWRFcnJvciA9IHRoaXMuX2xvY2FsaXplZEVycm9yc1tmaXJzdEtleV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9sb2NhbGl6ZWRFcnJvcnMgPSB0aGlzLl9maXJzdExvY2FsaXplZEVycm9yID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRoaXMuX25nQ29udHJvbEVsZW1lbnQubmF0aXZlRWxlbWVudCwgaW52YWxpZCA/ICdpcy1pbnZhbGlkJyA6ICdpcy12YWxpZCcpO1xyXG4gICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fbmdDb250cm9sRWxlbWVudC5uYXRpdmVFbGVtZW50LCBpbnZhbGlkID8gJ2lzLXZhbGlkJyA6ICdpcy1pbnZhbGlkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1JlcXVpcmVkRmllbGQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLl9uZ0NvbnRyb2w/LnZhbGlkYXRvcjtcclxuICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRvciAmJiB2YWxpZGF0b3IobmV3IEZvcm1Db250cm9sKG51bGwpKTtcclxuICAgIHJldHVybiBlcnJvcnMgIT0gbnVsbCAmJiBlcnJvcnNbJ3JlcXVpcmVkJ10gPT09IHRydWU7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvY2FsZUNoYW5nZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX3N0YXR1c0NoYW5nZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cImpzcy1mb3JtLWZpZWxkLWxhYmVsXCI+XHJcbiAge3tsYWJlbH19XHJcbiAgPHNwYW4gKm5nSWY9XCJpc1JlcXVpcmVkICYmIHNob3dSZXF1aXJlZE1hcmtlclwiIGNsYXNzPVwianNzLWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyXCI+Kjwvc3Bhbj5cclxuPC9sYWJlbD5cclxuXHJcbjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxyXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuPC9kaXY+XHJcblxyXG48c21hbGwgKm5nSWY9XCJzaG93U3Vic2NyaXB0c1wiIGNsYXNzPVwianNzLWZvcm0tZmllbGQtc3Vic2NyaXB0XCI+XHJcbiAgPHNwYW4gKm5nSWY9XCJzaG93RXJyb3JzICYmIGZpcnN0TG9jYWxpemVkRXJyb3IgJiYgKHRvdWNoZWQgfHwgZGlydHkpOyBlbHNlIGhpbnRUZW1wbGF0ZVwiIGNsYXNzPVwianNzLWZvcm0tZmllbGQtZXJyb3IgdGV4dC1kYW5nZXJcIj5cclxuICAgIHt7Zmlyc3RMb2NhbGl6ZWRFcnJvci50ZXh0fX1cclxuICA8L3NwYW4+XHJcbiAgPG5nLXRlbXBsYXRlICNoaW50VGVtcGxhdGU+XHJcbiAgICA8c3BhbiAqbmdJZj1cImhpbnRcIiBjbGFzcz1cImpzcy1mb3JtLWZpZWxkLWhpbnRcIj57e2hpbnR9fTwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L3NtYWxsPlxyXG4iXX0=