survey-creator-angular
Version:
Use SurveyJS Creator to create or edit JSON for SurveyJS Form Library.
120 lines • 19.7 kB
JavaScript
import { Component, Input, ViewChild } from "@angular/core";
import { StringEditorViewModelBase, editableStringRendererName } from "survey-creator-core";
import { CreatorModelComponent } from "./creator-model.component";
import { AngularComponentFactory } from "survey-angular-ui";
import * as i0 from "@angular/core";
import * as i1 from "survey-angular-ui";
import * as i2 from "@angular/common";
export class StringEditorComponent extends CreatorModelComponent {
constructor(cdr, vcr, ngZone) {
super(cdr, vcr);
this.ngZone = ngZone;
this.justFocused = false;
this.onChangeHandler = () => {
this.detectChanges();
};
}
createModel() {
this.baseModel = new StringEditorViewModelBase(this.locString, this.creator);
this.baseModel.setLocString(this.locString);
this.baseModel.blurEditor = () => {
this.container.nativeElement.blur();
this.container.nativeElement.spellcheck = false;
};
this.baseModel.getEditorElement = () => this.container.nativeElement;
this.ngZone.runOutsideAngular(() => {
setTimeout(() => this.baseModel.afterRender());
});
}
get locString() {
return this.model.locStr;
}
get creator() {
return this.model.creator;
}
getModel() {
return this.baseModel;
}
getPropertiesToTrack() {
return ["creator", "locString"];
}
get placeholder() {
return this.baseModel.placeholder;
}
get contentEditable() {
return this.baseModel.contentEditable;
}
get characterCounter() {
return this.baseModel.characterCounter;
}
get showCharacterCounter() {
return this.baseModel.showCharacterCounter;
}
get getCharacterCounterClass() {
return this.baseModel.getCharacterCounterClass;
}
get className() {
return this.baseModel.className(this.locString.renderedHtml);
}
get errorText() {
return this.baseModel.errorText;
}
onBlur(event) {
this.container.nativeElement.spellcheck = false;
this.locString.__isEditing = false;
this.justFocused = false;
this.baseModel.onBlur(event);
return this.baseModel.errorText;
}
onFocus(event) {
this.baseModel.onFocus(event);
this.justFocused = true;
}
onPaste(event) {
this.baseModel.onPaste(event);
}
done(event) {
this.baseModel.done(event);
this.locString.__isEditing = false;
}
edit(event) {
this.container.nativeElement.focus();
this.locString.__isEditing = true;
this.baseModel.onClick(event);
}
ngOnInit() {
var _a;
super.ngOnInit();
(_a = this.locString) === null || _a === void 0 ? void 0 : _a.onStringChanged.add(this.onChangeHandler);
}
ngAfterViewInit() {
if (this.locString.__isEditing) {
this.container.nativeElement.focus();
}
}
ngOnDestroy() {
var _a;
this.baseModel.blurEditor = undefined;
this.baseModel.getEditorElement = undefined;
this.baseModel.dispose();
(_a = this.locString) === null || _a === void 0 ? void 0 : _a.onStringChanged.remove(this.onChangeHandler);
super.ngOnDestroy();
}
}
StringEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: StringEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
StringEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: StringEditorComponent, selector: "svc-string-edtior", inputs: { model: "model" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #template>\n <span [class]=\"className\">\n <span class=\"svc-string-editor__content\">\n <div class=\"svc-string-editor__border svc-string-editor__border--hover\"></div>\n <div class=\"svc-string-editor__border svc-string-editor__border--focus\"></div>\n <span class=\"svc-string-editor__input\">\n <span role=\"textbox\" *ngIf=\"!locString.hasHtml\" class=\"sv-string-editor\" spellcheck=\"false\"\n (focus)=\"onFocus($event)\" (paste)=\"onPaste($event)\" (blur)=\"onBlur($event)\" (input)=\"baseModel.onInput($event)\" (keydown)=\"baseModel.onKeyDown($event)\" (keyup)=\"baseModel.onKeyUp($event)\" (compositionstart)=\"baseModel.onCompositionStart($event)\" (compositionend)=\"baseModel.onCompositionEnd($event)\" (mouseup)=\"baseModel.onMouseUp($event)\" (click)=\"edit($event)\" [textContent]=\"locString.renderedHtml\" [attr.aria-placeholder]=\"placeholder\" [attr.contenteditable]=\"contentEditable\" #container></span>\n <span role=\"textbox\" *ngIf=\"locString.hasHtml\" class=\"sv-string-editor sv-string-editor--html\" spellcheck=\"false\"\n (focus)=\"onFocus($event)\" (blur)=\"onBlur($event)\" (keydown)=\"baseModel.onKeyDown($event)\" (keyup)=\"baseModel.onKeyUp($event)\" (compositionstart)=\"baseModel.onCompositionStart($event)\" (compositionend)=\"baseModel.onCompositionEnd($event)\" (mouseup)=\"baseModel.onMouseUp($event)\"\n (click)=\"edit($event)\" [attr.aria-placeholder]=\"placeholder\" [attr.contenteditable]=\"contentEditable\" [innerHtml]=\"locString.renderedHtml | safeHtml\" #container></span>\n <sv-ng-character-counter *ngIf=\"showCharacterCounter\" [counter]=\"characterCounter\" [remainingCharacterCounter]=\"getCharacterCounterClass\"></sv-ng-character-counter>\n </span>\n </span>\n <span *ngIf=\"errorText\" class=\"svc-string-editor__error\">{{errorText}}</span>\n </span>\n</ng-template>", styles: [":host { display: none; }"], components: [{ type: i1.CharacterCounterComponent, selector: "sv-ng-character-counter", inputs: ["counter", "remainingCharacterCounter"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "safeHtml": i1.SafeHtmlPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: StringEditorComponent, decorators: [{
type: Component,
args: [{
selector: "svc-string-edtior",
templateUrl: "./string-editor.component.html",
styles: [":host { display: none; }"]
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i0.NgZone }]; }, propDecorators: { model: [{
type: Input
}], container: [{
type: ViewChild,
args: ["container"]
}] } });
AngularComponentFactory.Instance.registerComponent(editableStringRendererName, StringEditorComponent);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyaW5nLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi9zcmMvc3RyaW5nLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxLQUFLLEVBQVUsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUVwSSxPQUFPLEVBQUUseUJBQXlCLEVBQXNCLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFPNUQsTUFBTSxPQUFPLHFCQUFzQixTQUFRLHFCQUFnRDtJQUt6RixZQUFZLEdBQXNCLEVBQUUsR0FBcUIsRUFBVSxNQUFjO1FBQy9FLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFEaUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUh6RSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQW9EckMsb0JBQWUsR0FBRyxHQUFTLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQTtJQWpERCxDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FB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b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE5nWm9uZSwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nLCBDaGFyYWN0ZXJDb3VudGVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTdHJpbmdFZGl0b3JWaWV3TW9kZWxCYXNlLCBTdXJ2ZXlDcmVhdG9yTW9kZWwsIGVkaXRhYmxlU3RyaW5nUmVuZGVyZXJOYW1lIH0gZnJvbSBcInN1cnZleS1jcmVhdG9yLWNvcmVcIjtcbmltcG9ydCB7IENyZWF0b3JNb2RlbENvbXBvbmVudCB9IGZyb20gXCIuL2NyZWF0b3ItbW9kZWwuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBbmd1bGFyQ29tcG9uZW50RmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktYW5ndWxhci11aVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic3ZjLXN0cmluZy1lZHRpb3JcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9zdHJpbmctZWRpdG9yLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlczogW1wiOmhvc3QgeyBkaXNwbGF5OiBub25lOyB9XCJdXG59KVxuZXhwb3J0IGNsYXNzIFN0cmluZ0VkaXRvckNvbXBvbmVudCBleHRlbmRzIENyZWF0b3JNb2RlbENvbXBvbmVudDxTdHJpbmdFZGl0b3JWaWV3TW9kZWxCYXNlPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwdWJsaWMgYmFzZU1vZGVsITogU3RyaW5nRWRpdG9yVmlld01vZGVsQmFzZTtcbiAgcHJpdmF0ZSBqdXN0Rm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtb2RlbCE6IGFueTtcbiAgQFZpZXdDaGlsZChcImNvbnRhaW5lclwiKSBjb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgdmNyOiBWaWV3Q29udGFpbmVyUmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XG4gICAgc3VwZXIoY2RyLCB2Y3IpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVNb2RlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmJhc2VNb2RlbCA9IG5ldyBTdHJpbmdFZGl0b3JWaWV3TW9kZWxCYXNlKHRoaXMubG9jU3RyaW5nLCB0aGlzLmNyZWF0b3IpO1xuICAgIHRoaXMuYmFzZU1vZGVsLnNldExvY1N0cmluZyh0aGlzLmxvY1N0cmluZyk7XG4gICAgdGhpcy5iYXNlTW9kZWwuYmx1ckVkaXRvciA9ICgpID0+IHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zcGVsbGNoZWNrID0gZmFsc2U7XG4gICAgfTtcbiAgICB0aGlzLmJhc2VNb2RlbC5nZXRFZGl0b3JFbGVtZW50ID0gKCkgPT4gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYmFzZU1vZGVsLmFmdGVyUmVuZGVyKCkpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jU3RyaW5nKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5sb2NTdHI7XG4gIH1cbiAgcHVibGljIGdldCBjcmVhdG9yKCk6IFN1cnZleUNyZWF0b3JNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuY3JlYXRvcjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0TW9kZWwoKTogU3RyaW5nRWRpdG9yVmlld01vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQcm9wZXJ0aWVzVG9UcmFjaygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcImNyZWF0b3JcIiwgXCJsb2NTdHJpbmdcIl07XG4gIH1cbiAgcHVibGljIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5wbGFjZWhvbGRlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbnRlbnRFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlTW9kZWwuY29udGVudEVkaXRhYmxlO1xuICB9XG4gIHB1YmxpYyBnZXQgY2hhcmFjdGVyQ291bnRlcigpOiBDaGFyYWN0ZXJDb3VudGVyIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlTW9kZWwuY2hhcmFjdGVyQ291bnRlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dDaGFyYWN0ZXJDb3VudGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5zaG93Q2hhcmFjdGVyQ291bnRlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IGdldENoYXJhY3RlckNvdW50ZXJDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5nZXRDaGFyYWN0ZXJDb3VudGVyQ2xhc3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5jbGFzc05hbWUodGhpcy5sb2NTdHJpbmcucmVuZGVyZWRIdG1sKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5lcnJvclRleHQ7XG4gIH1cbiAgb25DaGFuZ2VIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIHB1YmxpYyBvbkJsdXIoZXZlbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zcGVsbGNoZWNrID0gZmFsc2U7XG4gICAgKDxhbnk+dGhpcy5sb2NTdHJpbmcpLl9faXNFZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5qdXN0Rm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZU1vZGVsLm9uQmx1cihldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmVycm9yVGV4dDtcbiAgfVxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5iYXNlTW9kZWwub25Gb2N1cyhldmVudCk7XG4gICAgdGhpcy5qdXN0Rm9jdXNlZCA9IHRydWU7XG4gIH1cbiAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuYmFzZU1vZGVsLm9uUGFzdGUoZXZlbnQpO1xuICB9XG4gIHB1YmxpYyBkb25lKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJhc2VNb2RlbC5kb25lKGV2ZW50KTtcbiAgICAoPGFueT50aGlzLmxvY1N0cmluZykuX19pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZWRpdChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICg8YW55PnRoaXMubG9jU3RyaW5nKS5fX2lzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5iYXNlTW9kZWwub25DbGljayhldmVudCk7XG4gIH1cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLmxvY1N0cmluZz8ub25TdHJpbmdDaGFuZ2VkLmFkZCh0aGlzLm9uQ2hhbmdlSGFuZGxlcik7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICgoPGFueT50aGlzLmxvY1N0cmluZykuX19pc0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5iYXNlTW9kZWwuYmx1ckVkaXRvciA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgdGhpcy5iYXNlTW9kZWwuZ2V0RWRpdG9yRWxlbWVudCA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgdGhpcy5iYXNlTW9kZWwuZGlzcG9zZSgpO1xuICAgIHRoaXMubG9jU3RyaW5nPy5vblN0cmluZ0NoYW5nZWQucmVtb3ZlKHRoaXMub25DaGFuZ2VIYW5kbGVyKTtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICB9XG59XG5cbkFuZ3VsYXJDb21wb25lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyQ29tcG9uZW50KGVkaXRhYmxlU3RyaW5nUmVuZGVyZXJOYW1lLCBTdHJpbmdFZGl0b3JDb21wb25lbnQpOyIsIjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGU+XG4gIDxzcGFuIFtjbGFzc109XCJjbGFzc05hbWVcIj5cbiAgICA8c3BhbiBjbGFzcz1cInN2Yy1zdHJpbmctZWRpdG9yX19jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3ZjLXN0cmluZy1lZGl0b3JfX2JvcmRlciBzdmMtc3RyaW5nLWVkaXRvcl9fYm9yZGVyLS1ob3ZlclwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ZjLXN0cmluZy1lZGl0b3JfX2JvcmRlciBzdmMtc3RyaW5nLWVkaXRvcl9fYm9yZGVyLS1mb2N1c1wiPjwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN2Yy1zdHJpbmctZWRpdG9yX19pbnB1dFwiPlxuICAgICAgICAgIDxzcGFuIHJvbGU9XCJ0ZXh0Ym94XCIgKm5nSWY9XCIhbG9jU3RyaW5nLmhhc0h0bWxcIiBjbGFzcz1cInN2LXN0cmluZy1lZGl0b3JcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCIgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCIgIChpbnB1dCk9XCJiYXNlTW9kZWwub25JbnB1dCgkZXZlbnQpXCIgKGtleWRvd24pPVwiYmFzZU1vZGVsLm9uS2V5RG93bigkZXZlbnQpXCIgKGtleXVwKT1cImJhc2VNb2RlbC5vbktleVVwKCRldmVudClcIiAoY29tcG9zaXRpb25zdGFydCk9XCJiYXNlTW9kZWwub25Db21wb3NpdGlvblN0YXJ0KCRldmVudClcIiAoY29tcG9zaXRpb25lbmQpPVwiYmFzZU1vZGVsLm9uQ29tcG9zaXRpb25FbmQoJGV2ZW50KVwiIChtb3VzZXVwKT1cImJhc2VNb2RlbC5vbk1vdXNlVXAoJGV2ZW50KVwiIChjbGljayk9XCJlZGl0KCRldmVudClcIiBbdGV4dENvbnRlbnRdPVwibG9jU3RyaW5nLnJlbmRlcmVkSHRtbFwiIFthdHRyLmFyaWEtcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbYXR0ci5jb250ZW50ZWRpdGFibGVdPVwiY29udGVudEVkaXRhYmxlXCIgI2NvbnRhaW5lcj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gcm9sZT1cInRleHRib3hcIiAqbmdJZj1cImxvY1N0cmluZy5oYXNIdG1sXCIgY2xhc3M9XCJzdi1zdHJpbmctZWRpdG9yIHN2LXN0cmluZy1lZGl0b3ItLWh0bWxcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiIChrZXlkb3duKT1cImJhc2VNb2RlbC5vbktleURvd24oJGV2ZW50KVwiIChrZXl1cCk9XCJiYXNlTW9kZWwub25LZXlVcCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uc3RhcnQpPVwiYmFzZU1vZGVsLm9uQ29tcG9zaXRpb25TdGFydCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uZW5kKT1cImJhc2VNb2RlbC5vbkNvbXBvc2l0aW9uRW5kKCRldmVudClcIiAobW91c2V1cCk9XCJiYXNlTW9kZWwub25Nb3VzZVVwKCRldmVudClcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0KCRldmVudClcIiBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2F0dHIuY29udGVudGVkaXRhYmxlXT1cImNvbnRlbnRFZGl0YWJsZVwiIFtpbm5lckh0bWxdPVwibG9jU3RyaW5nLnJlbmRlcmVkSHRtbCB8IHNhZmVIdG1sXCIgI2NvbnRhaW5lcj48L3NwYW4+XG4gICAgICAgICAgPHN2LW5nLWNoYXJhY3Rlci1jb3VudGVyICpuZ0lmPVwic2hvd0NoYXJhY3RlckNvdW50ZXJcIiBbY291bnRlcl09XCJjaGFyYWN0ZXJDb3VudGVyXCIgW3JlbWFpbmluZ0NoYXJhY3RlckNvdW50ZXJdPVwiZ2V0Q2hhcmFjdGVyQ291bnRlckNsYXNzXCI+PC9zdi1uZy1jaGFyYWN0ZXItY291bnRlcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImVycm9yVGV4dFwiIGNsYXNzPVwic3ZjLXN0cmluZy1lZGl0b3JfX2Vycm9yXCI+e3tlcnJvclRleHR9fTwvc3Bhbj5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT4iXX0=