UNPKG

@axceta/angular-editor-fabric-js

Version:

> Drag-and-drop editor based on Fabricjs for Angular with multiple options

638 lines 73.8 kB
import { __decorate } from "tslib"; import { Component, ViewChild, Output, EventEmitter } from '@angular/core'; import { fabric } from 'fabric'; export var DEFAULT_CANVAS_WIDTH = 500; var FabricjsEditorComponent = /** @class */ (function () { function FabricjsEditorComponent() { this.moving = new EventEmitter(); this.modified = new EventEmitter(); this.selection = new EventEmitter(); this.cleared = new EventEmitter(); this.props = { canvasFill: '#ffffff', canvasImage: '', id: null, opacity: null, fill: null, fontSize: null, lineHeight: null, charSpacing: null, fontWeight: null, fontStyle: null, textAlign: null, fontFamily: null, TextDecoration: '' }; this.url = ''; this.size = { width: DEFAULT_CANVAS_WIDTH, height: 800 }; this.textEditor = false; this.figureEditor = false; } FabricjsEditorComponent.prototype.ngAfterViewInit = function () { var _this = this; // setup front side canvas this.canvas = new fabric.Canvas(this.htmlCanvas.nativeElement, { hoverCursor: 'pointer', selection: true, selectionBorderColor: 'blue' }); this.canvas.on({ 'object:moving': function (e) { _this.moving.emit(e); }, 'object:modified': function (e) { _this.modified.emit(e); }, 'object:selected': function (e) { _this.selection.emit(e); var selectedObject = e.target; _this.selected = selectedObject; selectedObject.hasRotatingPoint = true; selectedObject.transparentCorners = false; selectedObject.cornerColor = 'rgba(255, 87, 34, 0.7)'; _this.resetPanels(); if (selectedObject.type !== 'group' && selectedObject) { _this.getOpacity(); switch (selectedObject.type) { case 'rect': case 'circle': case 'triangle': _this.figureEditor = true; _this.getFill(); break; case 'i-text': _this.textEditor = true; _this.getLineHeight(); _this.getCharSpacing(); _this.getBold(); _this.getFill(); _this.getTextDecoration(); _this.getTextAlign(); _this.getFontFamily(); break; case 'image': break; } } }, 'selection:cleared': function (e) { _this.cleared.emit(e); _this.selected = null; _this.resetPanels(); } }); this.canvas.setWidth(this.size.width); this.canvas.setHeight(this.size.height); }; /*------------------------Block elements------------------------*/ /** * Subscribe to a FabricJS event. You can find the list of available events here: http://fabricjs.com/docs/fabric.Canvas.html * @param eventName The event name to listen to */ FabricjsEditorComponent.prototype.onEvent = function (eventName, callback) { var _a; this.canvas.on((_a = {}, _a[eventName] = callback, _a)); }; // Block "Size" FabricjsEditorComponent.prototype.changeSize = function () { this.canvas.setWidth(this.size.width); this.canvas.setHeight(this.size.height); }; // Block "Add text" FabricjsEditorComponent.prototype.addText = function () { if (this.textString) { var text = new fabric.IText(this.textString, { left: 10, top: 10, fontFamily: 'helvetica', angle: 0, fill: '#000000', scaleX: 0.5, scaleY: 0.5, fontWeight: '', hasRotatingPoint: true }); this.extend(text, this.randomId()); this.canvas.add(text); this.selectItemAfterAdded(text); this.textString = ''; } }; // Block "Add images" FabricjsEditorComponent.prototype.getImgPolaroid = function (event) { var _this = this; var el = event.target; fabric.loadSVGFromURL(el.src, function (objects, options) { var image = fabric.util.groupSVGElements(objects, options); image.set({ left: 10, top: 10, angle: 0, padding: 10, cornerSize: 10, hasRotatingPoint: true, }); _this.extend(image, _this.randomId()); _this.canvas.add(image); _this.selectItemAfterAdded(image); }); }; // Block "Upload Image" FabricjsEditorComponent.prototype.addImageOnCanvas = function (url) { var _this = this; if (url) { fabric.Image.fromURL(url, function (image) { image.set({ left: 10, top: 10, angle: 0, padding: 10, cornerSize: 10, hasRotatingPoint: true }); image.scaleToWidth(200); image.scaleToHeight(200); _this.extend(image, _this.randomId()); _this.canvas.add(image); _this.selectItemAfterAdded(image); }); } }; FabricjsEditorComponent.prototype.readUrl = function (event) { var _this = this; if (event.target.files && event.target.files[0]) { var reader = new FileReader(); reader.onload = function (readerEvent) { _this.url = readerEvent.target.result; }; reader.readAsDataURL(event.target.files[0]); } }; FabricjsEditorComponent.prototype.removeWhite = function (url) { this.url = ''; }; // Block "Add figure" /** * Add a figure to the canvas following the definition you provide. * If you passed a string to this function, please rename your implementation for addPredefinedFigure(). * @param figure Your custom figure definition * @param id (Optional) The unique id you want to give to the figure. If no ID is specified a random one will be picked. * @returns The ID of the created figure */ FabricjsEditorComponent.prototype.addFigure = function (figure, id) { var figureId = id || this.randomId(); this.extend(figure, figureId); this.canvas.add(figure); this.selectItemAfterAdded(figure); return figureId; }; /** * Add a predefined figure to the canvas. If you want to create a custom figure, please use addFigure(). * @param figure The name of the predefined figure. Can be one of the following: 'rectangle', 'square', 'triangle', 'circle'. * @param id (Optional) The unique id you want to give to the figure. If no ID is specified a random one will be picked. * @returns The ID of the created figure * TODO: Move to app.component */ FabricjsEditorComponent.prototype.addPredefinedFigure = function (figure, id) { var add; var figureId = id || this.randomId(); switch (figure) { case 'rectangle': add = new fabric.Rect({ width: 200, height: 100, left: 10, top: 10, angle: 0, fill: '#3f51b5' }); break; case 'square': add = new fabric.Rect({ width: 100, height: 100, left: 10, top: 10, angle: 0, fill: '#4caf50' }); break; case 'triangle': add = new fabric.Triangle({ width: 100, height: 100, left: 10, top: 10, fill: '#2196f3' }); break; case 'circle': add = new fabric.Circle({ radius: 50, left: 10, top: 10, fill: '#ff5722' }); break; } return this.addFigure(add, figureId); }; // TODO: Add copies of this for triangle and circle // TODO: Add JSdoc FabricjsEditorComponent.prototype.addRect = function (options, id) { var figure = new fabric.Rect(options); if (id) { figure = Object.assign(figure, { data: { id: id } }); } return this.addFigure(figure, id); }; /*Canvas*/ FabricjsEditorComponent.prototype.cleanSelect = function () { this.canvas.discardActiveObject(); }; FabricjsEditorComponent.prototype.selectItemAfterAdded = function (obj) { this.canvas.discardActiveObject(); this.canvas.setActiveObject(obj); }; FabricjsEditorComponent.prototype.setCanvasFill = function () { if (!this.props.canvasImage) { this.canvas.backgroundColor = this.props.canvasFill; this.canvas.renderAll(); } }; FabricjsEditorComponent.prototype.extend = function (obj, id) { obj.toObject = (function (toObject) { return function () { return fabric.util.object.extend(toObject.call(this), { id: id }); }; })(obj.toObject); }; FabricjsEditorComponent.prototype.setCanvasImage = function () { var self = this; if (this.props.canvasImage) { this.canvas.setBackgroundColor(new fabric.Pattern({ source: this.props.canvasImage, repeat: 'repeat' }), function () { self.props.canvasFill = ''; self.canvas.renderAll(); }); } }; FabricjsEditorComponent.prototype.randomId = function () { return Math.floor(Math.random() * 999999) + 1; }; /*------------------------Global actions for element------------------------*/ FabricjsEditorComponent.prototype.getActiveStyle = function (styleName, object) { object = object || this.canvas.getActiveObject(); if (!object) { return ''; } if (object.getSelectionStyles && object.isEditing) { return (object.getSelectionStyles()[styleName] || ''); } else { return (object[styleName] || ''); } }; FabricjsEditorComponent.prototype.setActiveStyle = function (styleName, value, object) { object = object || this.canvas.getActiveObject(); if (!object) { return; } if (object.setSelectionStyles && object.isEditing) { var style = {}; style[styleName] = value; if (typeof value === 'string') { if (value.includes('underline')) { object.setSelectionStyles({ underline: true }); } else { object.setSelectionStyles({ underline: false }); } if (value.includes('overline')) { object.setSelectionStyles({ overline: true }); } else { object.setSelectionStyles({ overline: false }); } if (value.includes('line-through')) { object.setSelectionStyles({ linethrough: true }); } else { object.setSelectionStyles({ linethrough: false }); } } object.setSelectionStyles(style); object.setCoords(); } else { if (typeof value === 'string') { if (value.includes('underline')) { object.set('underline', true); } else { object.set('underline', false); } if (value.includes('overline')) { object.set('overline', true); } else { object.set('overline', false); } if (value.includes('line-through')) { object.set('linethrough', true); } else { object.set('linethrough', false); } } object.set(styleName, value); } object.setCoords(); this.canvas.renderAll(); }; FabricjsEditorComponent.prototype.getActiveProp = function (name) { var object = this.canvas.getActiveObject(); if (!object) { return ''; } return object[name] || ''; }; FabricjsEditorComponent.prototype.setActiveProp = function (name, value) { var object = this.canvas.getActiveObject(); if (!object) { return; } object.set(name, value).setCoords(); this.canvas.renderAll(); }; FabricjsEditorComponent.prototype.clone = function () { var activeObject = this.canvas.getActiveObject(); var activeGroup = this.canvas.getActiveObjects(); if (activeObject) { var clone = void 0; switch (activeObject.type) { case 'rect': clone = new fabric.Rect(activeObject.toObject()); break; case 'circle': clone = new fabric.Circle(activeObject.toObject()); break; case 'triangle': clone = new fabric.Triangle(activeObject.toObject()); break; case 'i-text': clone = new fabric.IText('', activeObject.toObject()); break; case 'image': clone = fabric.util.object.clone(activeObject); break; } if (clone) { clone.set({ left: 10, top: 10 }); this.canvas.add(clone); this.selectItemAfterAdded(clone); } } }; /** * @deprecated Was renamed for getidOfSelectedObject */ FabricjsEditorComponent.prototype.getId = function () { return this.getIdOfSelectedObject(); }; /** * Returns the id of the currently selected object * @return Object ID */ FabricjsEditorComponent.prototype.getIdOfSelectedObject = function () { this.props.id = this.canvas.getActiveObject().toObject().id; return this.props.id; }; /** * @deprecated Was renamed for setIdOfSelectedObject */ FabricjsEditorComponent.prototype.setId = function () { this.setIdOfSelectedObject(); }; FabricjsEditorComponent.prototype.setIdOfSelectedObject = function () { var val = this.props.id; var complete = this.canvas.getActiveObject().toObject(); // FIXME: This is bad, it overrides the toObject() method. If something else modifies the object it wont be picked up. this.canvas.getActiveObject().toObject = function () { complete.id = val; return complete; }; }; /** * Loops through all canvas objects and find one matching the supplied ID. * @param id The ID to look for */ FabricjsEditorComponent.prototype.getObjectWithID = function (id) { var foundObject; this.canvas.getObjects().forEach(function (item) { if (item.id === id) { foundObject = item; } }); return foundObject; }; FabricjsEditorComponent.prototype.getOpacity = function () { this.props.opacity = this.getActiveStyle('opacity', null) * 100; }; FabricjsEditorComponent.prototype.setOpacity = function () { this.setActiveStyle('opacity', parseInt(this.props.opacity, 10) / 100, null); }; FabricjsEditorComponent.prototype.getFill = function () { this.props.fill = this.getActiveStyle('fill', null); }; FabricjsEditorComponent.prototype.setFill = function () { this.setActiveStyle('fill', this.props.fill, null); }; FabricjsEditorComponent.prototype.getLineHeight = function () { this.props.lineHeight = this.getActiveStyle('lineHeight', null); }; FabricjsEditorComponent.prototype.setLineHeight = function () { this.setActiveStyle('lineHeight', parseFloat(this.props.lineHeight), null); }; FabricjsEditorComponent.prototype.getCharSpacing = function () { this.props.charSpacing = this.getActiveStyle('charSpacing', null); }; FabricjsEditorComponent.prototype.setCharSpacing = function () { this.setActiveStyle('charSpacing', this.props.charSpacing, null); }; FabricjsEditorComponent.prototype.getFontSize = function () { this.props.fontSize = this.getActiveStyle('fontSize', null); }; FabricjsEditorComponent.prototype.setFontSize = function () { this.setActiveStyle('fontSize', parseInt(this.props.fontSize, 10), null); }; FabricjsEditorComponent.prototype.getBold = function () { this.props.fontWeight = this.getActiveStyle('fontWeight', null); }; FabricjsEditorComponent.prototype.setBold = function () { this.props.fontWeight = !this.props.fontWeight; this.setActiveStyle('fontWeight', this.props.fontWeight ? 'bold' : '', null); }; FabricjsEditorComponent.prototype.setFontStyle = function () { this.props.fontStyle = !this.props.fontStyle; if (this.props.fontStyle) { this.setActiveStyle('fontStyle', 'italic', null); } else { this.setActiveStyle('fontStyle', 'normal', null); } }; FabricjsEditorComponent.prototype.getTextDecoration = function () { this.props.TextDecoration = this.getActiveStyle('textDecoration', null); }; FabricjsEditorComponent.prototype.setTextDecoration = function (value) { var iclass = this.props.TextDecoration; if (iclass.includes(value)) { iclass = iclass.replace(RegExp(value, 'g'), ''); } else { iclass += " " + value; } this.props.TextDecoration = iclass; this.setActiveStyle('textDecoration', this.props.TextDecoration, null); }; FabricjsEditorComponent.prototype.hasTextDecoration = function (value) { return this.props.TextDecoration.includes(value); }; FabricjsEditorComponent.prototype.getTextAlign = function () { this.props.textAlign = this.getActiveProp('textAlign'); }; FabricjsEditorComponent.prototype.setTextAlign = function (value) { this.props.textAlign = value; this.setActiveProp('textAlign', this.props.textAlign); }; FabricjsEditorComponent.prototype.getFontFamily = function () { this.props.fontFamily = this.getActiveProp('fontFamily'); }; FabricjsEditorComponent.prototype.setFontFamily = function () { this.setActiveProp('fontFamily', this.props.fontFamily); }; /*System*/ FabricjsEditorComponent.prototype.removeSelected = function () { var activeObject = this.canvas.getActiveObject(); var activeGroup = this.canvas.getActiveObjects(); if (activeObject) { this.canvas.remove(activeObject); // this.textString = ''; } else if (activeGroup) { this.canvas.discardActiveObject(); var self_1 = this; activeGroup.forEach(function (object) { self_1.canvas.remove(object); }); } }; FabricjsEditorComponent.prototype.bringToFront = function () { var activeObject = this.canvas.getActiveObject(); var activeGroup = this.canvas.getActiveObjects(); if (activeObject) { activeObject.bringToFront(); activeObject.opacity = 1; } else if (activeGroup) { this.canvas.discardActiveObject(); activeGroup.forEach(function (object) { object.bringToFront(); }); } }; FabricjsEditorComponent.prototype.sendToBack = function () { var activeObject = this.canvas.getActiveObject(); var activeGroup = this.canvas.getActiveObjects(); if (activeObject) { this.canvas.sendToBack(activeObject); activeObject.sendToBack(); activeObject.opacity = 1; } else if (activeGroup) { this.canvas.discardActiveObject(); activeGroup.forEach(function (object) { object.sendToBack(); }); } }; /** * Show a confirmation to tu user before clearing the canvas. */ FabricjsEditorComponent.prototype.confirmClear = function () { if (confirm('Are you sure?')) { this.clear(); } }; /** * Clear the canvas. */ FabricjsEditorComponent.prototype.clear = function () { this.canvas.clear(); }; /** * @ */ FabricjsEditorComponent.prototype.rasterize = function () { var image = new Image(); image.src = this.canvas.toDataURL({ format: 'png' }); var w = window.open(''); w.document.write(image.outerHTML); }; FabricjsEditorComponent.prototype.rasterizeSVG = function () { var w = window.open(''); w.document.write(this.canvas.toSVG()); return 'data:image/svg+xml;utf8,' + encodeURIComponent(this.canvas.toSVG()); }; FabricjsEditorComponent.prototype.saveCanvasToJSON = function () { var json = JSON.stringify(this.canvas); localStorage.setItem('Kanvas', json); console.log('json'); console.log(json); }; FabricjsEditorComponent.prototype.importCanvasFromLocalStorage = function () { this.loadCanvas(localStorage.getItem('Kanvas')); }; FabricjsEditorComponent.prototype.importCanvasFromJson = function (json) { this.loadCanvas(json); }; FabricjsEditorComponent.prototype.importFromObject = function (object) { this.loadCanvas(object); }; FabricjsEditorComponent.prototype.loadCanvas = function (canvasData) { var _this = this; this.canvas.loadFromJSON(canvasData, function () { _this.canvas.renderAll(); }); }; /** * @deprecated Use importCanvasFromLocalStorage() instead. */ FabricjsEditorComponent.prototype.loadCanvasFromJSON = function () { this.importCanvasFromLocalStorage(); }; /** * Get the full canvas data as a Javascript object */ FabricjsEditorComponent.prototype.getCanvasData = function (propertiesToInclude) { return this.canvas.toObject(propertiesToInclude); }; FabricjsEditorComponent.prototype.rasterizeJSON = function () { this.json = JSON.stringify(this.canvas, null, 2); }; FabricjsEditorComponent.prototype.resetPanels = function () { this.textEditor = false; this.figureEditor = false; }; __decorate([ ViewChild('htmlCanvas') ], FabricjsEditorComponent.prototype, "htmlCanvas", void 0); __decorate([ Output() ], FabricjsEditorComponent.prototype, "moving", void 0); __decorate([ Output() ], FabricjsEditorComponent.prototype, "modified", void 0); __decorate([ Output() ], FabricjsEditorComponent.prototype, "selection", void 0); __decorate([ Output() ], FabricjsEditorComponent.prototype, "cleared", void 0); FabricjsEditorComponent = __decorate([ Component({ selector: 'angular-editor-fabric-js', template: "<canvas id=\"canvas\" #htmlCanvas></canvas>\n", styles: ["#canvas{border:2px dashed #ccc}"] }) ], FabricjsEditorComponent); return FabricjsEditorComponent; }()); export { FabricjsEditorComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1lZGl0b3ItZmFicmljLWpzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BheGNldGEvYW5ndWxhci1lZGl0b3ItZmFicmljLWpzLyIsInNvdXJjZXMiOlsibGliL2FuZ3VsYXItZWRpdG9yLWZhYnJpYy1qcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUE2QixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFaEMsTUFBTSxDQUFDLElBQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBT3hDO0lBcUNFO1FBbENVLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9CLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2hDLFVBQUssR0FBRztZQUNiLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsRUFBRSxFQUFFLElBQUk7WUFDUixPQUFPLEVBQUUsSUFBSTtZQUNiLElBQUksRUFBRSxJQUFJO1lBQ1YsUUFBUSxFQUFFLElBQUk7WUFDZCxVQUFVLEVBQUUsSUFBSTtZQUNoQixXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsSUFBSTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsVUFBVSxFQUFFLElBQUk7WUFDaEIsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQztRQUdLLFFBQUcsR0FBeUIsRUFBRSxDQUFDO1FBQy9CLFNBQUksR0FBUTtZQUNqQixLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLE1BQU0sRUFBRSxHQUFHO1NBQ1osQ0FBQztRQUdLLGVB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REFBK0I7SUFDOUI7UUFBVCxNQUFNLEVBQUU7OERBQWdDO0lBQy9CO1FBQVQsTUFBTSxFQUFFOzREQUE4QjtJQU41Qix1QkFBdUI7UUFMbkMsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLDBCQUEwQjtZQUNwQyx5REFBd0Q7O1NBRXpELENBQUM7T0FDVyx1QkFBdUIsQ0E0ckJuQztJQUFELDhCQUFDO0NBQUEsQUE1ckJELElBNHJCQztTQTVyQlksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmYWJyaWMgfSBmcm9tICdmYWJyaWMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9DQU5WQVNfV0lEVEggPSA1MDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FuZ3VsYXItZWRpdG9yLWZhYnJpYy1qcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLWVkaXRvci1mYWJyaWMtanMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hbmd1bGFyLWVkaXRvci1mYWJyaWMtanMuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGYWJyaWNqc0VkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdodG1sQ2FudmFzJykgcHJpdmF0ZSBodG1sQ2FudmFzOiBFbGVtZW50UmVmO1xuXG4gIEBPdXRwdXQoKSBtb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBtb2RpZmllZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIGNhbnZhczogZmFicmljLkNhbnZhcztcbiAgcHVibGljIHByb3BzID0ge1xuICAgIGNhbnZhc0ZpbGw6ICcjZmZmZmZmJyxcbiAgICBjYW52YXNJbWFnZTogJycsXG4gICAgaWQ6IG51bGwsXG4gICAgb3BhY2l0eTogbnVsbCxcbiAgICBmaWxsOiBudWxsLFxuICAgIGZvbnRTaXplOiBudWxsLFxuICAgIGxpbmVIZWlnaHQ6IG51bGwsXG4gICAgY2hhclNwYWNpbmc6IG51bGwsXG4gICAgZm9udFdlaWdodDogbnVsbCxcbiAgICBmb250U3R5bGU6IG51bGwsXG4gICAgdGV4dEFsaWduOiBudWxsLFxuICAgIGZvbn