From e1b807f3edba96dd0604a8b6fa9e6080ad995cf6 Mon Sep 17 00:00:00 2001 From: disty Date: Tue, 19 Nov 2024 17:39:13 +0200 Subject: [PATCH] add canvas / masking / inpainting functionality --- README.md | 5 +- __init__.py | 2 +- pyproject.toml | 2 +- web/core/content.html | 6 +- web/core/css/main.css | 421 +++++- .../js/common/components/CanvasComponent.js | 147 ++ .../components/canvas/CanvasControlsPlugin.js | 240 ++++ .../common/components/canvas/CanvasLoader.js | 467 ++++++ .../common/components/canvas/CanvasManager.js | 117 ++ .../common/components/canvas/CanvasPlugin.js | 13 + .../canvas/CanvasScaleForSavePlugin.js | 225 +++ .../components/canvas/CustomBrushPlugin.js | 824 +++++++++++ .../common/components/canvas/EventEmitter.js | 24 + .../components/canvas/ImageAdderPlugin.js | 129 ++ .../canvas/ImageCompareSliderPlugin.js | 571 ++++++++ .../components/canvas/ImageLoaderPlugin.js | 479 +++++++ .../components/canvas/MaskBrushPlugin.js | 1271 +++++++++++++++++ .../components/canvas/UndoRedoPlugin.js | 362 +++++ .../components/canvas/fabric.5.2.4.min.js | 1 + web/core/js/common/scripts/componentTypes.js | 15 +- web/core/main.js | 68 +- web/core/media/git/flow_5.jpg | Bin 0 -> 300675 bytes web/core/media/ui/paintree.png | Bin 0 -> 14457 bytes 23 files changed, 5355 insertions(+), 34 deletions(-) create mode 100644 web/core/js/common/components/CanvasComponent.js create mode 100644 web/core/js/common/components/canvas/CanvasControlsPlugin.js create mode 100644 web/core/js/common/components/canvas/CanvasLoader.js create mode 100644 web/core/js/common/components/canvas/CanvasManager.js create mode 100644 web/core/js/common/components/canvas/CanvasPlugin.js create mode 100644 web/core/js/common/components/canvas/CanvasScaleForSavePlugin.js create mode 100644 web/core/js/common/components/canvas/CustomBrushPlugin.js create mode 100644 web/core/js/common/components/canvas/EventEmitter.js create mode 100644 web/core/js/common/components/canvas/ImageAdderPlugin.js create mode 100644 web/core/js/common/components/canvas/ImageCompareSliderPlugin.js create mode 100644 web/core/js/common/components/canvas/ImageLoaderPlugin.js create mode 100644 web/core/js/common/components/canvas/MaskBrushPlugin.js create mode 100644 web/core/js/common/components/canvas/UndoRedoPlugin.js create mode 100644 web/core/js/common/components/canvas/fabric.5.2.4.min.js create mode 100644 web/core/media/git/flow_5.jpg create mode 100644 web/core/media/ui/paintree.png diff --git a/README.md b/README.md index 18869a8..0685877 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ Flow is currently in the early stages of development, so expect bugs and ongoing + + @@ -104,7 +106,8 @@ http://127.0.0.1:8188/flow - Enhanced Customization Options ### Feature Support -- [ ] Inpainting Functionality +- [x] Canvas / Masking / Inpainting Functionality +- - [ ] Improved Canvas / Masking / Inpainting Functionality - [ ] Enhanced Media Handling - [x] Live Preview - [ ] Prompt Tracking diff --git a/__init__.py b/__init__.py index c901f33..4a27190 100644 --- a/__init__.py +++ b/__init__.py @@ -38,7 +38,7 @@ NODE_DISPLAY_NAME_MAPPINGS: Dict[str, str] = {} APP_CONFIGS: List[AppConfig] = [] APP_NAME: str = "Flow" -APP_VERSION: str = "0.2.3" +APP_VERSION: str = "0.3.0" PURPLE = "\033[38;5;129m" RESET = "\033[0m" FLOWMSG = f"{PURPLE}Flow{RESET}" diff --git a/pyproject.toml b/pyproject.toml index 62e64ba..5fe447c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui-disty-flow" description = "Flow is a custom node designed to provide a more user-friendly interface for ComfyUI by acting as an alternative user interface for running workflows. It is not a replacement for workflow creation.\nFlow is currently in the early stages of development, so expect bugs and ongoing feature enhancements. With your support and feedback, Flow will settle into a steady stream." -version = "0.2.3" +version = "0.3.0" license = {file = "LICENSE"} [project.urls] diff --git a/web/core/content.html b/web/core/content.html index 5aec955..2b0c433 100644 --- a/web/core/content.html +++ b/web/core/content.html @@ -1,13 +1,17 @@
-
+
+
+
diff --git a/web/core/css/main.css b/web/core/css/main.css index cc04068..bfbb339 100644 --- a/web/core/css/main.css +++ b/web/core/css/main.css @@ -174,7 +174,7 @@ header .right { display: flex; flex: 1; text-align: left; - overflow-y: auto; + overflow: hidden; } .content div { @@ -194,6 +194,10 @@ header .right { flex: 1.1; background-color: var(--color-background); } +.content .right-col { + flex: 0.5; + background-color: var(--color-background); +} .content .mid-col { flex: 2.5; @@ -201,11 +205,64 @@ header .right { border-right: 1px dashed var(--color-border); justify-content: space-around; min-height: 100%; + padding: 10px; + /* padding: 4px 6px; */ + } -.content .right-col { - flex: 0.5; - background-color: var(--color-background); +.canvas-container { + display: flex; + justify-content: center; + align-items: center; + /* height: 100% !important; */ + /* width: 100% !important; */ + /* background: var(--color-button-primary-active); */ +} + +#canvasContainer:focus { + border: 2px solid #4A90E2; +} + +#imageCanvas { + /* width: 100%; */ + /* height: 100%; */ + display: block; + /* position: absolute; */ + /* top: 0; */ + /* left: 0; */ + /* background: green; */ + overflow: hidden; + padding: 0; + +} + +/* Green dashed border around the canvas wrapper */ +#canvasWrapper { + /* position: relative; */ + flex: 1; + /* width: 100%; */ + /* height: 100%; */ + overflow: hidden; + /* background-color: var(--color-background-secondary); */ + border: 1px dashed var(--color-border); + box-sizing: border-box; + /* width: 800px; */ + /* height: 600px; */ + position: relative; + margin: 0; /* Remove default margins */ + padding: 10px; +} + +.brush-ui-container { + display: flex; + flex-direction: column; + gap: 10px; + padding: 10px; + background-color: var(--color-button-primary-text-hover); + color: var(--color-primary-text); + border: 1px solid var(--color-border); + border-radius: 5px; + margin-bottom: 10px; } #control button { @@ -676,7 +733,7 @@ select option:hover { height: 100%; position: relative; object-fit: contain; - border: 2px dashed var(--color-border); + border: 1px dashed var(--color-border); border-radius: 5px; } #batch-images-container { @@ -1546,4 +1603,356 @@ html:not(.css-loading) body { .multi-component-container { background: var(--color-background-secondary); margin-bottom: 4px; -} \ No newline at end of file +} +.plugin-ui-container { + background: var(--color-background-secondary); + padding: 4px; + /* position: absolute; */ + /* top: 100px; */ + /* left: 19%; */ + z-index: 1000; + transition: width 0.3s, height 0.3s; + display: flex; + flex-direction: row; + /* justify-content: space-between; */ + align-items: stretch; + /* border: 1px dashed var(--color-border); */ + margin: 5px; +} +/* Style for the plugin UI container */ +#pluginUIContainer { + /* padding: 10px; */ + /* background-color: var(--color-background-secondary); */ + /* Adjust as needed */ +} + +/* Parent container for the canvas */ +/* #canvasContainer { + position: relative; + width: 100%; + height: calc(100% - 60px); + border: 1px solid #ccc; + box-sizing: border-box; +} */ + +/* Make the canvas fill its parent container */ +/* #imageCanvas { + width: 100% !important; + height: 100% !important; + display: block; + background: var(--color-progress-background); + +} */ + + /* CSS Isolation: Prefix all classes with 'cbp-' */ + .cbp-brush-ui-container { + background-color: var(--color-background); + user-select: none; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + font-family: Arial, sans-serif; + font-size: 14px; + color: var(--color-text); + position: absolute; + top: 100px; + left: 19%; + z-index: 1000; + transition: width 0.3s, height 0.3s; + display: flex; + flex-direction: column; + align-items: stretch; + + border: 1px dashed var(--color-border); + } + .cbp-brush-ui-header { + cursor: move; + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + background-color: var(--color-header-background); + border-bottom: 1px dashed var(--color-border); + border-top-left-radius: 8px; + border-top-right-radius: 8px; + } + .cbp-brush-ui-title { + font-weight: bold; + } + .cbp-brush-ui-minimize-btn { + background: none; + border: none; + font-size: 18px; + cursor: pointer; + width: 24px; + height: 24px; + padding: 0; + color: var(--color-text); + display: none; + } + .cbp-brush-ui-content { + padding: 10px; + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + box-sizing: border-box; + } + .cbp-brush-ui-content label { + display: flex; + flex-direction: column; + font-size: 12px; + gap: 4px; + } + .cbp-brush-ui-content input[type="range"], + .cbp-brush-ui-content input[type="number"], + .cbp-brush-ui-content input[type="color"], + .cbp-brush-ui-content button { + width: 100%; + height: 30px; + box-sizing: border-box; + padding: 4px; + /* border: 1px solid #ccc; */ + /* border-radius: 4px; */ + font-size: 14px; + } + + .cbp-brush-ui-toggle-btn { + flex: 2; + display: flex; + justify-content: center; + align-items: center; + background: var(--color-button-primary); + border: none; + cursor: pointer; + padding: 4px !important; + height: 40px !important; + width: auto; + } + #cbp-color-picker { + flex: 1; + height: auto; + + } + #cbp-color-picker:hover { + border: 1px dashed var(--color-button-primary-text); + } + #cbp-toggle-btn-icon { + width: 70%; + height: 100%; + /* display: block; Ensures the SVG takes up space */ + } + #cbp-toggle-drawing-mode-btn.active { + /* background: var(--color-button-primary-text); */ + border: 1px dashed var(--color-button-primary-text) !important; + } + #ui-toggle-btn.active { + background: var(--color-button-primary-text); + /* border: 1px dashed var(--color-button-secondary-text-active) !important; */ + + } + .cbp-brush-ui-color-picker { + flex: 1; + display: flex; + flex-direction: row; + gap: 10px; + + width: 100%; + height: 100%; + } + + .cbp-brush-ui-content input[type="color"] { + padding: 0; + /* border: none; */ + background-color: var(--color-background); + outline: none; + -webkit-appearance: none; /* Removes default styling in WebKit browsers */ + border-bottom: 1px dashed var(--color-border); + + } + + /* Remove the color swatch border in WebKit browsers */ + .cbp-brush-ui-content input[type="color"]::-webkit-color-swatch-wrapper { + padding: 0; + border: none; + } + + .cbp-brush-ui-content input[type="color"]::-webkit-color-swatch { + border: none; + } + + /* Remove the color swatch border in Firefox */ + .cbp-brush-ui-content input[type="color"]::-moz-color-swatch { + border: none; + } + .cbp-brush-ui-minimized .cbp-brush-ui-content { + display: none; + } + .cbp-brush-ui-full { + width: 155px; + height: auto; + } + .cbp-brush-ui-mini { + width: 80px; + height: auto; + } + .cbp-brush-ui-minimized { + width: 60px; + height: auto; + } + .cbp-brush-ui-input-group { + display: flex; + align-items: center; + gap: 10px; + } + .cbp-brush-ui-input-group input { + flex: 1; + } + .cbp-hidden-cursor { + cursor: none !important; + } + + + + + .mbp-container * { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .mbp-container { + /* --mbp-primary: var(--color-button-primary); + --mbp-primary-hover: var(--color-button-primary-hover); + --mbp-bg: var(--color-background-secondary); + --mbp-border: var(--color-border); + --mbp-text: var(--color-primary-text); + --mbp-icon: var(--color-primary); */ + padding: 0.5rem; + } + + .mbp-header { + display: flex; + gap: 0.5rem; + margin-bottom: 0.75rem; + } + + .mbp-header .mbp-select { + flex: 1; + } + + .mbp-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + border: 1px solid var(--mbp-border); + background: var(--color-button-primary) ; + /* border-radius: 0.375rem; */ + cursor: pointer; + transition: all 0.2s; + color: var(--mbp-icon); + min-width: 36px; + height: 36px; + width: 100%; + } + + .mbp-button:hover { + background: var(--color-button-primary-hover); + color: var(--mbp-primary); + } + + .mbp-button svg { + width: 1.25rem; + height: 1.25rem; + } + + .mbp-select { + padding: 0.5rem; + border: none; + background: var(--color-background); + color: var(--mbp-text); + cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 0.5rem center; + background-size: 1.25rem; + padding-right: 2.5rem; + height: 36px; + outline: none; + } + .mbp-select:hover { + /* background: var(--color-button-primary-hover); */ + border-top: solid 1px var(--color-button-primary-hover); + } + + .mbp-toggle-wrapper { + display: flex; + align-items: center; + gap: 0.75rem; + margin: 0.75rem 0; + padding: 0.25rem 0; + display: none !important; + + } + + .mbp-toggle { + position: relative; + display: inline-block; + width: 3.5rem; + height: 1.75rem; + margin: 0; + } + + .mbp-toggle input { + opacity: 0; + width: 0; + height: 0; + margin: 0; + } + + .mbp-toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + /* background-color: #e5e7eb; */ + transition: .3s; + border-radius: 2rem; + } + + .mbp-toggle-slider:before { + position: absolute; + content: ""; + height: 1.25rem; + width: 1.25rem; + left: 0.25rem; + bottom: 0.25rem; + /* background-color: white; */ + transition: .3s; + border-radius: 50%; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + } + + .mbp-toggle input:checked + .mbp-toggle-slider { + background-color: var(--mbp-primary); + } + + .mbp-toggle input:checked + .mbp-toggle-slider:before { + transform: translateX(1.75rem); + } + + .mbp-label { + font-size: 0.75rem; + color: var(--mbp-text); + user-select: none; + padding: 0 6px; + } + + .mbp-button-group { + display: flex; + gap: 0.5rem; + margin: 0.75rem 0; + + } \ No newline at end of file diff --git a/web/core/js/common/components/CanvasComponent.js b/web/core/js/common/components/CanvasComponent.js new file mode 100644 index 0000000..8fb3fbb --- /dev/null +++ b/web/core/js/common/components/CanvasComponent.js @@ -0,0 +1,147 @@ +import { showSpinner, hideSpinner } from './utils.js'; +import { updateWorkflow } from './workflowManager.js'; + +function dataURLToBlob(dataURL) { + const [header, data] = dataURL.split(','); + const mimeMatch = header.match(/:(.*?);/); + if (!mimeMatch) { + throw new Error('Invalid data URL.'); + } + const mime = mimeMatch[1]; + const binary = atob(data); + const array = []; + for (let i = 0; i < binary.length; i++) { + array.push(binary.charCodeAt(i)); + } + return new Blob([new Uint8Array(array)], { type: mime }); +} + +async function processAndUpload(items, getImage, uploadDescription, defaultErrorMessage, successMessagePrefix, workflow) { + for (const item of items) { + const { id, label, nodePath } = item; + + try { + showSpinner(); + + const imageDataURL = getImage(); + // console.log(`${uploadDescription} Data URL for ${id}:`, imageDataURL); + if (!imageDataURL) { + throw new Error(`${uploadDescription} data is unavailable.`); + } + + const blob = dataURLToBlob(imageDataURL); + + const formData = new FormData(); + formData.append('image', blob, `${id}.png`); + + const response = await fetch('/upload/image', { + method: 'POST', + body: formData, + }); + + if (!response.ok) { + let errorMessage = defaultErrorMessage; + try { + const errorResponse = await response.json(); + errorMessage = errorResponse.message || errorMessage; + } catch (e) { + console.error('Failed to parse error response:', e); + } + throw new Error(errorMessage); + } + + let result; + try { + result = await response.json(); + console.log(`Server Response for ${id}:`, result); + } catch (e) { + throw new Error('Invalid JSON response from server.'); + } + + console.log(`${successMessagePrefix} ${id} uploaded successfully:`, result); + + if (result && result.name) { + updateWorkflow(workflow, nodePath, result.name); + console.log(`Workflow updated at nodePath ${nodePath} with imageUrl: ${result.name}`); + } else { + throw new Error('Server response did not include imageUrl or imageName.'); + } + } catch (error) { + console.error(`Error uploading ${uploadDescription.toLowerCase()} ${id}:`, error); + alert(`Error uploading ${label}: ${error.message}`); + } finally { + hideSpinner(); + } + } +} + +export default async function CanvasComponent(flowConfig, workflow, canvasLoader) { + if (flowConfig.canvasOutputs && Array.isArray(flowConfig.canvasOutputs)) { + await processAndUpload( + flowConfig.canvasOutputs, + () => canvasLoader.getCanvasOutImage(), + 'Canvas Output Image', + 'Canvas upload failed.', + 'Canvas', + workflow + ); + } + + // **Process canvasLoadedImages and canvasSelectedMaskOutputs (Case 1)** + if ( + flowConfig.canvasLoadedImages && Array.isArray(flowConfig.canvasLoadedImages) && + flowConfig.canvasSelectedMaskOutputs && Array.isArray(flowConfig.canvasSelectedMaskOutputs) + ) { + await processAndUpload( + flowConfig.canvasLoadedImages, + () => canvasLoader.getOriginalImage(), + 'Original Image', + 'Original image upload failed.', + 'Original Image', + workflow + ); + + await processAndUpload( + flowConfig.canvasSelectedMaskOutputs, + () => canvasLoader.getSelectedMaskAlphaOnImage(), + 'Selected Mask Alpha Image', + 'Selected mask alpha image upload failed.', + 'Selected Mask Alpha Image', + workflow + ); + } + + if (flowConfig.canvasMaskOutputs && Array.isArray(flowConfig.canvasMaskOutputs)) { + await processAndUpload( + flowConfig.canvasMaskOutputs, + () => canvasLoader.getMaskImage(), + 'Mask Image', + 'Mask image upload failed.', + 'Mask Image', + workflow + ); + } + + if (flowConfig.canvasAlphaOutputs && Array.isArray(flowConfig.canvasAlphaOutputs)) { + await processAndUpload( + flowConfig.canvasAlphaOutputs, + () => canvasLoader.getMaskAlphaOnImage(), + 'Mask Alpha Image', + 'Mask alpha image upload failed.', + 'Mask Alpha Image', + workflow + ); + } + + // **Process canvasSelectedMaskOutputs (New Functionality for Case 1)** + if (flowConfig.canvasSelectedMaskOutputs && Array.isArray(flowConfig.canvasSelectedMaskOutputs)) { + await processAndUpload( + flowConfig.canvasSelectedMaskOutputs, + () => canvasLoader.getSelectedMaskAlphaOnImage(), + 'Selected Mask Alpha Image', + 'Selected mask alpha image upload failed.', + 'Selected Mask Alpha Image', + workflow + ); + } +} diff --git a/web/core/js/common/components/canvas/CanvasControlsPlugin.js b/web/core/js/common/components/canvas/CanvasControlsPlugin.js new file mode 100644 index 0000000..831ac8c --- /dev/null +++ b/web/core/js/common/components/canvas/CanvasControlsPlugin.js @@ -0,0 +1,240 @@ +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class CanvasControlsPlugin extends CanvasPlugin { + constructor(options = {}) { + super('CanvasControlsPlugin'); + + this.zoomIn = this.zoomIn.bind(this); + this.zoomOut = this.zoomOut.bind(this); + this.resetZoom = this.resetZoom.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseMove = this.onMouseMove.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onAfterRender = this.onAfterRender.bind(this); + this.arraysEqual = this.arraysEqual.bind(this); + + this.canvasManager = null; + this.canvas = null; + this.isPanning = false; + this.lastPosX = 0; + this.lastPosY = 0; + this.lastTransform = null; + } + + init(canvasManager) { + this.canvasManager = canvasManager; + this.canvas = canvasManager.canvas; + + this.createUI(); + + this.attachEventListeners(); + + this.lastTransform = this.canvas.viewportTransform.slice(); + } + + createUI() { + const styleSheet = document.createElement('style'); + styleSheet.textContent = ` + .cc-container * { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .cc-container { + display: inline-flex; + gap: 0.5rem; + padding: 0.5rem; + /* background: var(--color-background); */ + /* border: 1px dashed var(--color-border); */ + user-select: none; + } + + .cc-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + background: var(--color-button-primary); + border: none; + cursor: pointer; + transition: all 0.2s; + color: var(--color-primary-text); + min-width: 36px; + height: 36px; + } + + .cc-button:hover { + background: var(--color-button-primary-hover); + } + + .cc-button svg { + width: 1.25rem; + height: 1.25rem; + } + + .cc-button[data-active="true"] { + border: 1px dashed var(--color-button-secondary-text-active); + } + + .cc-divider { + width: 1px; + border-left: 1px dashed var(--color-border); + margin: 0 0.25rem; + display: none; + } + #panBtn { + display: none; + } + `; + document.head.appendChild(styleSheet); + + const temp = document.createElement('div'); + temp.innerHTML = ` +
+ + + + +
+ + + +
+ + +
+ `; + + this.uiContainer = temp.firstElementChild; + this.zoomInBtn = this.uiContainer.querySelector('#zoomInBtn'); + this.zoomOutBtn = this.uiContainer.querySelector('#zoomOutBtn'); + this.resetZoomBtn = this.uiContainer.querySelector('#resetZoomBtn'); + this.panBtn = this.uiContainer.querySelector('#panBtn'); + + const pluginUIContainer = document.getElementById('pluginUIContainer'); + if (pluginUIContainer) { + pluginUIContainer.appendChild(this.uiContainer); + } else { + console.warn('Element with id "pluginUIContainer" not found.'); + } + + this.updatePanButtonState = (isPanning) => { + this.panBtn.dataset.active = isPanning; + }; + } + + attachEventListeners() { + this.zoomInBtn.addEventListener('click', this.zoomIn); + this.zoomOutBtn.addEventListener('click', this.zoomOut); + this.resetZoomBtn.addEventListener('click', this.resetZoom); + + this.canvas.on('mouse:down', this.onMouseDown); + this.canvas.on('mouse:move', this.onMouseMove); + this.canvas.on('mouse:up', this.onMouseUp); + this.canvas.on('mouse:out', this.onMouseUp); + + this.canvas.on('after:render', this.onAfterRender); + } + + detachEventListeners() { + this.zoomInBtn.removeEventListener('click', this.zoomIn); + this.zoomOutBtn.removeEventListener('click', this.zoomOut); + this.resetZoomBtn.removeEventListener('click', this.resetZoom); + + this.canvas.off('mouse:down', this.onMouseDown); + this.canvas.off('mouse:move', this.onMouseMove); + this.canvas.off('mouse:up', this.onMouseUp); + this.canvas.off('mouse:out', this.onMouseUp); + + this.canvas.off('after:render', this.onAfterRender); + } + + arraysEqual(a, b) { + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } + return true; + } + + onAfterRender() { + const currentTransform = this.canvas.viewportTransform; + if (!this.arraysEqual(currentTransform, this.lastTransform)) { + this.lastTransform = currentTransform.slice(); + this.canvasManager.emit('viewport:changed', { + transform: this.canvas.viewportTransform + }); + } + } + + zoomIn() { + let zoom = this.canvas.getZoom(); + zoom *= 1.1; + if (zoom > 20) zoom = 20; + this.canvas.zoomToPoint({ x: this.canvas.width / 2, y: this.canvas.height / 2 }, zoom); + } + + zoomOut() { + let zoom = this.canvas.getZoom(); + zoom /= 1.1; + this.canvas.zoomToPoint({ x: this.canvas.width / 2, y: this.canvas.height / 2 }, zoom); + } + + resetZoom() { + this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]); + } + + onMouseDown(opt) { + const evt = opt.e; + if (evt.altKey) { + this.isPanning = true; + this.lastPosX = evt.clientX; + this.lastPosY = evt.clientY; + this.canvas.setCursor('move'); + } + } + + onMouseMove(opt) { + if (this.isPanning) { + const e = opt.e; + const deltaX = e.clientX - this.lastPosX; + const deltaY = e.clientY - this.lastPosY; + const vpt = this.canvas.viewportTransform; + const zoom = this.canvas.getZoom(); + vpt[4] += deltaX / zoom; + vpt[5] += deltaY / zoom; + this.canvas.requestRenderAll(); + this.lastPosX = e.clientX; + this.lastPosY = e.clientY; + } + } + + onMouseUp(opt) { + this.isPanning = false; + this.canvas.setCursor('default'); + } + + destroy() { + if (this.uiContainer && this.uiContainer.parentNode) { + this.uiContainer.parentNode.removeChild(this.uiContainer); + } + + this.detachEventListeners(); + } +} \ No newline at end of file diff --git a/web/core/js/common/components/canvas/CanvasLoader.js b/web/core/js/common/components/canvas/CanvasLoader.js new file mode 100644 index 0000000..99ca1b6 --- /dev/null +++ b/web/core/js/common/components/canvas/CanvasLoader.js @@ -0,0 +1,467 @@ +import { CanvasManager } from './CanvasManager.js'; +import { ImageLoaderPlugin } from './ImageLoaderPlugin.js'; +import { ImageCompareSliderPlugin } from './ImageCompareSliderPlugin.js'; +import { MaskBrushPlugin } from './MaskBrushPlugin.js'; +import { CanvasControlsPlugin } from './CanvasControlsPlugin.js'; +import { CustomBrushPlugin } from './CustomBrushPlugin.js'; +import { UndoRedoPlugin } from './UndoRedoPlugin.js'; +import { ImageAdderPlugin } from './ImageAdderPlugin.js'; +import { CanvasScaleForSavePlugin } from './CanvasScaleForSavePlugin.js'; + +const loadFabric = () => { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.src = '/core/js/common/components/canvas/fabric.5.2.4.min.js'; + script.async = false; + script.onload = () => { + console.log('Fabric.js loaded successfully'); + resolve(); + }; + script.onerror = () => { + console.error('Failed to load Fabric.js'); + reject(new Error('Fabric.js failed to load')); + }; + document.head.appendChild(script); + }); +}; + +// Floating toolbar functionality - move +const styleSheet = document.createElement('style'); +styleSheet.textContent = ` + .plugin-ui-container { + position: relative; + display: flex; + gap: 0.5rem; + padding: 0.5rem; + padding-right: calc(0.5rem + 36px); + transition: background 0.3s ease, border 0.3s ease, box-shadow 0.3s ease; + will-change: transform; + } + + .plugin-ui-container.floating { + position: fixed; + bottom: 25%; + /* left: 16%px; */ + z-index: 1000; + background: var(--color-background); + border: 1px dashed var(--color-border); + cursor: move; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + } + + .dock-toggle { + position: absolute; + right: 0; + top: 0; + height: 100%; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + background: var(--color-button-primary); + border: none; + border-left: 1px dashed var(--color-border); + cursor: pointer; + transition: all 0.2s; + color: var(--color-primary-text); + width: 36px; + } + + .plugin-ui-container.floating .dock-toggle { + position: relative; + height: 36px; + margin-left: 0.5rem; + border: none; + } + + .dock-toggle:hover { + background: var(--color-button-primary-hover); + } + + .dock-toggle svg { + width: 1.25rem; + height: 1.25rem; + transition: transform 0.2s ease; + } + + .dock-toggle:hover svg { + transform: scale(1.1); + } + + .plugin-ui-container.floating .dock-toggle:hover svg { + transform: scale(1.1); + } +`; +document.head.appendChild(styleSheet); + +function initializeFloating() { + const container = document.getElementById('pluginUIContainer'); + const dockButton = document.createElement('button'); + dockButton.className = 'dock-toggle'; + dockButton.title = 'Make toolbar floating'; + dockButton.innerHTML = ` + + + + `; + container.appendChild(dockButton); + + let isDragging = false; + let currentX; + let currentY; + let initialX; + let initialY; + let xOffset = 0; + let yOffset = 0; + let originalPosition = null; + let lastFrameTime = 0; + const frameRate = 1000 / 120; + + function updateDockIcon(isFloating) { + dockButton.title = isFloating ? 'Dock toolbar' : 'Make toolbar floating'; + dockButton.innerHTML = isFloating + ? ` + + ` + : ` + + `; + } + + function updateDockButtonPosition(isFloating) { + if (isFloating) { + container.appendChild(dockButton); + } else { + container.insertBefore(dockButton, container.firstChild); + } + } + + function startDragging(e) { + if (container.classList.contains('floating') && e.target !== dockButton) { + isDragging = true; + initialX = e.clientX - xOffset; + initialY = e.clientY - yOffset; + container.style.transition = 'none'; + document.body.style.cursor = 'move'; + } + } + + function drag(e) { + if (isDragging) { + e.preventDefault(); + + const currentTime = performance.now(); + if (currentTime - lastFrameTime < frameRate) return; + + currentX = e.clientX - initialX; + currentY = e.clientY - initialY; + xOffset = currentX; + yOffset = currentY; + container.style.transform = `translate3d(${currentX}px, ${currentY}px, 0)`; + + lastFrameTime = currentTime; + } + } + + function stopDragging() { + if (isDragging) { + isDragging = false; + container.style.transition = ''; + document.body.style.cursor = ''; + } + } + + function toggleFloating() { + const isFloating = container.classList.toggle('floating'); + updateDockIcon(isFloating); + updateDockButtonPosition(isFloating); + + if (isFloating) { + originalPosition = { + parent: container.parentNode, + nextSibling: container.nextSibling, + styles: { + position: container.style.position, + top: container.style.top, + left: container.style.left, + transform: container.style.transform, + zIndex: container.style.zIndex + } + }; + + container.addEventListener('mousedown', startDragging); + window.addEventListener('mousemove', drag); + window.addEventListener('mouseup', stopDragging); + window.addEventListener('mouseleave', stopDragging); + + container.style.transform = `translate3d(${xOffset}px, ${yOffset}px, 0)`; + } else { + container.removeEventListener('mousedown', startDragging); + window.removeEventListener('mousemove', drag); + window.removeEventListener('mouseup', stopDragging); + window.removeEventListener('mouseleave', stopDragging); + + container.style.transform = ''; + container.style.position = ''; + container.style.top = ''; + container.style.left = ''; + container.style.zIndex = ''; + xOffset = 0; + yOffset = 0; + } + } + + dockButton.addEventListener('click', toggleFloating); + + container.addEventListener('selectstart', (e) => { + if (isDragging) e.preventDefault(); + }); + + return function cleanup() { + container.removeEventListener('mousedown', startDragging); + window.removeEventListener('mousemove', drag); + window.removeEventListener('mouseup', stopDragging); + window.removeEventListener('mouseleave', stopDragging); + dockButton.removeEventListener('click', toggleFloating); + container.removeEventListener('selectstart', (e) => { + if (isDragging) e.preventDefault(); + }); + if (dockButton.parentNode) { + dockButton.parentNode.removeChild(dockButton); + } + }; +} +const cleanupFloating = initializeFloating(); +// Floating toolbar functionality + +export class CanvasLoader { + constructor(canvasId, flowConfig) { + this.canvasId = canvasId; + this.flowConfig = flowConfig; + this.isInitialized = false; + this.initPromise = this.init(); + } + + determineCanvasOptions(flowConfig) { + const options = { + canvasControls: true, + imageLoader: false, + undo: true, + maskBrush: false, + customBrush: false, + imageCompareSlider: false, + imageAdder: false, + canvasScaleForSave: false, + }; + + // **Case 1**: Load maskBrush if canvasLoadedImages and canvasSelectedMaskOutputs are present + if (flowConfig.canvasLoadedImages && Array.isArray(flowConfig.canvasLoadedImages) && flowConfig.canvasLoadedImages.length > 0 && + flowConfig.canvasSelectedMaskOutputs && Array.isArray(flowConfig.canvasSelectedMaskOutputs) && flowConfig.canvasSelectedMaskOutputs.length > 0) { + options.maskBrush = true; + options.imageLoader = true; + } + + // **Case 2**: Load customBrush if canvasOutputs are present + if (flowConfig.canvasOutputs && Array.isArray(flowConfig.canvasOutputs) && flowConfig.canvasOutputs.length > 0) { + options.customBrush = true; + options.imageLoader = true; + options.canvasScaleForSave = true; + + + } + + return options; + } + + async init() { + try { + this.options = this.determineCanvasOptions(this.flowConfig); + + + if (!this.options.maskBrush && !this.options.customBrush) { + console.warn("No relevant fields in flowConfig. Canvas will not be displayed or initialized."); + this.hideCanvasUI(); + return; + } + + await loadFabric(); + + const canvasWrapper = document.getElementById('canvasWrapper'); + const pluginUIContainer = document.getElementById('pluginUIContainer'); + + if (!canvasWrapper || !pluginUIContainer) { + throw new Error('Required DOM elements (canvasWrapper or pluginUIContainer) are missing.'); + } + + canvasWrapper.style.display = 'block'; + pluginUIContainer.style.display = 'block'; + + this.canvasManager = new CanvasManager({ canvasId: this.canvasId }); + + if (this.options.imageLoader) { + const imageLoaderPlugin = new ImageLoaderPlugin({ + mode: 'Single' // Set to 'Single' or 'Multi' as needed + }); + this.canvasManager.registerPlugin(imageLoaderPlugin); + } + + if (this.options.canvasControls) { + const canvasControlsPlugin = new CanvasControlsPlugin(); + this.canvasManager.registerPlugin(canvasControlsPlugin); + } + + if (this.options.undo) { + const undoRedoPlugin = new UndoRedoPlugin({ + maxHistory: 100, + }); + this.canvasManager.registerPlugin(undoRedoPlugin); + } + if (this.options.canvasScaleForSave) { + const canvasScaleForSave = new CanvasScaleForSavePlugin({ + defaultScale: 1, + showDownloadButton: true, + }); + this.canvasManager.registerPlugin(canvasScaleForSave); + } + if (this.options.maskBrush) { + const maskBrushPlugin = new MaskBrushPlugin({ + brushSize: 75, + brushOpacity: 0.5, + cursorOutlineType: 'dashed', + cursorPrimaryColor: '#000000', + cursorSecondaryColor: '#FFFFFF', + cursorLineWidth: 1, + cursorFill: true, + useBrushColorPrimaryColor: true, + brushColor: '#FF0000', + useBrushColorForCursorRing: false, + }); + this.canvasManager.registerPlugin(maskBrushPlugin); + } + + if (this.options.customBrush) { + const customBrushPlugin = new CustomBrushPlugin({ + brushSize: 25, + brushOpacity: 1, + cursorOutlineType: 'dotted', + cursorPrimaryColor: '#000000', + cursorSecondaryColor: '#FFFFFF', + cursorLineWidth: 1, + cursorFill: true, + useBrushColorPrimaryColor: true, + brushColor: '#64D813', + useBrushColorForCursorRing: false, + }); + this.canvasManager.registerPlugin(customBrushPlugin); + } + + if (this.options.imageCompareSlider) { + const imageCompareSliderPlugin = new ImageCompareSliderPlugin({ + sliderColor: '#570d7b', + sliderWidth: 2, + handleRadius: 18, + handleStrokeWidth: 4, + handleStrokeColor: '#fff', + topMargin: 23, + bottomMargin: 23, + mode: 'Pairs' // 'Pairs', 'Replace', or 'Multi' + }); + this.canvasManager.registerPlugin(imageCompareSliderPlugin); + } + + if (this.options.imageAdder) { + const imageAdderPlugin = new ImageAdderPlugin(); + this.canvasManager.registerPlugin(imageAdderPlugin); + } + + console.log('All selected plugins registered successfully'); + + this.isInitialized = true; + } catch (error) { + console.error('Error initializing CanvasLoader:', error); + this.hideCanvasUI(); + } + } + + hideCanvasUI() { + const canvasWrapper = document.getElementById('canvasWrapper'); + const pluginUIContainer = document.getElementById('pluginUIContainer'); + + if (canvasWrapper) { + canvasWrapper.style.display = 'none'; + } + + if (pluginUIContainer) { + pluginUIContainer.style.display = 'none'; + } + } + + getOriginalImage(id) { + const imageLoaderPlugin = this.canvasManager.getPluginByName('ImageLoaderPlugin'); + if (imageLoaderPlugin && imageLoaderPlugin.getOriginalImage) { + return imageLoaderPlugin.getOriginalImage(id); + } else { + console.error('ImageLoaderPlugin is not registered or does not have getOriginalImage.'); + return null; + } + } + + getMaskImage() { + const maskBrushPlugin = this.canvasManager.getPluginByName('MaskBrushPlugin'); + if (maskBrushPlugin) { + const exportFunction = maskBrushPlugin.getExportFunction('saveAllMasksCombined'); + if (exportFunction) { + return exportFunction(); + } else { + console.error('Failed to get export function for saveMaskAlphaOnImage.'); + return null; + } + } + return null; + } + + getMaskAlphaOnImage() { + const maskBrushPlugin = this.canvasManager.getPluginByName('MaskBrushPlugin'); + if (maskBrushPlugin) { + const exportFunction = maskBrushPlugin.getExportFunction('saveAllMasksCombinedAlphaOnImage'); + if (exportFunction) { + return exportFunction(); + } else { + console.error('Failed to get export function for saveMaskAlphaOnImage.'); + return null; + } + } + return null; + } + + getSelectedMaskAlphaOnImage() { + const maskBrushPlugin = this.canvasManager.getPluginByName('MaskBrushPlugin'); + if (maskBrushPlugin) { + const selectedOption = maskBrushPlugin.saveOptionsSelect.value; + const exportFunction = maskBrushPlugin.getExportFunction(selectedOption); + if (exportFunction) { + return exportFunction(); + } else { + console.error('Unknown save option selected in MaskBrushPlugin.'); + return null; + } + } + } + + getCanvasOutImage() { + return this.getCanvasImage(); + } + + getCanvasImage() { + if (this.canvasManager && this.canvasManager.getCanvasImage) { + return this.canvasManager.getCanvasImage(); + } else { + console.error('CanvasManager is not initialized or getCanvasImage method is unavailable.'); + return null; + } + } + +} diff --git a/web/core/js/common/components/canvas/CanvasManager.js b/web/core/js/common/components/canvas/CanvasManager.js new file mode 100644 index 0000000..ca00eaa --- /dev/null +++ b/web/core/js/common/components/canvas/CanvasManager.js @@ -0,0 +1,117 @@ +import { EventEmitter } from './EventEmitter.js'; +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class CanvasManager extends EventEmitter { + constructor(options = {}) { + super(); + this.canvasId = options.canvasId || 'imageCanvas'; + this.canvas = new fabric.Canvas(this.canvasId, { + selection: false, + defaultCursor: 'default', + preserveObjectStacking: true + }); + + this.plugins = new Set(); + + this.init(); + + window.addEventListener('resize', this.resizeCanvas.bind(this)); + + this.observeContainerResize(); + + this.scaleMultiplier = 1; + + this.on('canvas:scaleChanged', this.onScaleChanged.bind(this)); + } + + init() { + this.resizeCanvas(); + this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]); + } + + resizeCanvas() { + const container = document.getElementById('canvasWrapper'); + if (!container) { + console.warn('canvasWrapper element not found in the DOM.'); + return; + } + + const { clientWidth, clientHeight } = container; + + this.canvas.setWidth(clientWidth); + this.canvas.setHeight(clientHeight); + + this.canvas.renderAll(); + + this.emit('canvas:resized', { width: clientWidth, height: clientHeight }); + } + + observeContainerResize() { + const container = document.getElementById('canvasWrapper'); + if (!container || typeof ResizeObserver === 'undefined') return; + + const resizeObserver = new ResizeObserver(() => { + this.resizeCanvas(); + }); + + resizeObserver.observe(container); + } + + registerPlugin(plugin) { + if (!(plugin instanceof CanvasPlugin)) { + throw new Error('Plugin must extend the CanvasPlugin class.'); + } + plugin.init(this); + this.plugins.add(plugin); + console.log(`CanvasManager: Registered plugin ${plugin.name}`); + } + + unregisterPlugin(plugin) { + if (this.plugins.has(plugin)) { + plugin.destroy(); + this.plugins.delete(plugin); + console.log(`CanvasManager: Unregistered plugin ${plugin.name}`); + } + } + + getCanvasImage() { + return this.canvas.toDataURL({ + format: 'png', + multiplier: this.scaleMultiplier + }); + } + + getPluginByName(name) { + for (let plugin of this.plugins) { + if (plugin.name === name) { + return plugin; + } + } + return null; + } + + onHandleSave() { + const maskBrushPlugin = this.getPluginByName('MaskBrushPlugin'); + if (maskBrushPlugin) { + const selectedOption = maskBrushPlugin.saveOptionsSelect.value; + this.emit('save:trigger', selectedOption); + } else { + console.error('MaskBrushPlugin is not registered. Cannot handle save.'); + } + } + + onScaleChanged(data) { + this.scaleMultiplier = data.scale; + console.log(`CanvasManager: Scale multiplier set to ${this.scaleMultiplier}`); + } + + destroy() { + window.removeEventListener('resize', this.resizeCanvas.bind(this)); + + this.plugins.forEach(plugin => plugin.destroy()); + this.plugins.clear(); + + this.canvas.dispose(); + console.log('CanvasManager destroyed'); + } +} diff --git a/web/core/js/common/components/canvas/CanvasPlugin.js b/web/core/js/common/components/canvas/CanvasPlugin.js new file mode 100644 index 0000000..9f7fb68 --- /dev/null +++ b/web/core/js/common/components/canvas/CanvasPlugin.js @@ -0,0 +1,13 @@ +export class CanvasPlugin { + constructor(name) { + this.name = name; + } + + init(canvasManager) { + throw new Error('init() must be implemented by the plugin.'); + } + + destroy() { + throw new Error('destroy() must be implemented by the plugin.'); + } +} diff --git a/web/core/js/common/components/canvas/CanvasScaleForSavePlugin.js b/web/core/js/common/components/canvas/CanvasScaleForSavePlugin.js new file mode 100644 index 0000000..289a0c4 --- /dev/null +++ b/web/core/js/common/components/canvas/CanvasScaleForSavePlugin.js @@ -0,0 +1,225 @@ +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class CanvasScaleForSavePlugin extends CanvasPlugin { + constructor(options = {}) { + super('CanvasScaleForSavePlugin'); + + this.increaseScale = this.increaseScale.bind(this); + this.decreaseScale = this.decreaseScale.bind(this); + this.updateScaleDisplay = this.updateScaleDisplay.bind(this); + this.emitScaleChange = this.emitScaleChange.bind(this); + this.downloadCanvasImage = this.downloadCanvasImage.bind(this); + this.onCanvasResized = this.onCanvasResized.bind(this); + + this.defaultScale = options.defaultScale || 1; + this.showDownloadButton = options.showDownloadButton !== undefined ? options.showDownloadButton : true; + + this.scale = this.defaultScale; + + this.uiContainer = null; + this.scaleDecreaseBtn = null; + this.scaleIncreaseBtn = null; + this.scaleValueDisplay = null; + this.actualSizeDisplay = null; + this.downloadBtn = null; + } + + init(canvasManager) { + this.canvasManager = canvasManager; + this.canvas = canvasManager.canvas; + + this.createUI(); + this.attachEventListeners(); + this.updateActualSize(); + } + + createUI() { + const styleSheet = document.createElement('style'); + styleSheet.textContent = ` + .csfs-container * { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .csfs-container { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem; + /* background: var(--color-background); */ + /* border: 1px dashed var(--color-border); */ + user-select: none; + margin-left: 1rem; /* Adjust as needed to align with existing controls */ + } + + .csfs-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + background: var(--color-button-primary); + border: none; + cursor: pointer; + transition: all 0.2s; + color: var(--color-primary-text); + min-width: 36px; + height: 36px; + } + + .csfs-button:hover { + background: var(--color-button-primary-hover); + } + + .csfs-button svg { + width: 1.25rem; + height: 1.25rem; + } + + .csfs-button[data-active="true"] { + border: 1px dashed var(--color-button-secondary-text-active); + } + + /* Styles for scale controls */ + .csfs-scale-container { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.5rem; + } + + .csfs-scale-label { + margin-right: 0.25rem; + font-weight: bold; + } + + .csfs-scale-display { + margin-left: 0.5rem; + font-size: 0.9rem; + color: var(--color-secondary-text); + font-weight: bold; + + } + .csfs-scale-value { + padding: 8px 8px; + font-weight: bold; + } + `; + document.head.appendChild(styleSheet); + + const temp = document.createElement('div'); + temp.innerHTML = ` +
+ +
+ + ${this.showDownloadButton ? ` + + + ` : ''} + + + 1x + + 512x512 +
+
+ `; + + this.uiContainer = temp.firstElementChild; + this.scaleDecreaseBtn = this.uiContainer.querySelector('#csfs-scaleDecreaseBtn'); + this.scaleIncreaseBtn = this.uiContainer.querySelector('#csfs-scaleIncreaseBtn'); + this.scaleValueDisplay = this.uiContainer.querySelector('#csfs-scaleValue'); + this.actualSizeDisplay = this.uiContainer.querySelector('#csfs-actualSize'); + this.downloadBtn = this.uiContainer.querySelector('#csfs-downloadBtn'); + + const pluginUIContainer = document.getElementById('pluginUIContainer'); + if (pluginUIContainer) { + pluginUIContainer.appendChild(this.uiContainer); + } else { + console.warn('Element with id "pluginUIContainer" not found.'); + } + } + + attachEventListeners() { + this.scaleIncreaseBtn.addEventListener('click', this.increaseScale); + this.scaleDecreaseBtn.addEventListener('click', this.decreaseScale); + + if (this.downloadBtn) { + this.downloadBtn.addEventListener('click', this.downloadCanvasImage); + } + + this.canvasManager.on('canvas:resized', this.onCanvasResized); + } + + + detachEventListeners() { + this.scaleIncreaseBtn.removeEventListener('click', this.increaseScale); + this.scaleDecreaseBtn.removeEventListener('click', this.decreaseScale); + + if (this.downloadBtn) { + this.downloadBtn.removeEventListener('click', this.downloadCanvasImage); + } + + this.canvasManager.off('canvas:resized', this.onCanvasResized); + } + + increaseScale() { + if (this.scale < 10) { + this.scale += 1; + this.updateScaleDisplay(); + this.emitScaleChange(); + this.updateActualSize(); + } + } + + decreaseScale() { + if (this.scale > 1) { + this.scale -= 1; + this.updateScaleDisplay(); + this.emitScaleChange(); + this.updateActualSize(); + } + } + + updateScaleDisplay() { + this.scaleValueDisplay.textContent = `${this.scale}x`; + } + + emitScaleChange() { + this.canvasManager.emit('canvas:scaleChanged', { scale: this.scale }); + } + + updateActualSize() { + const canvasWidth = this.canvas.getWidth(); + const canvasHeight = this.canvas.getHeight(); + const scaledWidth = Math.round(canvasWidth * this.scale); + const scaledHeight = Math.round(canvasHeight * this.scale); + this.actualSizeDisplay.textContent = `${scaledWidth}x${scaledHeight}`; + } + + onCanvasResized(data) { + this.updateActualSize(); + } + + downloadCanvasImage() { + const dataURL = this.canvasManager.getCanvasImage(); + const link = document.createElement('a'); + link.href = dataURL; + link.download = 'canvas-image.png'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + + destroy() { + if (this.uiContainer && this.uiContainer.parentNode) { + this.uiContainer.parentNode.removeChild(this.uiContainer); + } + + this.detachEventListeners(); + } +} diff --git a/web/core/js/common/components/canvas/CustomBrushPlugin.js b/web/core/js/common/components/canvas/CustomBrushPlugin.js new file mode 100644 index 0000000..d7f8681 --- /dev/null +++ b/web/core/js/common/components/canvas/CustomBrushPlugin.js @@ -0,0 +1,824 @@ +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class CustomBrushPlugin extends CanvasPlugin { + constructor(options = {}) { + super(options.name || 'CustomBrushPlugin'); + + this.brushSize = options.brushSize || 25; + this.minBrushSize = options.minBrushSize || 1; + this.maxBrushSize = options.maxBrushSize || 500; + this.brushColor = options.brushColor || '#000000'; + this.brushOpacity = options.brushOpacity !== undefined ? options.brushOpacity : 1; + this.brushTipResizeSpeed = options.brushTipResizeSpeed || 1; + this.cursorOutlineType = options.cursorOutlineType || 'dashed'; + this.cursorPrimaryColor = options.cursorPrimaryColor || '#000000'; + this.cursorSecondaryColor = options.cursorSecondaryColor || '#FFFFFF'; + this.cursorLineWidth = options.cursorLineWidth || 2; + this.cursorFill = options.cursorFill !== undefined ? options.cursorFill : false; + this.useBrushColorPrimaryColor = options.useBrushColorPrimaryColor || false; + this.showSystemCursor = options.showSystemCursor !== undefined ? options.showSystemCursor : false; + this.useBrushColorForCursorRing = options.useBrushColorForCursorRing !== undefined ? options.useBrushColorForCursorRing : false; + this.cursorRingOpacityAffected = options.cursorRingOpacityAffected !== undefined ? options.cursorRingOpacityAffected : false; + + this.canvasManager = null; + this.canvas = null; + this.drawingMode = false; + this.isMouseDown = false; + this.lastPointer = null; + this.currentPath = null; + this.brushIcon = '/core/media/ui/paintree.png'; + + this.originalCanvasProperties = null; + + this.cursorCircle = null; + this.secondaryCircle = null; + + this.uiContainer = null; + this.uiHeader = null; + this.brushSizeInput = null; + this.brushOpacityInput = null; + this.colorPicker = null; + this.toggleDrawBtn = null; + this.minimizeBtn = null; + this.isMinimized = false; + this.currentMode = 'full'; // Modes: 'full', 'mini', 'minimized' + + this.isDragging = false; + this.dragOffsetX = 0; + this.dragOffsetY = 0; + + this.drawnObjects = new Set(); + + this.currentZoom = 1; + + this.hiddenCursorClass = 'custom-brush-plugin-hidden-cursor'; + + this.onBrushSizeChange = this.onBrushSizeChange.bind(this); + this.onBrushOpacityChange = this.onBrushOpacityChange.bind(this); + this.onToggleDrawingMode = this.onToggleDrawingMode.bind(this); + this.onColorChange = this.onColorChange.bind(this); + this.onKeyDown = this.onKeyDown.bind(this); + this.enforceObjectProperties = this.enforceObjectProperties.bind(this); + this.onViewportChanged = this.onViewportChanged.bind(this); + + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseMove = this.onMouseMove.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.handleMouseWheel = this.handleMouseWheel.bind(this); + this.handleMouseOver = this.handleMouseOver.bind(this); + this.handleMouseOut = this.handleMouseOut.bind(this); + this.onObjectAdded = this.onObjectAdded.bind(this); + this.onHeaderMouseDown = this.onHeaderMouseDown.bind(this); + this.onDocumentMouseMove = this.onDocumentMouseMove.bind(this); + this.onDocumentMouseUp = this.onDocumentMouseUp.bind(this); + this.onMinimize = this.onMinimize.bind(this); + this.onModeChange = this.onModeChange.bind(this); + this.brushStrokeIdCounter = 0; + } + + init(canvasManager) { + this.canvasManager = canvasManager; + this.canvas = canvasManager.canvas; + + this.storeOriginalCanvasProperties(); + + this.disableSelectionBox(); + + this.injectHiddenCursorCSS(); + + this.createUI(); + + this.attachEventListeners(); + + this.brushSizeInput.value = this.brushSize; + this.brushOpacityInput.value = this.brushOpacity * 100; + this.colorPicker.value = this.brushColor; + + this.canvas.on('object:added', this.onObjectAdded); + + this.canvas.getObjects().forEach(this.enforceObjectProperties); + + this.canvasManager.on('viewport:changed', this.onViewportChanged); + } + + injectHiddenCursorCSS() { + if (document.getElementById('custom-brush-plugin-styles')) return; + + const style = document.createElement('style'); + style.id = 'custom-brush-plugin-styles'; + style.type = 'text/css'; + style.innerHTML = ` + + `; + document.head.appendChild(style); + } + + // Helper function to convert HEX to RGBA + getFillColorWithOpacity(hex, alpha) { + // Remove '#' if present + hex = hex.replace('#', ''); + let r, g, b; + if (hex.length === 3) { + r = parseInt(hex[0] + hex[0], 16); + g = parseInt(hex[1] + hex[1], 16); + b = parseInt(hex[2] + hex[2], 16); + } else if (hex.length === 6) { + r = parseInt(hex.substring(0, 2), 16); + g = parseInt(hex.substring(2, 4), 16); + b = parseInt(hex.substring(4, 6), 16); + } else { + // Invalid format + return 'rgba(0,0,0,1)'; + } + return `rgba(${r},${g},${b},${alpha})`; + } + + isDrawnObject(obj) { + return obj.type === 'path'; + } + + onObjectAdded(e) { + const obj = e.target; + if (obj && this.isDrawnObject(obj)) { + this.enforceObjectProperties(obj); + } + } + + createUI() { + this.uiContainer = document.createElement('div'); + this.uiContainer.className = 'cbp-brush-ui-container cbp-brush-ui-full'; + + this.uiContainer.innerHTML = ` +
+ Brush Settings + +
+
+ + +
+ + + +
+
+ `; + + document.body.appendChild(this.uiContainer); + + this.brushSizeInput = this.uiContainer.querySelector('#cbp-brush-size-input'); + this.brushOpacityInput = this.uiContainer.querySelector('#cbp-brush-opacity-input'); + this.colorPicker = this.uiContainer.querySelector('#cbp-color-picker'); + this.toggleDrawBtn = this.uiContainer.querySelector('#cbp-toggle-drawing-mode-btn'); + this.toggleBtnIcon = this.uiContainer.querySelector('#cbp-toggle-btn-icon'); + this.minimizeBtn = this.uiContainer.querySelector('.cbp-brush-ui-minimize-btn'); + this.uiHeader = this.uiContainer.querySelector('.cbp-brush-ui-header'); + + this.uiHeader.addEventListener('mousedown', this.onHeaderMouseDown); + this.minimizeBtn.addEventListener('click', this.onMinimize); + this.toggleDrawBtn.addEventListener('click', this.onToggleDrawingMode); + } + + attachEventListeners() { + this.brushSizeInput.addEventListener('input', this.onBrushSizeChange); + this.brushOpacityInput.addEventListener('input', this.onBrushOpacityChange); + this.colorPicker.addEventListener('input', this.onColorChange); + window.addEventListener('keydown', this.onKeyDown); + } + + detachEventListeners() { + this.brushSizeInput.removeEventListener('input', this.onBrushSizeChange); + this.brushOpacityInput.removeEventListener('input', this.onBrushOpacityChange); + this.colorPicker.removeEventListener('input', this.onColorChange); + window.removeEventListener('keydown', this.onKeyDown); + + this.uiHeader.removeEventListener('mousedown', this.onHeaderMouseDown); + this.minimizeBtn.removeEventListener('click', this.onMinimize); + this.toggleDrawBtn.removeEventListener('click', this.onToggleDrawingMode); + } + + onKeyDown(e) { + // // Toggle Drawing Mode (e.g., press 'D') + // if (e.key.toLowerCase() === 'd') { + // e.preventDefault(); + // this.onToggleDrawingMode(); + // } + } + + onBrushSizeChange(e) { + this.brushSize = parseInt(e.target.value, 10); + if (this.drawingMode) { + this.updateCursorCircle(); + this.canvas.requestRenderAll(); + } + } + + onBrushOpacityChange(e) { + this.brushOpacity = parseInt(e.target.value, 10) / 100; + if (this.drawingMode) { + this.updateCursorCircle(); + this.canvas.requestRenderAll(); + } + } + + onColorChange() { + this.brushColor = this.colorPicker.value; + if (this.drawingMode) { + this.updateCursorCircle(); + } + } + + storeOriginalCanvasProperties() { + this.originalCanvasProperties = { + selection: this.canvas.selection, + selectionColor: this.canvas.selectionColor, + selectionBorderColor: this.canvas.selectionBorderColor, + selectionLineWidth: this.canvas.selectionLineWidth, + hoverCursor: this.canvas.hoverCursor, + moveCursor: this.canvas.moveCursor, + defaultCursor: this.canvas.defaultCursor, + freeDrawingCursor: this.canvas.freeDrawingCursor + }; + } + + disableSelectionBox() { + this.canvas.selection = false; + this.canvas.selectionColor = 'transparent'; + this.canvas.selectionBorderColor = 'transparent'; + this.canvas.selectionLineWidth = 0; + + this.canvas.hoverCursor = 'default'; + this.canvas.moveCursor = 'default'; + this.canvas.freeDrawingCursor = 'none'; + + this.canvas.skipTargetFind = true; + this.canvas.preserveObjectStacking = true; + } + + onToggleDrawingMode() { + this.drawingMode = !this.drawingMode; + + const toggleButton = document.getElementById('cbp-toggle-drawing-mode-btn'); + if (this.drawingMode) { + toggleButton.classList.add('active'); + } else { + toggleButton.classList.remove('active'); + } + + this.toggleBtnIcon.src = this.brushIcon; + + + if (this.drawingMode) { + this.canvas.defaultCursor = this.showSystemCursor ? 'default' : 'none'; + + if (!this.showSystemCursor) { + this.canvas.lowerCanvasEl.classList.add(this.hiddenCursorClass); + this.canvas.upperCanvasEl.classList.add(this.hiddenCursorClass); + } + } else { + this.canvas.defaultCursor = this.originalCanvasProperties.defaultCursor || 'default'; + + this.canvas.lowerCanvasEl.classList.remove(this.hiddenCursorClass); + this.canvas.upperCanvasEl.classList.remove(this.hiddenCursorClass); + } + + this.disableSelectionBox(); + + this.canvas.getObjects().forEach(obj => { + if (this.drawnObjects.has(obj)) { + obj.selectable = false; + obj.evented = false; + obj.hasControls = false; + obj.hasBorders = false; + obj.lockMovementX = true; + obj.lockMovementY = true; + } + }); + + if (this.drawingMode) { + this.attachDrawingEvents(); + this.brushSizeInput.disabled = false; + this.brushOpacityInput.disabled = false; + this.colorPicker.disabled = false; + this.updateCursorCircle(); + this.canvas.requestRenderAll(); + this.setNonDrawnObjectsSelectable(false); + } else { + this.detachDrawingEvents(); + if (this.cursorCircle) { + this.canvas.remove(this.cursorCircle); + this.cursorCircle = null; + } + if (this.secondaryCircle) { + this.canvas.remove(this.secondaryCircle); + this.secondaryCircle = null; + } + this.brushSizeInput.disabled = true; + this.brushOpacityInput.disabled = true; + this.colorPicker.disabled = true; + this.setNonDrawnObjectsSelectable(true); + } + } + + enforceObjectProperties(obj) { + if (obj === this.cursorCircle || obj === this.secondaryCircle) return; + + if (this.isDrawnObject(obj)) { + obj.selectable = false; + obj.evented = false; + obj.hasControls = false; + obj.hasBorders = false; + obj.lockMovementX = true; + obj.lockMovementY = true; + obj.hoverCursor = 'default'; + this.drawnObjects.add(obj); + } + } + + setNonDrawnObjectsSelectable(selectable) { + this.canvas.getObjects().forEach((obj) => { + if (!this.drawnObjects.has(obj) && obj !== this.cursorCircle && obj !== this.secondaryCircle) { + obj.selectable = selectable; + obj.evented = selectable; + obj.hoverCursor = selectable ? 'move' : 'default'; + } + }); + } + + attachDrawingEvents() { + this.canvas.on('mouse:down', this.onMouseDown); + this.canvas.on('mouse:move', this.onMouseMove); + this.canvas.on('mouse:up', this.onMouseUp); + this.canvas.on('mouse:wheel', this.handleMouseWheel); + this.canvas.on('mouse:over', this.handleMouseOver); + this.canvas.on('mouse:out', this.handleMouseOut); + } + + detachDrawingEvents() { + this.canvas.off('mouse:down', this.onMouseDown); + this.canvas.off('mouse:move', this.onMouseMove); + this.canvas.off('mouse:up', this.onMouseUp); + this.canvas.off('mouse:wheel', this.handleMouseWheel); + this.canvas.off('mouse:over', this.handleMouseOver); + this.canvas.off('mouse:out', this.handleMouseOut); + } + + updateCursorCircle() { + const dashArray = this.getStrokeDashArray(); + const isOutlined = this.cursorOutlineType === 'dashed' || this.cursorOutlineType === 'dotted'; + + if (!this.cursorCircle) { + this.cursorCircle = new fabric.Circle({ + radius: this.brushSize / 2, + fill: this.cursorFill + ? (this.useBrushColorPrimaryColor + ? this.getFillColorWithOpacity(this.brushColor, this.brushOpacity) + : this.getFillColorWithOpacity(this.cursorPrimaryColor, this.cursorRingOpacityAffected ? this.brushOpacity : 1)) + : 'transparent', + stroke: this.getCursorStrokeColor(), + strokeWidth: this.cursorOutlineType === 'none' ? 0 : this.cursorLineWidth, + selectable: false, + evented: false, + hasControls: false, + hasBorders: false, + originX: 'center', + originY: 'center', + strokeDashArray: dashArray, + hoverCursor: 'none' + }); + + if (isOutlined && !this.useBrushColorForCursorRing) { + this.secondaryCircle = new fabric.Circle({ + radius: this.brushSize / 2, + fill: 'transparent', + stroke: this.cursorSecondaryColor, + strokeWidth: this.cursorLineWidth, + selectable: false, + evented: false, + hasControls: false, + hasBorders: false, + originX: 'center', + originY: 'center', + strokeDashArray: dashArray, + strokeDashOffset: this.cursorOutlineType === 'dashed' ? dashArray[0] : dashArray[0], + hoverCursor: 'none' + }); + this.canvas.add(this.secondaryCircle); + } + + this.canvas.add(this.cursorCircle); + if (this.secondaryCircle) { + this.secondaryCircle.bringToFront(); + } + this.cursorCircle.bringToFront(); + } else { + this.cursorCircle.set({ + radius: this.brushSize / 2, + fill: this.cursorFill + ? (this.useBrushColorPrimaryColor + ? this.getFillColorWithOpacity(this.brushColor, this.brushOpacity) + : this.getFillColorWithOpacity(this.cursorPrimaryColor, this.cursorRingOpacityAffected ? this.brushOpacity : 1)) + : 'transparent', + stroke: this.getCursorStrokeColor(), + strokeWidth: this.cursorOutlineType === 'none' ? 0 : this.cursorLineWidth, + strokeDashArray: dashArray + }); + + if (isOutlined && !this.useBrushColorForCursorRing) { + if (!this.secondaryCircle) { + this.secondaryCircle = new fabric.Circle({ + radius: this.brushSize / 2, + fill: 'transparent', + stroke: this.cursorSecondaryColor, + strokeWidth: this.cursorLineWidth, + selectable: false, + evented: false, + hasControls: false, + hasBorders: false, + originX: 'center', + originY: 'center', + strokeDashArray: dashArray, + strokeDashOffset: this.cursorOutlineType === 'dashed' ? dashArray[0] : dashArray[0], + hoverCursor: 'none' + }); + this.canvas.add(this.secondaryCircle); + } else { + this.secondaryCircle.set({ + radius: this.brushSize / 2, + stroke: this.cursorSecondaryColor, + strokeWidth: this.cursorLineWidth, + strokeDashArray: dashArray, + strokeDashOffset: this.cursorOutlineType === 'dashed' ? dashArray[0] : dashArray[0] + }); + } + } else if (this.secondaryCircle) { + this.canvas.remove(this.secondaryCircle); + this.secondaryCircle = null; + } + } + + if (this.currentZoom !== 0) { + const scale = 1 / this.currentZoom; + this.cursorCircle.set({ + scaleX: scale, + scaleY: scale + }); + if (this.secondaryCircle) { + this.secondaryCircle.set({ + scaleX: scale, + scaleY: scale + }); + } + } + } + + getCursorStrokeColor() { + if (this.cursorOutlineType === 'none') { + return 'transparent'; + } + + if (this.cursorOutlineType === 'solid') { + return this.useBrushColorForCursorRing ? this.brushColor : this.cursorPrimaryColor; + } + + if (this.cursorOutlineType === 'dashed' || this.cursorOutlineType === 'dotted') { + return this.useBrushColorForCursorRing ? this.brushColor : this.cursorPrimaryColor; + } + + return this.cursorPrimaryColor; + } + + getStrokeDashArray() { + if (this.cursorOutlineType === 'solid') { + return []; + } else if (this.cursorOutlineType === 'dashed') { + return [4, 4]; + } else if (this.cursorOutlineType === 'dotted') { + return [1, 2]; + } else if (this.cursorOutlineType === 'none') { + return []; + } + return []; + } + + handleMouseWheel(opt) { + if (!this.drawingMode) return; + + const delta = opt.e.deltaY; + opt.e.preventDefault(); + opt.e.stopPropagation(); + + let deltaSize = delta < 0 ? 1 : -1; + deltaSize *= this.brushTipResizeSpeed; + this.brushSize = Math.min(this.maxBrushSize, Math.max(this.minBrushSize, this.brushSize + deltaSize)); + this.brushSizeInput.value = this.brushSize; + this.updateCursorCircle(); + this.canvas.requestRenderAll(); + } + + handleMouseOver() { + if (this.drawingMode) { + if (this.cursorCircle) { + this.cursorCircle.visible = true; + } + if (this.secondaryCircle) { + this.secondaryCircle.visible = true; + } + this.canvas.requestRenderAll(); + } + } + + handleMouseOut() { + if (this.drawingMode) { + if (this.cursorCircle) { + this.cursorCircle.visible = false; + } + if (this.secondaryCircle) { + this.secondaryCircle.visible = false; + } + this.canvas.requestRenderAll(); + } + } + + updateCursorPosition(opt) { + if (!this.cursorCircle) return; + + const pointer = this.canvas.getPointer(opt.e); + + const scale = 1 / this.currentZoom; + + this.cursorCircle.set({ + left: pointer.x, + top: pointer.y, + scaleX: scale, + scaleY: scale + }).setCoords(); + + if (this.secondaryCircle) { + this.secondaryCircle.set({ + left: pointer.x, + top: pointer.y, + scaleX: scale, + scaleY: scale + }).setCoords(); + + this.secondaryCircle.bringToFront(); + } + + this.cursorCircle.bringToFront(); + } + + onMouseMove(o) { + const pointer = this.canvas.getPointer(o.e); + + this.updateCursorPosition(o); + + if (this.isMouseDown && this.currentPath) { + const pathData = this.currentPath.path; + pathData.push(['L', pointer.x, pointer.y]); + this.currentPath.set({ path: pathData }); + + this.canvas.requestRenderAll(); + } + } + + onMouseDown(o) { + this.isMouseDown = true; + const pointer = this.canvas.getPointer(o.e); + this.lastPointer = pointer; + + this.currentPath = new fabric.Path(`M ${pointer.x} ${pointer.y}`, { + stroke: this.brushColor, + strokeWidth: this.brushSize / this.currentZoom, + fill: null, + selectable: false, + evented: false, + opacity: this.brushOpacity, + originX: 'center', + originY: 'center', + objectCaching: false, + strokeLineCap: 'round', + strokeLineJoin: 'round', + brushStrokeId: `brush-stroke-${this.brushStrokeIdCounter++}` + }); + + this.canvas.add(this.currentPath); + this.drawnObjects.add(this.currentPath); + } + + onMouseUp() { + if (this.isMouseDown && this.currentPath) { + this.isMouseDown = false; + this.currentPath.setCoords(); + this.currentPath = null; + // No need to manually fire 'object:added'; Fabric.js handles it + } + } + + onViewportChanged(event) { + const { transform } = event; + const zoom = transform[0]; + + this.currentZoom = zoom; + + if (this.cursorCircle) { + const scale = 1 / zoom; + this.cursorCircle.set({ + scaleX: scale, + scaleY: scale + }); + + if (this.secondaryCircle) { + this.secondaryCircle.set({ + scaleX: scale, + scaleY: scale + }); + } + } + } + + onHeaderMouseDown(e) { + e.preventDefault(); + this.isDragging = true; + + const rect = this.uiContainer.getBoundingClientRect(); + this.dragOffsetX = e.clientX - rect.left; + this.dragOffsetY = e.clientY - rect.top; + + document.addEventListener('mousemove', this.onDocumentMouseMove); + document.addEventListener('mouseup', this.onDocumentMouseUp); + } + + onDocumentMouseMove(e) { + if (!this.isDragging) return; + + let newLeft = e.clientX - this.dragOffsetX; + let newTop = e.clientY - this.dragOffsetY; + + // Constrain within the viewport + const containerWidth = this.uiContainer.offsetWidth; + const containerHeight = this.uiContainer.offsetHeight; + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + + newLeft = Math.max(0, Math.min(newLeft, windowWidth - containerWidth)); + newTop = Math.max(0, Math.min(newTop, windowHeight - containerHeight)); + + // Update UI container position + this.uiContainer.style.left = `${newLeft}px`; + this.uiContainer.style.top = `${newTop}px`; + this.uiContainer.style.bottom = 'auto'; + this.uiContainer.style.right = 'auto'; + } + + onDocumentMouseUp(e) { + this.isDragging = false; + + document.removeEventListener('mousemove', this.onDocumentMouseMove); + document.removeEventListener('mouseup', this.onDocumentMouseUp); + } + + onMinimize() { + if (this.currentMode === 'minimized') { + this.currentMode = this.previousMode || 'full'; + } else { + this.previousMode = this.currentMode; + this.currentMode = 'minimized'; + } + this.onModeChange(); + } + + onModeChange() { + if (this.currentMode === 'full') { + this.uiContainer.classList.remove('cbp-brush-ui-mini', 'cbp-brush-ui-minimized'); + this.uiContainer.classList.add('cbp-brush-ui-full'); + this.minimizeBtn.title = 'Minimize'; + this.minimizeBtn.textContent = '−'; + this.toggleDrawBtn.style.display = 'block'; + this.uiContainer.querySelector('.cbp-brush-ui-title').textContent = 'Brush Settings'; + this.updateUIForMode(); + } else if (this.currentMode === 'mini') { + this.uiContainer.classList.remove('cbp-brush-ui-full', 'cbp-brush-ui-minimized'); + this.uiContainer.classList.add('cbp-brush-ui-mini'); + this.minimizeBtn.title = 'Minimize'; + this.minimizeBtn.textContent = '−'; + this.toggleDrawBtn.style.display = 'block'; + // this.uiContainer.querySelector('.cbp-brush-ui-title').textContent = 'Brush'; + this.updateUIForMode(); + } else if (this.currentMode === 'minimized') { + this.uiContainer.classList.remove('cbp-brush-ui-full', 'cbp-brush-ui-mini'); + this.uiContainer.classList.add('cbp-brush-ui-minimized'); + this.minimizeBtn.title = 'Maximize'; + this.minimizeBtn.textContent = '+'; + this.toggleDrawBtn.style.display = 'none'; + this.uiContainer.querySelector('.cbp-brush-ui-title').textContent = ''; + } + } + + updateUIForMode() { + const content = this.uiContainer.querySelector('.cbp-brush-ui-content'); + + if (this.currentMode === 'full') { + content.innerHTML = ` + + + + + `; + } else if (this.currentMode === 'mini') { + content.innerHTML = ` +
+ +
+
+ +
+
+ +
+ + `; + } + this.brushSizeInput = this.uiContainer.querySelector('#cbp-brush-size-input'); + this.brushOpacityInput = this.uiContainer.querySelector('#cbp-brush-opacity-input'); + this.colorPicker = this.uiContainer.querySelector('#cbp-color-picker'); + this.toggleDrawBtn = this.uiContainer.querySelector('#cbp-toggle-drawing-mode-btn'); + this.toggleBtnIcon = this.uiContainer.querySelector('#cbp-toggle-btn-icon'); + + this.brushSizeInput.addEventListener('input', this.onBrushSizeChange); + this.brushOpacityInput.addEventListener('input', this.onBrushOpacityChange); + this.colorPicker.addEventListener('input', this.onColorChange); + this.toggleDrawBtn.addEventListener('click', this.onToggleDrawingMode); + } + + switchToMiniMode() { + if (this.currentMode !== 'minimized') { + this.previousMode = this.currentMode; + this.currentMode = 'mini'; + this.onModeChange(); + } + } + + switchToFullMode() { + if (this.currentMode !== 'minimized') { + this.currentMode = 'full'; + this.onModeChange(); + } + } + + destroy() { + if (this.uiContainer) { + document.body.removeChild(this.uiContainer); + this.uiContainer = null; + } + + this.detachEventListeners(); + + this.detachDrawingEvents(); + + if (this.cursorCircle) { + this.canvas.remove(this.cursorCircle); + this.cursorCircle = null; + } + if (this.secondaryCircle) { + this.canvas.remove(this.secondaryCircle); + this.secondaryCircle = null; + } + + this.canvas.off('object:added', this.onObjectAdded); + + // Remove viewport:changed listener + this.canvasManager.off('viewport:changed', this.onViewportChanged); + + // Restore original canvas properties + if (this.originalCanvasProperties) { + this.canvas.selection = this.originalCanvasProperties.selection; + this.canvas.selectionColor = this.originalCanvasProperties.selectionColor; + this.canvas.selectionBorderColor = this.originalCanvasProperties.selectionBorderColor; + this.canvas.selectionLineWidth = this.originalCanvasProperties.selectionLineWidth; + this.canvas.hoverCursor = this.originalCanvasProperties.hoverCursor; + this.canvas.moveCursor = this.originalCanvasProperties.moveCursor; + this.canvas.defaultCursor = this.originalCanvasProperties.defaultCursor; + this.canvas.freeDrawingCursor = this.originalCanvasProperties.freeDrawingCursor; + } + + super.destroy(); + } +} + diff --git a/web/core/js/common/components/canvas/EventEmitter.js b/web/core/js/common/components/canvas/EventEmitter.js new file mode 100644 index 0000000..08dee88 --- /dev/null +++ b/web/core/js/common/components/canvas/EventEmitter.js @@ -0,0 +1,24 @@ +export class EventEmitter { + constructor() { + this.events = {}; + } + + on(event, listener) { + if (!this.events[event]) { + this.events[event] = new Set(); + } + this.events[event].add(listener); + } + + off(event, listener) { + if (!this.events[event]) return; + this.events[event].delete(listener); + } + + emit(event, ...args) { + if (!this.events[event]) return; + for (let listener of this.events[event]) { + listener(...args); + } + } +} diff --git a/web/core/js/common/components/canvas/ImageAdderPlugin.js b/web/core/js/common/components/canvas/ImageAdderPlugin.js new file mode 100644 index 0000000..6a94f0a --- /dev/null +++ b/web/core/js/common/components/canvas/ImageAdderPlugin.js @@ -0,0 +1,129 @@ +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class ImageAdderPlugin extends CanvasPlugin { + constructor(options = {}) { + super('ImageAdderPlugin'); + + this.options = { + ...options + }; + + this.canvasManager = null; + this.canvas = null; + + this.handleAddImage = this.handleAddImage.bind(this); + } + + init(canvasManager) { + this.canvasManager = canvasManager; + this.canvas = canvasManager.canvas; + + this.createUI(); + + this.attachEventListeners(); + } + + createUI() { + const html = ` +
+ + + + + + + + + + +
+ `; + + this.uiContainer = document.createElement('div'); + this.uiContainer.innerHTML = html; + this.uiContainer.className = 'image-adder-plugin-container'; + + this.uiContainer.style.padding = '10px'; + this.uiContainer.style.borderRadius = '5px'; + this.uiContainer.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.1)'; + this.uiContainer.style.backgroundColor = 'rgba(255, 255, 255, 0.9)'; + this.uiContainer.style.marginTop = '10px'; + + const pluginUIContainer = document.getElementById('pluginUIContainer'); + if (pluginUIContainer) { + pluginUIContainer.appendChild(this.uiContainer); + } else { + console.warn('pluginUIContainer element not found in the DOM.'); + } + } + + attachEventListeners() { + const addButton = this.uiContainer.querySelector('#add-image-button'); + addButton.addEventListener('click', this.handleAddImage); + } + + detachEventListeners() { + const addButton = this.uiContainer.querySelector('#add-image-button'); + addButton.removeEventListener('click', this.handleAddImage); + } + + handleAddImage() { + const colorPicker = this.uiContainer.querySelector('#image-color-picker'); + const widthInput = this.uiContainer.querySelector('#image-width-input'); + const heightInput = this.uiContainer.querySelector('#image-height-input'); + + const color = colorPicker.value; + const width = parseInt(widthInput.value, 10); + const height = parseInt(heightInput.value, 10); + + if (isNaN(width) || isNaN(height) || width <= 0 || height <= 0) { + alert('Please enter valid width and height values.'); + return; + } + + const rect = new fabric.Rect({ + width: width, + height: height, + fill: color, + left: this.canvas.getWidth() / 2, + top: this.canvas.getHeight() / 2, + originX: 'center', + originY: 'center', + selectable: true, + hasControls: true, + hasBorders: true, + }); + + this.canvas.add(rect); + this.canvas.setActiveObject(rect); + this.canvas.requestRenderAll(); + + this.canvasManager.emit('image:added', { + type: 'rectangle', + object: rect, + color: color, + width: width, + height: height, + }); + } + + destroy() { + if (this.uiContainer && this.uiContainer.parentNode) { + this.uiContainer.parentNode.removeChild(this.uiContainer); + } + this.detachEventListeners(); + } +} diff --git a/web/core/js/common/components/canvas/ImageCompareSliderPlugin.js b/web/core/js/common/components/canvas/ImageCompareSliderPlugin.js new file mode 100644 index 0000000..03d2547 --- /dev/null +++ b/web/core/js/common/components/canvas/ImageCompareSliderPlugin.js @@ -0,0 +1,571 @@ +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class ImageCompareSliderPlugin extends CanvasPlugin { + constructor(options = {}) { + super('ImageCompareSliderPlugin'); + + this.options = { + sliderColor: '#570d7b', + sliderWidth: 2, + handleRadius: 18, + handleStrokeWidth: 4, + handleStrokeColor: '#fff', + topMargin: 23, + bottomMargin: 23, + mode: 'Pairs', // 'Pairs', 'Replace', 'Multi' + ...options + }; + + this.init = this.init.bind(this); + this.destroy = this.destroy.bind(this); + this.onImageLoaded = this.onImageLoaded.bind(this); + this.onImageRemoved = this.onImageRemoved.bind(this); + this.onImageListUpdated = this.onImageListUpdated.bind(this); + this.onViewportChanged = this.onViewportChanged.bind(this); + this.updateSliderElements = this.updateSliderElements.bind(this); + this.updateClipPath = this.updateClipPath.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseMove = this.onMouseMove.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseDoubleClick = this.onMouseDoubleClick.bind(this); + this.animateSlider = this.animateSlider.bind(this); + this.ensureSliderOnTop = this.ensureSliderOnTop.bind(this); + this.onAfterRender = this.onAfterRender.bind(this); + this.setupSliderWithImages = this.setupSliderWithImages.bind(this); + this.initializeMultiModeSelector = this.initializeMultiModeSelector.bind(this); + this.onMultiModeSelection = this.onMultiModeSelection.bind(this); + + this.canvasManager = null; + this.canvas = null; + this.images = []; + this.sliderLine = null; + this.sliderHandle = null; + this.animating = false; + this.pingPong = true; + this.moveRight = true; + this.isInitialized = false; + this.isDragging = false; + + this.multiModeUI = null; + this.imageListContainer = null; + this.compareButton = null; + } + + init(canvasManager) { + this.canvasManager = canvasManager; + this.canvas = canvasManager.canvas; + + this.canvasManager.on('image:loaded', this.onImageLoaded); + this.canvasManager.on('image:removed', this.onImageRemoved); + this.canvasManager.on('image:list:updated', this.onImageListUpdated); + this.canvasManager.on('viewport:changed', this.onViewportChanged); + + this.canvas.on('mouse:down', this.onMouseDown); + this.canvas.on('mouse:move', this.onMouseMove); + this.canvas.on('mouse:up', this.onMouseUp); + this.canvas.on('mouse:out', this.onMouseUp); + this.canvas.on('mouse:dblclick', this.onMouseDoubleClick); + + this.canvas.on('after:render', this.onAfterRender); + + if (this.options.mode === 'Multi') { + this.initializeMultiModeSelector(); + } + + console.log('ImageCompareSliderPlugin initialized'); + } + + onAfterRender() { + this.ensureSliderOnTop(); + } + + ensureSliderOnTop() { + if (!this.isReady()) return; + + const objects = this.canvas.getObjects(); + + const maxIndex = objects.length - 1; + + const lineIndex = objects.indexOf(this.sliderLine); + const handleIndex = objects.indexOf(this.sliderHandle); + + if (lineIndex !== maxIndex - 1) { + this.sliderLine.moveTo(maxIndex - 1); + console.log('sliderLine moved to top -1'); + } + if (handleIndex !== maxIndex) { + this.sliderHandle.moveTo(maxIndex); + console.log('sliderHandle moved to top'); + } + } + + isReady() { + return this.isInitialized && + this.sliderLine && + this.sliderHandle && + this.images.length === 2; + } + + onImageListUpdated({ images }) { + console.log('Image list updated:', images); + this.images = images; + this.updateComparisonImages(); + } + + onImageLoaded({ image, id }) { + console.log(`Image loaded: ID=${id}`); + if (this.options.mode === 'Pairs') { + if (this.images.length > 1) { + const imagesToRemove = this.images.slice(0, this.images.length - 1); + imagesToRemove.forEach(img => { + console.log(`Removing image ID=${img.id} to maintain 'Pairs' mode`); + this.canvasManager.emit('image:remove', { id: img.id }); + }); + } + } else if (this.options.mode === 'Replace') { + if (this.images.length > 2) { + const imagesToRemove = this.images.slice(0, this.images.length - 2); + imagesToRemove.forEach(img => { + console.log(`Removing image ID=${img.id} to maintain 'Replace' mode`); + this.canvasManager.emit('image:remove', { id: img.id }); + }); + } + } + } + + onImageRemoved({ id }) { + console.log(`Image removed: ID=${id}`); + this.images = this.images.filter(img => img.id !== id); + if (this.images.length < 2) { + this.destroySlider(); + } else { + this.updateComparisonImages(); + } + } + + updateComparisonImages() { + console.log('Updating comparison images based on current mode:', this.options.mode); + if (this.images.length < 2) { + this.destroySlider(); + return; + } + + if (this.options.mode === 'Multi') { + this.updateMultiModeUI(); + + } else { + let img1, img2; + + if (this.options.mode === 'Pairs') { + + img1 = this.images[this.images.length - 2]; + img2 = this.images[this.images.length - 1]; + } else if (this.options.mode === 'Replace') { + img1 = this.images[this.images.length - 2]; + img2 = this.images[this.images.length - 1]; + } + if (img1 && img2) { + this.setupSliderWithImages(img1.id, img2.id); + } + } + } + + setupSliderWithImages(id1, id2) { + console.log(`Setting up slider with images ID1=${id1}, ID2=${id2}`); + const imageData1 = this.canvasManager.getImageById(id1); + const imageData2 = this.canvasManager.getImageById(id2); + + if (!imageData1 || !imageData2) { + console.warn('One or both images not found on canvas.'); + return; + } + + this.baseImage = imageData1; + this.comparisonImage = imageData2; + this.initializeSlider(); + } + + initializeSlider() { + if (!this.baseImage || !this.comparisonImage) return; + + this.cleanupSliderElements(); + + const { sliderColor, sliderWidth, handleRadius, handleStrokeWidth, handleStrokeColor } = this.options; + + try { + this.sliderLine = new fabric.Line( + [this.canvas.width / 2, 0, this.canvas.width / 2, this.canvas.height], + { + id: 'sliderLine', + stroke: sliderColor, + strokeWidth: sliderWidth, + selectable: false, + hasControls: false, + evented: false, + originX: 'center', + visible: true + } + ); + + this.sliderHandle = new fabric.Circle({ + id: 'sliderHandle', + left: this.canvas.width / 2, + top: this.canvas.height / 2, + radius: handleRadius, + fill: sliderColor, + stroke: handleStrokeColor, + strokeWidth: handleStrokeWidth, + originX: 'center', + originY: 'center', + selectable: true, + hasBorders: false, + hasControls: false, + evented: true, + hoverCursor: 'move', + perPixelTargetFind: true + }); + + this.canvas.add(this.sliderLine); + this.canvas.add(this.sliderHandle); + + this.ensureSliderOnTop(); + + this.updateClipPath(); + this.isInitialized = true; + + console.log('Slider initialized successfully'); + this.canvasManager.emit('slider:initialized', { + baseImage: this.baseImage, + comparisonImage: this.comparisonImage + }); + } catch (error) { + console.error('Error initializing slider:', error); + this.cleanupSliderElements(); + } + } + + updateSliderElements() { + if (!this.isReady()) return; + + const zoom = this.canvas.getZoom(); + + this.sliderLine.set({ + x1: this.sliderHandle.left, + x2: this.sliderHandle.left, + y1: 0, + y2: this.canvas.height + }); + + const scaledRadius = this.options.handleRadius / zoom; + const scaledStroke = this.options.handleStrokeWidth / zoom; + + this.sliderHandle.set({ + radius: scaledRadius, + strokeWidth: scaledStroke + }); + + this.ensureSliderOnTop(); + } + + updateClipPath() { + if (!this.isReady()) return; + + try { + const imageWidth = this.comparisonImage.getScaledWidth(); + const leftEdge = this.comparisonImage.left - imageWidth / 2; + + this.comparisonImage.clipPath = new fabric.Rect({ + originX: 'left', + originY: 'top', + left: leftEdge, + top: 0, + width: this.sliderHandle.left - leftEdge, + height: this.canvas.height, + absolutePositioned: true + }); + + this.canvas.requestRenderAll(); + console.log('Clip path updated'); + } catch (error) { + console.error('Error updating clip path:', error); + } + } + + onViewportChanged({ transform }) { + if (!this.isReady()) return; + this.updateSliderElements(); + this.updateClipPath(); + this.ensureSliderOnTop(); + } + + onMouseDown(event) { + if (!this.isReady()) return; + + const pointer = this.canvas.getPointer(event.e); + const zoom = this.canvas.getZoom(); + const handleRadius = this.options.handleRadius / zoom; + + const dx = pointer.x - this.sliderHandle.left; + const dy = pointer.y - this.sliderHandle.top; + const distance = Math.sqrt(dx * dx + dy * dy); + + if (distance <= handleRadius * 1.5) { + this.isDragging = true; + this.canvas.defaultCursor = 'move'; + this.ensureSliderOnTop(); + + event.e.preventDefault(); + event.e.stopPropagation(); + console.log('Slider handle drag started'); + } + } + + onMouseMove(event) { + if (!this.isReady() || !this.isDragging) return; + + const pointer = this.canvas.getPointer(event.e); + + const imageWidth = this.baseImage.getScaledWidth(); + const leftEdge = this.baseImage.left - imageWidth / 2; + const rightEdge = this.baseImage.left + imageWidth / 2; + + const newX = Math.max(leftEdge, Math.min(pointer.x, rightEdge)); + + this.sliderHandle.set({ + left: newX, + top: Math.max( + this.options.topMargin, + Math.min(pointer.y, this.canvas.height - this.options.bottomMargin) + ) + }); + + this.updateSliderElements(); + this.updateClipPath(); + this.ensureSliderOnTop(); + + this.canvas.requestRenderAll(); + event.e.preventDefault(); + event.e.stopPropagation(); + console.log(`Slider handle moved to (${newX}, ${this.sliderHandle.top})`); + } + + onMouseUp(event) { + if (this.isDragging) { + this.isDragging = false; + this.canvas.defaultCursor = 'default'; + this.ensureSliderOnTop(); + this.canvas.requestRenderAll(); + + if (event.e) { + event.e.preventDefault(); + event.e.stopPropagation(); + } + console.log('Slider handle drag ended'); + } + } + + onMouseDoubleClick(e) { + if (!this.isReady()) return; + + const pointer = this.canvas.getPointer(e.e); + const zoom = this.canvas.getZoom(); + const handleRadius = this.options.handleRadius / zoom; + + const dx = pointer.x - this.sliderHandle.left; + const dy = pointer.y - this.sliderHandle.top; + const distance = Math.sqrt(dx * dx + dy * dy); + + if (distance <= handleRadius * 1.5) { + this.sliderLine.visible = !this.sliderLine.visible; + this.canvas.requestRenderAll(); + console.log(`Slider line visibility toggled to ${this.sliderLine.visible}`); + } else if (!this.animating) { + this.animateSlider(); + } else { + this.animating = false; + console.log('Slider animation stopped'); + } + } + + animateSlider() { + if (!this.isReady()) return; + + this.animating = true; + const imageWidth = this.baseImage.getScaledWidth(); + const leftEdge = this.baseImage.left - imageWidth / 2; + const rightEdge = this.baseImage.left + imageWidth / 2; + + const startPosition = this.sliderHandle.left; + const endValue = this.moveRight ? rightEdge : leftEdge; + const distance = Math.abs(endValue - startPosition); + const duration = (distance / (rightEdge - leftEdge)) * 1500; + + console.log(`Animating slider from ${startPosition} to ${endValue} over ${duration}ms`); + + fabric.util.animate({ + startValue: startPosition, + endValue: endValue, + duration: duration, + onChange: (value) => { + if (!this.animating || !this.isReady()) return; + const adjustedValue = Math.max(leftEdge, Math.min(value, rightEdge)); + this.sliderHandle.set({ left: adjustedValue }); + this.updateSliderElements(); + this.updateClipPath(); + this.ensureSliderOnTop(); + this.canvas.requestRenderAll(); + console.log(`Slider handle animating to (${adjustedValue}, ${this.sliderHandle.top})`); + }, + onComplete: () => { + if (this.pingPong && this.animating && this.isReady()) { + this.moveRight = !this.moveRight; + this.animateSlider(); + } else { + this.animating = false; + this.updateClipPath(); + this.ensureSliderOnTop(); + console.log('Slider animation completed'); + } + } + }); + } + + cleanupSliderElements() { + if (this.sliderLine) { + this.canvas.remove(this.sliderLine); + this.sliderLine = null; + console.log('Slider line removed'); + } + if (this.sliderHandle) { + this.canvas.remove(this.sliderHandle); + this.sliderHandle = null; + console.log('Slider handle removed'); + } + if (this.comparisonImage && this.comparisonImage.clipPath) { + this.comparisonImage.clipPath = null; + console.log('Clip path removed from comparison image'); + } + this.isInitialized = false; + this.isDragging = false; + } + + destroySlider() { + console.log('Destroying slider'); + this.cleanupSliderElements(); + + if (this.options.mode === 'Multi') { + this.resetMultiModeSelection(); + } + } + + destroy() { + this.animating = false; + + this.canvasManager.off('image:loaded', this.onImageLoaded); + this.canvasManager.off('image:removed', this.onImageRemoved); + this.canvasManager.off('image:list:updated', this.onImageListUpdated); + this.canvasManager.off('viewport:changed', this.onViewportChanged); + + this.canvas.off('mouse:down', this.onMouseDown); + this.canvas.off('mouse:move', this.onMouseMove); + this.canvas.off('mouse:up', this.onMouseUp); + this.canvas.off('mouse:out', this.onMouseUp); + this.canvas.off('mouse:dblclick', this.onMouseDoubleClick); + this.canvas.off('after:render', this.onAfterRender); + + this.destroySlider(); + + if (this.multiModeUI) { + this.multiModeUI.remove(); + this.multiModeUI = null; + } + + this.baseImage = null; + this.comparisonImage = null; + this.images = []; + + this.canvas.requestRenderAll(); + console.log('ImageCompareSliderPlugin destroyed'); + } + + + initializeMultiModeSelector() { + this.multiModeUI = document.createElement('div'); + this.multiModeUI.className = 'multi-mode-selector'; + this.multiModeUI.style.position = 'absolute'; + this.multiModeUI.style.top = '10px'; + this.multiModeUI.style.right = '10px'; + this.multiModeUI.style.backgroundColor = 'rgba(255, 255, 255, 0.8)'; + this.multiModeUI.style.padding = '10px'; + this.multiModeUI.style.borderRadius = '5px'; + this.multiModeUI.style.boxShadow = '0 0 10px rgba(0,0,0,0.5)'; + this.multiModeUI.style.zIndex = '1000'; + + const title = document.createElement('h3'); + title.textContent = 'Select Images to Compare'; + title.style.margin = '0 0 10px 0'; + this.multiModeUI.appendChild(title); + + this.imageListContainer = document.createElement('div'); + this.imageListContainer.className = 'image-list-container'; + this.imageListContainer.style.maxHeight = '200px'; + this.imageListContainer.style.overflowY = 'auto'; + this.multiModeUI.appendChild(this.imageListContainer); + + this.compareButton = document.createElement('button'); + this.compareButton.textContent = 'Compare Selected'; + this.compareButton.disabled = true; + this.compareButton.style.marginTop = '10px'; + this.multiModeUI.appendChild(this.compareButton); + + const pluginUIContainer = document.getElementById('pluginUIContainer'); + if (pluginUIContainer) { + pluginUIContainer.appendChild(this.multiModeUI); + } else { + console.warn('pluginUIContainer element not found in the DOM.'); + } + + this.imageListContainer.addEventListener('change', this.onMultiModeSelection); + this.compareButton.addEventListener('click', () => { + const selectedIds = Array.from(this.imageListContainer.querySelectorAll('input[name="compareSelect"]:checked')) + .map(input => input.value); + if (selectedIds.length === 2) { + this.setupSliderWithImages(selectedIds[0], selectedIds[1]); + console.log(`Comparing images: ${selectedIds[0]} and ${selectedIds[1]}`); + } + }); + + this.updateMultiModeUI(); + } + + updateMultiModeUI() { + if (this.options.mode !== 'Multi') return; + + this.imageListContainer.innerHTML = ''; + + this.images.forEach(img => { + const label = document.createElement('label'); + label.style.display = 'block'; + label.style.marginBottom = '5px'; + label.innerHTML = ` + + Image ${img.id} + `; + this.imageListContainer.appendChild(label); + }); + } + + onMultiModeSelection() { + const checked = this.imageListContainer.querySelectorAll('input[name="compareSelect"]:checked').length; + this.compareButton.disabled = checked !== 2; + } + + resetMultiModeSelection() { + if (this.multiModeUI) { + this.multiModeUI.querySelectorAll('input[name="compareSelect"]').forEach(input => { + input.checked = false; + }); + this.compareButton.disabled = true; + } + } +} diff --git a/web/core/js/common/components/canvas/ImageLoaderPlugin.js b/web/core/js/common/components/canvas/ImageLoaderPlugin.js new file mode 100644 index 0000000..5d40df6 --- /dev/null +++ b/web/core/js/common/components/canvas/ImageLoaderPlugin.js @@ -0,0 +1,479 @@ + +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class ImageLoaderPlugin extends CanvasPlugin { + constructor(options = {}) { + super('ImageLoaderPlugin'); + + this.options = { + mode: 'Single', // 'Single' or 'Multi' + ...options + }; + + this.canvasManager = null; + this.canvas = null; + + this.uiContainer = null; + this.toggleButton = null; + this.loadButton = null; + this.fileInput = null; + + this.loadedImages = []; + this.originalImages = {}; + + this.onImageDrop = this.onImageDrop.bind(this); + this.onDoubleClick = this.onDoubleClick.bind(this); + this.onToggleMode = this.onToggleMode.bind(this); + this.onCanvasResized = this.onCanvasResized.bind(this); + this.onDragOver = this.onDragOver.bind(this); + this.onImageRemove = this.onImageRemove.bind(this); + this.onLoadButtonClick = this.onLoadButtonClick.bind(this); + this.onFileInputChange = this.onFileInputChange.bind(this); + } + + init(canvasManager) { + this.canvasManager = canvasManager; + this.canvas = canvasManager.canvas; + + this.createUI(); + + this.attachEventListeners(); + + this.canvasManager.on('canvas:resized', this.onCanvasResized); + + this.canvasManager.on('image:remove', this.onImageRemove); + } + + createUI() { + if (!document.querySelector('style[data-plugin="image-loader"]')) { + const styleSheet = document.createElement('style'); + styleSheet.setAttribute('data-plugin', 'image-loader'); + styleSheet.textContent = ` + .il-container * { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .il-container { + display: inline-flex; + padding: 0.5rem; + gap: 0.5rem; + } + + .il-button { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem; + background: var(--color-button-primary, #007BFF); + border: none; + cursor: pointer; + transition: background 0.2s; + color: var(--color-primary-text, #FFFFFF); + height: 36px; + } + + .il-button:hover { + background: var(--color-button-primary-hover, #0056b3); + } + + .il-button svg { + width: 1.25rem; + height: 1.25rem; + } + + .il-toggle-button[data-mode="Multi"] { + border: 1px dashed var(--color-button-secondary-text-active, #FFC107); + } + + .il-hidden-file-input { + display: none; + } + /* Temporary fix for hidden future functionality */ + #toggleModeBtn { + display: none; + } + `; + document.head.appendChild(styleSheet); + } + + this.uiContainer = document.createElement('div'); + this.uiContainer.className = 'il-container'; + + this.renderToggleButton(); + + this.renderLoadButton(); + + this.createHiddenFileInput(); + + const pluginUIContainer = document.getElementById('pluginUIContainer'); + if (pluginUIContainer) { + pluginUIContainer.appendChild(this.uiContainer); + } + } + + renderToggleButton() { + this.toggleButton = document.createElement('button'); + this.toggleButton.className = 'il-button il-toggle-button'; + this.toggleButton.id = 'toggleModeBtn'; + this.toggleButton.setAttribute('data-mode', this.options.mode); + this.toggleButton.innerHTML = ` + + + + ${this.options.mode} + `; + this.toggleButton.addEventListener('click', this.onToggleMode); + this.uiContainer.appendChild(this.toggleButton); + } + + renderLoadButton() { + this.loadButton = document.createElement('button'); + this.loadButton.className = 'il-button il-load-button'; + this.loadButton.id = 'loadImageBtn'; + this.loadButton.innerHTML = ` + + + + + `; + this.loadButton.addEventListener('click', this.onLoadButtonClick); + this.uiContainer.appendChild(this.loadButton); + } + + createHiddenFileInput() { + this.fileInput = document.createElement('input'); + this.fileInput.type = 'file'; + this.fileInput.accept = 'image/*'; + this.fileInput.className = 'il-hidden-file-input'; + this.fileInput.addEventListener('change', this.onFileInputChange); + document.body.appendChild(this.fileInput); + } + + onToggleMode() { + // Toggle between 'Single' and 'Multi' modes + this.options.mode = this.options.mode === 'Single' ? 'Multi' : 'Single'; + this.toggleButton.setAttribute('data-mode', this.options.mode); + this.toggleButton.innerHTML = ` + + + + ${this.options.mode} + `; + + if (this.options.mode === 'Single' && this.loadedImages.length > 1) { + const imagesToRemove = this.loadedImages.slice(0, -1); + imagesToRemove.forEach(({ id }) => { + this.removeImageById(id); + }); + } + } + + onLoadButtonClick() { + if (this.fileInput) { + this.fileInput.click(); + } + } + + onFileInputChange(event) { + const file = event.target.files[0]; + if (file) { + this.handleImageFile(file); + } + event.target.value = ''; + } + + attachEventListeners() { + this.canvas.upperCanvasEl.addEventListener('dragover', this.onDragOver); + this.canvas.upperCanvasEl.addEventListener('drop', this.onImageDrop); + } + + detachEventListeners() { + this.canvas.upperCanvasEl.removeEventListener('dragover', this.onDragOver); + this.canvas.upperCanvasEl.removeEventListener('drop', this.onImageDrop); + + if (this.toggleButton) { + this.toggleButton.removeEventListener('click', this.onToggleMode); + } + + if (this.loadButton) { + this.loadButton.removeEventListener('click', this.onLoadButtonClick); + } + + if (this.fileInput) { + this.fileInput.removeEventListener('change', this.onFileInputChange); + } + + this.canvasManager.off('canvas:resized', this.onCanvasResized); + + this.canvasManager.off('image:remove', this.onImageRemove); + } + + onCanvasResized({ width, height }) { + // Recalculate and apply scale to all images based on original dimensions + this.loadedImages.forEach(({ imageObject, borderRect }) => { + const img = imageObject; + const border = borderRect; + + const strokeWidth = border.strokeWidth || 2; + const desiredWidth = width - strokeWidth * 2; + const desiredHeight = height - strokeWidth * 2; + + const imgAspect = img.width / img.height; + const canvasAspect = width / height; + + let scaleFactor; + if (imgAspect > canvasAspect) { + scaleFactor = desiredWidth / img.width; + } else { + scaleFactor = desiredHeight / img.height; + } + + // Apply uniform scale to maintain aspect ratio + img.set({ + scaleX: scaleFactor, + scaleY: scaleFactor, + left: width / 2, + top: height / 2, + originX: 'center', + originY: 'center', + selectable: false, + evented: false, + }); + + border.set({ + scaleX: scaleFactor, + scaleY: scaleFactor, + left: width / 2, + top: height / 2, + originX: 'center', + originY: 'center', + }); + }); + + this.canvas.requestRenderAll(); + } + + onDragOver(event) { + event.preventDefault(); + event.dataTransfer.dropEffect = 'copy'; + } + + onImageDrop(event) { + event.preventDefault(); + const files = event.dataTransfer.files; + if (files && files[0]) { + this.handleImageFile(files[0]); + } + } + + onDoubleClick(event) { + const fileInput = document.createElement('input'); + fileInput.type = 'file'; + fileInput.accept = 'image/*'; + fileInput.style.display = 'none'; + fileInput.addEventListener('change', (e) => { + const file = e.target.files[0]; + if (file) { + this.handleImageFile(file); + } + }); + document.body.appendChild(fileInput); + fileInput.click(); + document.body.removeChild(fileInput); + } + + handleImageFile(file) { + if (!file.type.startsWith('image/')) { + alert('Please drop a valid image file.'); + return; + } + + const reader = new FileReader(); + reader.onload = (e) => { + fabric.Image.fromURL(e.target.result, (img) => { + const uniqueId = `Image_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; + + img.set({ + id: uniqueId, + scaleX: 1, + scaleY: 1, + left: this.canvas.getWidth() / 2, + top: this.canvas.getHeight() / 2, + originX: 'center', + originY: 'center', + selectable: false, + evented: false, + }); + + const originalWidth = img.width; + const originalHeight = img.height; + + const tempCanvas = document.createElement('canvas'); + tempCanvas.width = img.width; + tempCanvas.height = img.height; + const tempCtx = tempCanvas.getContext('2d'); + + img.clone((clonedImg) => { + tempCtx.drawImage(clonedImg._element, 0, 0); + const originalDataURL = tempCanvas.toDataURL('image/png'); + this.originalImages[uniqueId] = originalDataURL; + }); + + const canvasWidth = this.canvas.getWidth(); + const canvasHeight = this.canvas.getHeight(); + const imgAspect = originalWidth / originalHeight; + const canvasAspect = canvasWidth / canvasHeight; + + const strokeWidth = 2; + const desiredWidth = canvasWidth - strokeWidth * 2; + const desiredHeight = canvasHeight - strokeWidth * 2; + let scaleFactor; + if (imgAspect > canvasAspect) { + scaleFactor = desiredWidth / originalWidth; + } else { + scaleFactor = desiredHeight / originalHeight; + } + + img.set({ + scaleX: scaleFactor, + scaleY: scaleFactor, + left: canvasWidth / 2, + top: canvasHeight / 2, + originX: 'center', + originY: 'center', + selectable: false, + evented: false, + }); + + const borderRect = new fabric.Rect({ + width: img.getScaledWidth(), + height: img.getScaledHeight(), + originX: 'center', + originY: 'center', + left: canvasWidth / 2, + top: canvasHeight / 2, + fill: 'transparent', + // stroke: 'rgba(255, 0, 0, 0.5)', + strokeWidth: strokeWidth, + strokeDashArray: [10, 5], + strokeUniform: true, + selectable: false, + evented: false, + hasControls: false, + hasBorders: false, + lockMovementX: true, + lockMovementY: true, + }); + + this.canvas.add(img); + this.canvas.add(borderRect); + + borderRect.bringToFront(); + + this.loadedImages.push({ + id: uniqueId, + imageObject: img, + borderRect: borderRect, + originalWidth: originalWidth, + originalHeight: originalHeight, + scaleFactor: scaleFactor, + }); + + if (this.options.mode === 'Single' && this.loadedImages.length > 1) { + const imagesToRemove = this.loadedImages.slice(0, -1); + imagesToRemove.forEach(({ id }) => { + this.removeImageById(id); + }); + } + + this.canvasManager.emit('image:loaded', { + image: img, + id: uniqueId, + originalWidth: originalWidth, + originalHeight: originalHeight, + scaleFactor: scaleFactor, + }); + + this.canvasManager.emit('image:list:updated', { + images: this.loadedImages.map(img => ({ + id: img.id, + left: img.imageObject.left, + top: img.imageObject.top, + scaleX: img.imageObject.scaleX, + scaleY: img.imageObject.scaleY, + })), + }); + }, { crossOrigin: 'anonymous' }); + }; + reader.readAsDataURL(file); + } + + getOriginalImage(id) { + if (this.loadedImages.length === 0) { + console.warn('No images loaded.'); + return null; + } + + if (id) { + return this.originalImages[id] || null; + } + + const latestImage = this.loadedImages[this.loadedImages.length - 1]; + return this.originalImages[latestImage.id] || null; + } + + removeImageById(id) { + const imageIndex = this.loadedImages.findIndex(img => img.id === id); + if (imageIndex !== -1) { + const { imageObject, borderRect } = this.loadedImages[imageIndex]; + this.canvas.remove(imageObject); + this.canvas.remove(borderRect); + this.loadedImages.splice(imageIndex, 1); + + delete this.originalImages[id]; + + console.log(`ImageLoaderPlugin: Removed image with ID=${id}`); + this.canvasManager.emit('image:removed', { id }); + + this.canvasManager.emit('image:list:updated', { + images: this.loadedImages.map(img => ({ + id: img.id, + left: img.imageObject.left, + top: img.imageObject.top, + scaleX: img.imageObject.scaleX, + scaleY: img.imageObject.scaleY, + })), + }); + + if (this.options.mode === 'Single' && this.loadedImages.length === 0) { + this.canvas.clear(); + console.log('ImageLoaderPlugin: Canvas cleared in Single mode'); + } + + this.canvas.requestRenderAll(); + } else { + console.warn(`ImageLoaderPlugin: Image with ID=${id} not found`); + } + } + + onImageRemove({ id }) { + console.log(`ImageLoaderPlugin: Received request to remove image ID=${id}`); + this.removeImageById(id); + } + + destroy() { + if (this.uiContainer && this.uiContainer.parentNode) { + this.uiContainer.parentNode.removeChild(this.uiContainer); + } + this.detachEventListeners(); + this.loadedImages.forEach(({ imageObject, borderRect }) => { + this.canvas.remove(imageObject); + this.canvas.remove(borderRect); + }); + this.loadedImages = []; + this.originalImages = {}; + this.canvas.requestRenderAll(); + } +} diff --git a/web/core/js/common/components/canvas/MaskBrushPlugin.js b/web/core/js/common/components/canvas/MaskBrushPlugin.js new file mode 100644 index 0000000..14490e3 --- /dev/null +++ b/web/core/js/common/components/canvas/MaskBrushPlugin.js @@ -0,0 +1,1271 @@ +import { CustomBrushPlugin } from './CustomBrushPlugin.js'; + +export class MaskBrushPlugin extends CustomBrushPlugin { + constructor(options = {}) { + super({ ...options, name: 'MaskBrushPlugin' }); + + this.masks = []; + this.currentMask = null; + this.maskStrokeHistory = {}; // { maskName: { undoStack: [], redoStack: [] } } + this.brushIcon = '/core/media/ui/double-face-mask.png'; + + this.onAddMask = this.onAddMask.bind(this); + this.onChangeMask = this.onChangeMask.bind(this); + this.onChangeMaskColor = this.onChangeMaskColor.bind(this); + this.onMoveMaskUp = this.onMoveMaskUp.bind(this); + this.onMoveMaskDown = this.onMoveMaskDown.bind(this); + this.onApplyColorToExistingMaskChange = this.onApplyColorToExistingMaskChange.bind(this); + this.onHandleSave = this.onHandleSave.bind(this); + this.onRemoveMask = this.onRemoveMask.bind(this); + this.onImageLoaded = this.onImageLoaded.bind(this); + this.onCanvasStateChanged = this.onCanvasStateChanged.bind(this); + this.onHandleSaveFromCanvas = this.onHandleSaveFromCanvas.bind(this); + this.onWindowResize = this.onWindowResize.bind(this); + this.onUndoMaskStroke = this.onUndoMaskStroke.bind(this); + this.onRedoMaskStroke = this.onRedoMaskStroke.bind(this); + } + + init(canvasManager) { + super.init(canvasManager); + + if (this.brushOpacityInput && this.brushOpacityInput.parentElement) { + this.brushOpacityInput.parentElement.style.display = 'none'; + } + + this.extendUI(); + + this.attachAdditionalEventListeners(); + + this.canvasManager.on('image:loaded', this.onImageLoaded); + this.canvasManager.on('canvas:state:changed', this.onCanvasStateChanged); + this.canvasManager.on('undo:mask:stroke', this.onUndoMaskStroke); + this.canvasManager.on('redo:mask:stroke', this.onRedoMaskStroke); + + window.addEventListener('resize', this.onWindowResize); + + this.canvasManager.on('save:trigger', this.onHandleSaveFromCanvas); + } + + extendUI() { + const styleSheet = document.createElement('style'); + styleSheet.textContent = ` + + `; + document.head.appendChild(styleSheet); + + const temp = document.createElement('div'); + temp.innerHTML = ` +
+
+ + +
+
+ +
+ + +
+ + +
+ +
+ + +
+ + + + + +
+ `; + + while (temp.firstChild) { + this.uiContainer.appendChild(temp.firstChild); + } + + this.addMaskBtn = this.uiContainer.querySelector('#addMaskBtn'); + this.maskList = this.uiContainer.querySelector('#maskList'); + this.applyColorToMaskCheckbox = this.uiContainer.querySelector('#applyColorToMaskCheckbox'); + this.moveMaskUpBtn = this.uiContainer.querySelector('#moveMaskUpBtn'); + this.moveMaskDownBtn = this.uiContainer.querySelector('#moveMaskDownBtn'); + this.removeMaskBtn = this.uiContainer.querySelector('#removeMaskBtn'); + this.saveOptionsSelect = this.uiContainer.querySelector('#saveOptionsSelect'); + this.saveMaskBtn = this.uiContainer.querySelector('#saveMaskBtn'); + + this.saveOptions = [ + { + value: 'saveMaskAlphaOnImage', + text: 'Mask As Alpha on Image', + handler: () => this.saveMaskAlphaOnImage(), + exportFunction: () => this.exportMaskAlphaOnImage(), + show: true, + }, + { + value: 'saveAllMasksAlphaOnImage', + text: 'All Masks As Alpha on Image', + handler: () => this.saveAllMasksAlphaOnImage(), + exportFunction: () => this.exportAllMasksAlphaOnImage(), + show: true, + }, + { + value: 'saveAllMasksCombinedAlphaOnImage', + text: 'All Masks As Alpha Combined on Image', + handler: () => this.saveAllMasksCombinedAlphaOnImage(), + exportFunction: () => this.exportAllMasksCombinedAlphaOnImage(), + show: true, + }, + { + value: 'saveMask', + text: 'Mask', + handler: () => this.saveMask(), + exportFunction: () => this.exportMask(), + show: true, + }, + { + value: 'saveAllMasks', + text: 'All Masks', + handler: () => this.saveAllMasks(), + exportFunction: () => this.exportMasksImage(), + show: true, + }, + { + value: 'saveAllMasksCombined', + text: 'All Masks Combined', + handler: () => this.saveAllMasksCombined(), + exportFunction: () => this.exportAllMasksCombined(), + show: true, + }, + { + value: 'saveAllMasksCombinedBW', + text: 'All Masks Combined (B&W)', + handler: () => this.saveAllMasksCombinedBlackWhite(), + exportFunction: () => this.exportMasksCombinedBlackWhite(), + show: true, + }, + { + value: 'saveMaskOnImage', + text: 'Mask on Image', + handler: () => this.saveMaskOnImage(), + exportFunction: () => this.exportMaskOnImage(), + show: true, + }, + { + value: 'saveAllMasksOnImage', + text: 'All Masks on Image', + handler: () => this.saveAllMasksOnImage(), + exportFunction: () => this.exportAllMasksOnImage(), + show: true, + }, + { + value: 'saveAllMasksCombinedOnImage', + text: 'All Masks Combined on Image', + handler: () => this.saveAllMasksCombinedOnImage(), + exportFunction: () => this.exportAllMasksCombinedOnImage(), + show: true, + }, + { + value: 'saveAllMasksCombinedBWOnImage', + text: 'All Masks Combined (B&W) on Image', + handler: () => this.saveAllMasksCombinedBlackWhiteOnImage(), + exportFunction: () => this.exportAllMasksCombinedBlackWhiteOnImage(), + show: true, + }, + ]; + + this.saveOptions.forEach(optionData => { + if (optionData.show) { + const option = document.createElement('option'); + option.value = optionData.value; + option.text = optionData.text; + this.saveOptionsSelect.add(option); + } + }); + } + + + attachAdditionalEventListeners() { + this.addMaskBtn.addEventListener('click', this.onAddMask); + this.maskList.addEventListener('change', this.onChangeMask); + this.colorPicker.addEventListener('input', this.onChangeMaskColor); + this.applyColorToMaskCheckbox.addEventListener('change', this.onApplyColorToExistingMaskChange); + this.moveMaskUpBtn.addEventListener('click', this.onMoveMaskUp); + this.moveMaskDownBtn.addEventListener('click', this.onMoveMaskDown); + this.removeMaskBtn.addEventListener('click', this.onRemoveMask); + + this.saveMaskBtn.addEventListener('click', this.onHandleSave); + } + + detachAdditionalEventListeners() { + this.addMaskBtn.removeEventListener('click', this.onAddMask); + this.maskList.removeEventListener('change', this.onChangeMask); + this.colorPicker.removeEventListener('input', this.onChangeMaskColor); + this.applyColorToMaskCheckbox.removeEventListener('change', this.onApplyColorToExistingMaskChange); + this.moveMaskUpBtn.removeEventListener('click', this.onMoveMaskUp); + this.moveMaskDownBtn.removeEventListener('click', this.onMoveMaskDown); + this.removeMaskBtn.removeEventListener('click', this.onRemoveMask); + + this.saveMaskBtn.removeEventListener('click', this.onHandleSave); + + this.canvasManager.off('image:loaded', this.onImageLoaded); + this.canvasManager.off('canvas:state:changed', this.onCanvasStateChanged); + this.canvasManager.off('undo:mask:stroke', this.onUndoMaskStroke); + this.canvasManager.off('redo:mask:stroke', this.onRedoMaskStroke); + + window.removeEventListener('resize', this.onWindowResize); + + this.canvasManager.off('save:trigger', this.onHandleSaveFromCanvas); + } + + onWindowResize() { + if (typeof this.onImageModified === 'function') { + this.onImageModified(); + } else { + console.error('onImageModified method is not defined or not bound correctly.'); + } + } + + onImageLoaded(event) { + const { image, originalWidth, originalHeight, scaleFactor } = event; + + this.imageObject = image; + this.imageOriginalWidth = originalWidth; + this.imageOriginalHeight = originalHeight; + this.imageScaleFactor = scaleFactor; + + this.imageObject.on('modified', this.onImageModified); + + this.masks.forEach(mask => { + this.canvas.remove(mask.fabricImage); + }); + this.masks = []; + this.currentMask = null; + this.maskList.options.length = 0; + + this.maskStrokeHistory = {}; + + this.onAddMask(); + } + + onImageModified() { + if (!this.imageObject) { + console.error('Image object is not defined.'); + return; + } + + this.masks.forEach(mask => { + mask.fabricImage.set({ + scaleX: this.imageObject.scaleX, + scaleY: this.imageObject.scaleY, + left: this.imageObject.left, + top: this.imageObject.top, + originX: this.imageObject.originX, + originY: this.imageObject.originY, + }); + mask.fabricImage.setCoords(); + }); + this.canvas.renderAll(); + } + + onCanvasStateChanged() { + this.masks.forEach(mask => { + if (mask.fabricImage) { + mask.fabricImage.selectable = !this.drawingMode; + mask.fabricImage.evented = !this.drawingMode; + } + }); + this.canvas.renderAll(); + } + + onAddMask() { + if (!this.imageObject) { + alert('Please load an image before adding masks.'); + return; + } + + const maskName = `Mask ${this.maskList.options.length + 1}`; + const color = this.brushColor; + + const maskCanvas = document.createElement('canvas'); + maskCanvas.width = this.imageOriginalWidth; + maskCanvas.height = this.imageOriginalHeight; + const maskCtx = maskCanvas.getContext('2d'); + + maskCtx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); + + const maskFabricImage = new fabric.Image(maskCanvas, { + left: this.imageObject.left, + top: this.imageObject.top, + originX: this.imageObject.originX, + originY: this.imageObject.originY, + selectable: false, + evented: false, + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + hasControls: false, + hasBorders: false, + hoverCursor: 'default', + opacity: this.brushOpacity, + scaleX: this.imageObject.scaleX, + scaleY: this.imageObject.scaleY, + willReadFrequently: true, + }); + + this.canvas.add(maskFabricImage); + maskFabricImage.bringToFront(); + + const mask = { + name: maskName, + color: color, + fabricImage: maskFabricImage, + canvasEl: maskCanvas, + ctx: maskCtx, + }; + + this.masks.push(mask); + this.currentMask = mask; + + this.maskStrokeHistory[maskName] = { + undoStack: [], + redoStack: [] + }; + + const option = document.createElement('option'); + option.value = maskName; + option.text = maskName; + option.dataset.color = color; + this.maskList.add(option); + this.maskList.value = maskName; + + this.updateBrushColorAndCursor(); + } + + onChangeMask() { + const selectedOption = this.maskList.options[this.maskList.selectedIndex]; + const maskName = selectedOption.value; + const color = selectedOption.dataset.color; + + this.currentMask = this.masks.find(m => m.name === maskName); + this.brushColor = color; + + this.colorPicker.value = color; + + this.updateBrushColorAndCursor(); + } + + onChangeMaskColor() { + const color = this.brushColor = this.colorPicker.value; + const selectedOption = this.maskList.options[this.maskList.selectedIndex]; + if (selectedOption) { + selectedOption.dataset.color = color; + } + + const applyToExistingMask = this.applyColorToMaskCheckbox.checked; + + if (this.currentMask) { + this.currentMask.color = color; + + if (applyToExistingMask) { + this.applyColorToExistingMask(this.currentMask, color); + this.canvas.renderAll(); + } + + this.updateBrushColorAndCursor(); + } + } + + applyColorToExistingMask(mask, newColor) { + if (!mask || !mask.ctx) { + console.error('Cannot apply color: mask or its context is null.'); + return; + } + + const ctx = mask.ctx; + const canvasEl = mask.canvasEl; + const imageData = ctx.getImageData(0, 0, canvasEl.width, canvasEl.height); + const data = imageData.data; + + const tempElem = document.createElement('div'); + tempElem.style.color = newColor; + document.body.appendChild(tempElem); + const rgbColor = window.getComputedStyle(tempElem).color; + document.body.removeChild(tempElem); + + const rgbMatch = rgbColor.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); + if (!rgbMatch) { + console.error('Failed to parse new color.'); + return; + } + + const rNew = parseInt(rgbMatch[1]); + const gNew = parseInt(rgbMatch[2]); + const bNew = parseInt(rgbMatch[3]); + + for (let i = 0; i < data.length; i += 4) { + const alpha = data[i + 3]; + if (alpha > 0) { + data[i] = rNew; // Red + data[i + 1] = gNew; // Green + data[i + 2] = bNew; // Blue + } + } + + ctx.putImageData(imageData, 0, 0); + mask.fabricImage.dirty = true; + } + + onApplyColorToExistingMaskChange() { + //can be used if additional actions are needed when the checkbox state changes + } + + onMoveMaskUp() { + const index = this.maskList.selectedIndex; + if (index > 0) { + const option = this.maskList.options[index]; + this.maskList.remove(index); + this.maskList.add(option, index - 1); + this.maskList.selectedIndex = index - 1; + + const mask = this.masks.splice(index, 1)[0]; + this.masks.splice(index - 1, 0, mask); + + const imageIndex = this.canvas.getObjects().indexOf(this.imageObject); + const newZIndex = imageIndex + 1 + (index - 1); + this.canvas.moveTo(mask.fabricImage, newZIndex); + this.canvas.renderAll(); + } + } + + onMoveMaskDown() { + const index = this.maskList.selectedIndex; + if (index < this.maskList.options.length - 1) { + const option = this.maskList.options[index]; + this.maskList.remove(index); + this.maskList.add(option, index + 1); + this.maskList.selectedIndex = index + 1; + + const mask = this.masks.splice(index, 1)[0]; + this.masks.splice(index + 1, 0, mask); + + const imageIndex = this.canvas.getObjects().indexOf(this.imageObject); + const newZIndex = imageIndex + 1 + (index + 1); + this.canvas.moveTo(mask.fabricImage, newZIndex); + this.canvas.renderAll(); + } + } + + onRemoveMask() { + if (this.masks.length === 0) { + alert('No masks available to remove.'); + return; + } + + const selectedIndex = this.maskList.selectedIndex; + if (selectedIndex === -1) { + alert('Please select a mask to remove.'); + return; + } + + const maskName = this.maskList.options[selectedIndex].value; + const mask = this.masks.find(m => m.name === maskName); + + if (!mask) { + alert('Selected mask not found.'); + return; + } + + const confirmRemoval = confirm(`Are you sure you want to remove "${maskName}"?`); + if (!confirmRemoval) { + return; + } + + this.canvas.remove(mask.fabricImage); + + this.masks = this.masks.filter(m => m.name !== maskName); + + delete this.maskStrokeHistory[maskName]; + + this.maskList.remove(selectedIndex); + + if (this.masks.length > 0) { + const newIndex = selectedIndex > 0 ? selectedIndex - 1 : 0; + this.maskList.selectedIndex = newIndex; + this.currentMask = this.masks[newIndex]; + } else { + this.currentMask = null; + } + + this.updateBrushColorAndCursor(); + + this.canvas.renderAll(); + } + + updateBrushColorAndCursor() { + if (this.currentMask) { + this.brushColor = this.currentMask.color; + this.updateCursorCircle(); + this.canvas.requestRenderAll(); + } else { + + this.brushColor = '#FF0000'; + this.updateCursorCircle(); + this.canvas.requestRenderAll(); + } + } + + onMouseDown(o) { + if (!this.currentMask || !this.currentMask.ctx) { + console.error('Cannot draw: currentMask or its context is null.'); + return; + } + + this.isMouseDown = true; + this.isStrokeInProgress = true; + + const pointer = this.canvas.getPointer(o.e, true); + const transformedPointer = this.mapPointerToImageSpace(pointer); + + if (!this.isPointerInsideImage(transformedPointer)) { + this.isMouseDown = false; + this.isStrokeInProgress = false; + return; + } + + this.lastPointer = transformedPointer; + + const imageDataBefore = this.currentMask.ctx.getImageData(0, 0, this.currentMask.canvasEl.width, this.currentMask.canvasEl.height); + this.maskStrokeHistory[this.currentMask.name].undoStack.push(imageDataBefore); + if (this.maskStrokeHistory[this.currentMask.name].undoStack.length > this.maxHistory) { + this.maskStrokeHistory[this.currentMask.name].undoStack.shift(); + } + + this.maskStrokeHistory[this.currentMask.name].redoStack = []; + + this.drawOnMask(transformedPointer); + } + + onMouseMove(o) { + if (!this.currentMask || !this.currentMask.ctx) { + console.error('Cannot draw: currentMask or its context is null.'); + return; + } + + const pointer = this.canvas.getPointer(o.e, true); + const transformedPointer = this.mapPointerToImageSpace(pointer); + + this.updateCursorPosition(o); + + if (this.isMouseDown && this.isStrokeInProgress) { + if (!this.isPointerInsideImage(transformedPointer)) { + return; + } + + this.drawLineOnMask(this.lastPointer, transformedPointer); + this.lastPointer = transformedPointer; + } + + this.canvas.requestRenderAll(); + } + + onMouseUp() { + if (this.isMouseDown) { + this.isMouseDown = false; + this.isStrokeInProgress = false; + } + } + + onUndoMaskStroke(strokeData) { + console.log('MaskBrushPlugin: Undoing mask stroke', strokeData); + if (strokeData.type === 'add') { + this.undoLastStroke(strokeData.maskName); + } + } + + onRedoMaskStroke(strokeData) { + console.log('MaskBrushPlugin: Redoing mask stroke', strokeData); + if (strokeData.type === 'add') { + this.redoLastStroke(strokeData.maskName, strokeData); + } + } + + undoLastStroke(maskName) { + const history = this.maskStrokeHistory[maskName]; + if (!history || history.undoStack.length === 0) { + console.warn(`No undo actions available for mask "${maskName}".`); + return; + } + + const lastState = history.undoStack.pop(); + + const currentState = this.currentMask.ctx.getImageData(0, 0, this.currentMask.canvasEl.width, this.currentMask.canvasEl.height); + history.redoStack.push(currentState); + + this.currentMask.ctx.putImageData(lastState, 0, 0); + this.currentMask.fabricImage.dirty = true; + this.canvas.renderAll(); + } + + redoLastStroke(maskName, strokeData) { + const history = this.maskStrokeHistory[maskName]; + if (!history || history.redoStack.length === 0) { + console.warn(`No redo actions available for mask "${maskName}".`); + return; + } + + const redoState = history.redoStack.pop(); + const currentState = this.currentMask.ctx.getImageData(0, 0, this.currentMask.canvasEl.width, this.currentMask.canvasEl.height); + history.undoStack.push(currentState); + + this.currentMask.ctx.putImageData(redoState, 0, 0); + this.currentMask.fabricImage.dirty = true; + this.canvas.renderAll(); + } + + mapPointerToImageSpace(pointer) { + if (!this.imageObject) { + console.error('Image object is not defined.'); + return { x: 0, y: 0 }; + } + + const img = this.imageObject; + const viewportTransform = this.canvas.viewportTransform; + const invViewportTransform = fabric.util.invertTransform(viewportTransform); + + const canvasPoint = new fabric.Point(pointer.x, pointer.y); + + const imagePoint = fabric.util.transformPoint(canvasPoint, invViewportTransform); + const relativeX = (imagePoint.x - img.left) / img.scaleX + (this.imageOriginalWidth / 2); + const relativeY = (imagePoint.y - img.top) / img.scaleY + (this.imageOriginalHeight / 2); + + return { x: relativeX, y: relativeY }; + } + + isPointerInsideImage(point) { + return ( + point.x >= 0 && + point.x <= this.imageOriginalWidth && + point.y >= 0 && + point.y <= this.imageOriginalHeight + ); + } + + drawOnMask(point) { + if (!this.imageObject) { + console.error('Image object is not defined.'); + return; + } + + this.currentMask.ctx.globalAlpha = 1; + + const adjustedBrushSize = this.brushSize / (this.currentZoom * this.imageObject.scaleX); + + this.currentMask.ctx.fillStyle = this.brushColor; + this.currentMask.ctx.beginPath(); + this.currentMask.ctx.arc(point.x, point.y, adjustedBrushSize / 2, 0, Math.PI * 2); + this.currentMask.ctx.fill(); + this.currentMask.fabricImage.dirty = true; + + const strokeData = { + type: 'add', + maskName: this.currentMask.name, + color: this.brushColor, + position: { x: point.x, y: point.y }, + brushSize: adjustedBrushSize + }; + this.canvasManager.emit('mask:stroke:added', strokeData); + } + + drawLineOnMask(fromPoint, toPoint) { + if (!this.imageObject) { + console.error('Image object is not defined.'); + return; + } + + this.currentMask.ctx.globalAlpha = 1; + + const adjustedBrushSize = this.brushSize / (this.currentZoom * this.imageObject.scaleX); + + this.currentMask.ctx.strokeStyle = this.brushColor; + this.currentMask.ctx.lineWidth = adjustedBrushSize; + this.currentMask.ctx.lineCap = 'round'; + this.currentMask.ctx.beginPath(); + this.currentMask.ctx.moveTo(fromPoint.x, fromPoint.y); + this.currentMask.ctx.lineTo(toPoint.x, toPoint.y); + this.currentMask.ctx.stroke(); + this.currentMask.fabricImage.dirty = true; + + const strokeData = { + type: 'add', + maskName: this.currentMask.name, + color: this.brushColor, + from: { x: fromPoint.x, y: fromPoint.y }, + to: { x: toPoint.x, y: toPoint.y }, + brushSize: adjustedBrushSize + }; + this.canvasManager.emit('mask:stroke:added', strokeData); + } + + onHandleSave() { + const selectedOption = this.saveOptionsSelect.value; + + const option = this.saveOptions.find(opt => opt.value === selectedOption); + if (option && option.handler) { + option.handler(); + } else { + console.error('Unknown save option selected.'); + } + } + + onHandleSaveFromCanvas(selectedOption) { + const option = this.saveOptions.find(opt => opt.value === selectedOption); + if (option && option.handler) { + option.handler(); + } else { + console.error('Unknown save option selected.'); + } + } + + getExportFunction(optionValue) { + return this.saveOptions.find(opt => opt.value === optionValue)?.exportFunction || null; + } + + createCombinedAlphaMask() { + const alphaCanvas = document.createElement('canvas'); + alphaCanvas.width = this.imageOriginalWidth; + alphaCanvas.height = this.imageOriginalHeight; + const alphaCtx = alphaCanvas.getContext('2d'); + + alphaCtx.clearRect(0, 0, alphaCanvas.width, alphaCanvas.height); + this.masks.forEach(mask => { + alphaCtx.drawImage(mask.canvasEl, 0, 0, alphaCanvas.width, alphaCanvas.height); + }); + + return alphaCanvas; + } + + exportMaskAlphaOnImage() { + if (!this.imageObject) { + alert('No image loaded to save the alpha on.'); + return null; + } + + if (!this.currentMask) { + alert('No mask selected to save as alpha.'); + return null; + } + + try { + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + const alphaMask = document.createElement('canvas'); + alphaMask.width = this.imageOriginalWidth; + alphaMask.height = this.imageOriginalHeight; + const alphaCtx = alphaMask.getContext('2d'); + alphaCtx.drawImage(this.currentMask.canvasEl, 0, 0, alphaMask.width, alphaMask.height); + + combinedCtx.globalCompositeOperation = 'destination-out'; + combinedCtx.drawImage(alphaMask, 0, 0, combinedCanvas.width, combinedCanvas.height); + combinedCtx.globalCompositeOperation = 'source-over'; + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + + } catch (error) { + console.error('Error saving single mask alpha on image:', error); + alert('An error occurred while saving the single mask alpha on image.'); + return null; + } + } + + exportAllMasksAlphaOnImage() { + if (!this.imageObject) { + alert('No image loaded to save the alphas on.'); + return null; + } + + if (this.masks.length === 0) { + alert('No masks available to save as alphas.'); + return null; + } + + try { + const dataURLs = this.masks.map(mask => { + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + const alphaMask = document.createElement('canvas'); + alphaMask.width = this.imageOriginalWidth; + alphaMask.height = this.imageOriginalHeight; + const alphaCtx = alphaMask.getContext('2d'); + alphaCtx.drawImage(mask.canvasEl, 0, 0, alphaMask.width, alphaMask.height); + + combinedCtx.globalCompositeOperation = 'destination-out'; + combinedCtx.drawImage(alphaMask, 0, 0, combinedCanvas.width, combinedCanvas.height); + combinedCtx.globalCompositeOperation = 'source-over'; + + return { + dataURL: combinedCanvas.toDataURL('image/png'), + filename: `${mask.name}_alpha_on_image.png` + }; + }); + + return dataURLs; + + } catch (error) { + console.error('Error saving all masks alphas on image:', error); + alert('An error occurred while saving all masks alphas on image.'); + return null; + } + } + + exportAllMasksCombinedAlphaOnImage() { + if (!this.imageObject) { + alert('No image loaded to save the combined alpha on.'); + return null; + } + + if (this.masks.length === 0) { + alert('No masks available to save as combined alpha.'); + return null; + } + + try { + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + const alphaMask = this.createCombinedAlphaMask(); + + combinedCtx.globalCompositeOperation = 'destination-out'; + combinedCtx.drawImage(alphaMask, 0, 0, combinedCanvas.width, combinedCanvas.height); + combinedCtx.globalCompositeOperation = 'source-over'; + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + + } catch (error) { + console.error('Error saving combined masks alpha on image:', error); + alert('An error occurred while saving the combined masks alpha on image.'); + return null; + } + } + + //Mask + exportMask() { + if (!this.currentMask) { + alert('No mask selected to export.'); + return null; + } + + try { + const dataURL = this.currentMask.canvasEl.toDataURL('image/png'); + return dataURL; + } catch (error) { + console.error('Error exporting single mask image:', error); + alert('An error occurred while exporting the single mask image.'); + return null; + } + } + + exportAllMasks() { + if (!this.imageObject) { + alert('No image loaded to export masks on.'); + return null; + } + + if (this.masks.length === 0) { + alert('No masks available to export on image.'); + return null; + } + + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + this.masks.forEach(mask => { + combinedCtx.drawImage(mask.canvasEl, 0, 0, combinedCanvas.width, combinedCanvas.height); + }); + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + } + + exportAllMasksCombined() { + if (this.masks.length === 0) { + alert('No masks available to export.'); + return null; + } + + try { + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + this.masks.forEach(mask => { + combinedCtx.drawImage(mask.canvasEl, 0, 0, combinedCanvas.width, combinedCanvas.height); + }); + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + } catch (error) { + console.error('Error exporting combined masks image:', error); + alert('An error occurred while exporting the combined masks image.'); + return null; + } + } + + exportMasksCombinedBlackWhite() { + if (this.masks.length === 0) { + alert('No masks available to export.'); + return null; + } + + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.fillStyle = 'black'; + combinedCtx.fillRect(0, 0, combinedCanvas.width, combinedCanvas.height); + + this.masks.forEach(mask => { + const maskCanvas = document.createElement('canvas'); + maskCanvas.width = this.imageOriginalWidth; + maskCanvas.height = this.imageOriginalHeight; + const maskCtx = maskCanvas.getContext('2d'); + + maskCtx.drawImage(mask.canvasEl, 0, 0, maskCanvas.width, maskCanvas.height); + + const imageData = maskCtx.getImageData(0, 0, maskCanvas.width, maskCanvas.height); + const data = imageData.data; + + for (let i = 0; i < data.length; i += 4) { + const alpha = data[i + 3]; + if (alpha > 0) { + data[i] = 255; + data[i + 1] = 255; + data[i + 2] = 255; + } + } + + maskCtx.putImageData(imageData, 0, 0); + + combinedCtx.drawImage(maskCanvas, 0, 0, combinedCanvas.width, combinedCanvas.height); + }); + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + } + + //Mask on image + exportMaskOnImage() { + if (!this.imageObject) { + alert('No image loaded to export mask on.'); + return null; + } + + if (!this.currentMask) { + alert('No mask selected to export on image.'); + return null; + } + + try { + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + combinedCtx.drawImage(this.currentMask.canvasEl, 0, 0, combinedCanvas.width, combinedCanvas.height); + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + } catch (error) { + console.error('Error exporting single mask on image:', error); + alert('An error occurred while exporting the single mask on image.'); + return null; + } + } + + exportAllMasksOnImage() { + if (!this.imageObject) { + alert('No image loaded to export masks on.'); + return null; + } + + if (this.masks.length === 0) { + alert('No masks available to export on image.'); + return null; + } + + try { + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + this.masks.forEach(mask => { + combinedCtx.drawImage(mask.canvasEl, 0, 0, combinedCanvas.width, combinedCanvas.height); + }); + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + } catch (error) { + console.error('Error exporting all masks on image:', error); + alert('An error occurred while exporting all masks on image.'); + return null; + } + } + + exportAllMasksCombinedOnImage() { + if (!this.imageObject) { + alert('No image loaded to export combined masks on.'); + return null; + } + + if (this.masks.length === 0) { + alert('No masks available to export combined on image.'); + return null; + } + + try { + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + const combinedMaskCanvas = this.createCombinedAlphaMask(); + combinedCtx.drawImage(combinedMaskCanvas, 0, 0, combinedCanvas.width, combinedCanvas.height); + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + } catch (error) { + console.error('Error exporting combined masks on image:', error); + alert('An error occurred while exporting combined masks on image.'); + return null; + } + } + + exportAllMasksCombinedBlackWhiteOnImage() { + if (!this.imageObject) { + alert('No image loaded to export masks on.'); + return null; + } + + if (this.masks.length === 0) { + alert('No masks available to export on image.'); + return null; + } + + const combinedCanvas = document.createElement('canvas'); + combinedCanvas.width = this.imageOriginalWidth; + combinedCanvas.height = this.imageOriginalHeight; + const combinedCtx = combinedCanvas.getContext('2d'); + + combinedCtx.drawImage(this.imageObject.getElement(), 0, 0, combinedCanvas.width, combinedCanvas.height); + + const tempMasksCanvas = document.createElement('canvas'); + tempMasksCanvas.width = this.imageOriginalWidth; + tempMasksCanvas.height = this.imageOriginalHeight; + const tempMasksCtx = tempMasksCanvas.getContext('2d'); + + tempMasksCtx.fillStyle = 'black'; + tempMasksCtx.fillRect(0, 0, tempMasksCanvas.width, tempMasksCanvas.height); + + this.masks.forEach(mask => { + const maskCanvas = document.createElement('canvas'); + maskCanvas.width = this.imageOriginalWidth; + maskCanvas.height = this.imageOriginalHeight; + const maskCtx = maskCanvas.getContext('2d'); + + maskCtx.drawImage(mask.canvasEl, 0, 0, maskCanvas.width, maskCanvas.height); + + const imageData = maskCtx.getImageData(0, 0, maskCanvas.width, maskCanvas.height); + const data = imageData.data; + + for (let i = 0; i < data.length; i += 4) { + const alpha = data[i + 3]; + if (alpha > 0) { + data[i] = 255; + data[i + 1] = 255; + data[i + 2] = 255; + } + } + + maskCtx.putImageData(imageData, 0, 0); + + tempMasksCtx.drawImage(maskCanvas, 0, 0, tempMasksCanvas.width, tempMasksCanvas.height); + }); + + combinedCtx.drawImage(tempMasksCanvas, 0, 0, combinedCanvas.width, combinedCanvas.height); + + const combinedDataURL = combinedCanvas.toDataURL('image/png'); + return combinedDataURL; + } + + saveMaskAlphaOnImage() { + const dataURL = this.exportMaskAlphaOnImage(); + if (dataURL) { + this.downloadImage(dataURL, `${this.currentMask.name}_alpha_on_image.png`); + } + } + + saveAllMasksAlphaOnImage() { + const dataURLs = this.exportAllMasksAlphaOnImage(); + if (dataURLs) { + dataURLs.forEach(({ dataURL, filename }) => { + this.downloadImage(dataURL, filename); + }); + } + } + + saveAllMasksCombinedAlphaOnImage() { + const dataURL = this.exportAllMasksCombinedAlphaOnImage(); + if (dataURL) { + this.downloadImage(dataURL, 'combined_masks_alpha_on_image.png'); + } + } + + saveMask() { + if (this.currentMask && this.currentMask.canvasEl) { + const dataURL = this.exportMask(); + if (dataURL) { + this.downloadImage(dataURL, `${this.currentMask.name}.png`); + } + } else { + alert('No current mask data available to save.'); + } + } + + saveAllMasks() { + if (this.masks.length > 0) { + this.masks.forEach((mask) => { + const dataURL = mask.canvasEl.toDataURL('image/png'); + this.downloadImage(dataURL, `${mask.name}.png`); + }); + } else { + alert('No mask data available to save.'); + } + } + + saveAllMasksCombined() { + const combinedDataURL = this.exportAllMasksCombined(); + if (combinedDataURL) { + this.downloadImage(combinedDataURL, 'combined_masks.png'); + } + } + + saveAllMasksCombinedBlackWhite() { + const combinedDataURL = this.exportMasksCombinedBlackWhite(); + if (combinedDataURL) { + this.downloadImage(combinedDataURL, 'combined_masks_black_white.png'); + } + } + + saveMaskOnImage() { + const dataURL = this.exportMaskOnImage(); + if (dataURL) { + this.downloadImage(dataURL, `${this.currentMask.name}_on_image.png`); + } + } + + saveAllMasksOnImage() { + const dataURL = this.exportAllMasksOnImage(); + if (dataURL) { + this.downloadImage(dataURL, 'all_masks_on_image.png'); + } + } + + saveAllMasksCombinedOnImage() { + const dataURL = this.exportAllMasksCombinedOnImage(); + if (dataURL) { + this.downloadImage(dataURL, 'combined_masks_on_image.png'); + } + } + + saveAllMasksCombinedBlackWhiteOnImage() { + const combinedDataURL = this.exportAllMasksCombinedBlackWhiteOnImage(); + if (combinedDataURL) { + this.downloadImage(combinedDataURL, 'combined_masks_black_white_on_image.png'); + } + } + + downloadImage(dataUrl, filename) { + const link = document.createElement('a'); + link.href = dataUrl; + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + + destroy() { + this.detachAdditionalEventListeners(); + + this.masks.forEach(mask => { + this.canvas.remove(mask.fabricImage); + }); + this.masks = []; + this.currentMask = null; + + if (this.imageObject) { + this.imageObject.off('modified', this.onImageModified); + } + + this.canvasManager.off('undo:mask:stroke', this.onUndoMaskStroke); + this.canvasManager.off('redo:mask:stroke', this.onRedoMaskStroke); + + super.destroy(); + } +} diff --git a/web/core/js/common/components/canvas/UndoRedoPlugin.js b/web/core/js/common/components/canvas/UndoRedoPlugin.js new file mode 100644 index 0000000..5f4f8e6 --- /dev/null +++ b/web/core/js/common/components/canvas/UndoRedoPlugin.js @@ -0,0 +1,362 @@ +import { CanvasPlugin } from './CanvasPlugin.js'; + +export class UndoRedoPlugin extends CanvasPlugin { + constructor(options = {}) { + super(options.name || 'UndoRedoPlugin'); + + this.maxHistory = options.maxHistory || 50; + + this.undoStack = []; + this.redoStack = []; + + this.canvasManager = null; + this.canvas = null; + + this.undoBtn = null; + this.redoBtn = null; + + this.isPerformingUndoRedo = false; + + this.handleObjectAdded = this.handleObjectAdded.bind(this); + this.handleObjectRemoved = this.handleObjectRemoved.bind(this); + this.handleMaskStrokeAdded = this.handleMaskStrokeAdded.bind(this); + this.handleMaskStrokeRemoved = this.handleMaskStrokeRemoved.bind(this); + this.onUndo = this.onUndo.bind(this); + this.onRedo = this.onRedo.bind(this); + this.updateButtons = this.updateButtons.bind(this); + this.onKeyDown = this.onKeyDown.bind(this); + this.onFocus = this.onFocus.bind(this); + this.onBlur = this.onBlur.bind(this); + this.onMouseEnter = this.onMouseEnter.bind(this); + } + + init(canvasManager) { + this.canvasManager = canvasManager; + this.canvas = canvasManager.canvas; + + this.makeFocusable(); + + this.createUI(); + + this.canvas.on('object:added', this.handleObjectAdded); + this.canvas.on('object:removed', this.handleObjectRemoved); + this.canvasManager.on('mask:stroke:added', this.handleMaskStrokeAdded); + this.canvasManager.on('mask:stroke:removed', this.handleMaskStrokeRemoved); + + this.focusableElement.addEventListener('keydown', this.onKeyDown); + this.focusableElement.addEventListener('focus', this.onFocus); + this.focusableElement.addEventListener('blur', this.onBlur); + + this.focusableElement.addEventListener('mouseenter', this.onMouseEnter); + + this.updateButtons(); + } + + makeFocusable() { + const container = this.canvas.lowerCanvasEl.parentElement; + if (!container) { + console.error('UndoRedoPlugin: Canvas container not found.'); + return; + } + + container.setAttribute('tabindex', '0'); + container.style.outline = 'none'; + + this.focusableElement = container; + } + + handleObjectAdded(e) { + if (this.isPerformingUndoRedo) return; + + const obj = e.target; + if (this.isBrushStroke(obj)) { + // console.log('UndoRedoPlugin: Brush stroke added', obj); + + if (!obj.brushStrokeId) { + obj.brushStrokeId = `stroke_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; + obj.set('brushStrokeId', obj.brushStrokeId); + } + this.undoStack.push(obj.toObject(['type', 'path', 'stroke', 'strokeWidth', 'opacity', 'brushStrokeId'])); + if (this.undoStack.length > this.maxHistory) { + this.undoStack.shift(); + } + this.redoStack = []; + this.updateButtons(); + } + } + + handleObjectRemoved(e) { + if (this.isPerformingUndoRedo) return; + + const obj = e.target; + if (this.isBrushStroke(obj)) { + // console.log('UndoRedoPlugin: Brush stroke removed', obj); + this.redoStack.push(obj.toObject(['type', 'path', 'stroke', 'strokeWidth', 'opacity', 'brushStrokeId'])); + if (this.redoStack.length > this.maxHistory) { + this.redoStack.shift(); + } + this.updateButtons(); + } + } + + isBrushStroke(obj) { + const isPath = obj && obj.type === 'path'; + // console.log(`UndoRedoPlugin: isBrushStroke check for object type '${obj.type}': ${isPath}`); + return isPath; + } + + handleMaskStrokeAdded(strokeData) { + // console.log('UndoRedoPlugin: Mask stroke added', strokeData); + this.undoStack.push({ + type: 'mask_add', + maskName: strokeData.maskName, + strokeData: strokeData + }); + if (this.undoStack.length > this.maxHistory) { + this.undoStack.shift(); + } + this.redoStack = []; + this.updateButtons(); + } + + handleMaskStrokeRemoved(strokeData) { + // console.log('UndoRedoPlugin: Mask stroke removed', strokeData); + this.redoStack.push({ + type: 'mask_remove', + maskName: strokeData.maskName, + strokeData: strokeData + }); + if (this.redoStack.length > this.maxHistory) { + this.redoStack.shift(); + } + this.updateButtons(); + } + + createUI() { + if (!document.querySelector('style[data-plugin="undo-redo"]')) { + const styleSheet = document.createElement('style'); + styleSheet.setAttribute('data-plugin', 'undo-redo'); + styleSheet.textContent = ` + .ur-container * { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .ur-container { + display: inline-flex; + gap: 0.5rem; + padding: 0.5rem; + /* background: var(--color-background); */ + /* border: 1px dashed var(--color-border); */ + } + + .ur-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + background: var(--color-button-primary); + border: none; + cursor: pointer; + transition: all 0.2s; + color: var(--color-primary-text); + height: 36px; + min-width: 36px; + } + + .ur-button:hover { + background: var(--color-button-primary-hover); + } + + .ur-button svg { + width: 1.25rem; + height: 1.25rem; + } + + .ur-button:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + .ur-button:disabled:hover { + background: var(--color-button-primary); + } + `; + document.head.appendChild(styleSheet); + } + + const container = document.createElement('div'); + container.className = 'ur-container'; + + this.undoBtn = document.createElement('button'); + this.undoBtn.className = 'ur-button'; + this.undoBtn.innerHTML = ` + + + + `; + this.undoBtn.title = 'Undo (Ctrl+Z)'; + this.undoBtn.disabled = true; + this.undoBtn.addEventListener('click', this.onUndo); + + this.redoBtn = document.createElement('button'); + this.redoBtn.className = 'ur-button'; + this.redoBtn.innerHTML = ` + + + + `; + this.redoBtn.title = 'Redo (Ctrl+Y)'; + this.redoBtn.disabled = true; + this.redoBtn.addEventListener('click', this.onRedo); + + container.appendChild(this.undoBtn); + container.appendChild(this.redoBtn); + + const pluginUIContainer = document.getElementById('pluginUIContainer'); + if (pluginUIContainer) { + pluginUIContainer.appendChild(container); + } else { + console.error('UndoRedoPlugin: #pluginUIContainer not found in the DOM.'); + } + } + + onUndo() { + // console.log('UndoRedoPlugin: Undo.'); + + if (this.undoStack.length === 0) { + console.log('UndoRedoPlugin: Undo stack is empty.'); + return; + } + + const lastAction = this.undoStack.pop(); + // console.log('UndoRedoPlugin: Performing Undo', lastAction); + + this.isPerformingUndoRedo = true; + + if (lastAction.type === 'mask_add') { + this.canvasManager.emit('undo:mask:stroke', lastAction.strokeData); + this.redoStack.push(lastAction); + } else if (lastAction.type === 'mask_remove') { + this.canvasManager.emit('redo:mask:stroke', lastAction.strokeData); + this.redoStack.push(lastAction); + } else { + const brushStrokeId = lastAction.brushStrokeId; + const targetObj = this.canvas.getObjects('path').find(obj => obj.brushStrokeId === brushStrokeId); + if (targetObj) { + this.canvas.remove(targetObj); + this.redoStack.push(lastAction); + // console.log('UndoRedoPlugin: Brush stroke removed for Undo'); + } else { + console.warn('UndoRedoPlugin: Could not find the brush stroke object to undo.'); + } + } + + this.isPerformingUndoRedo = false; + + this.updateButtons(); + } + + onRedo() { + // console.log('UndoRedoPlugin: Redo.'); + + if (this.redoStack.length === 0) { + // console.log('UndoRedoPlugin: Redo stack is empty.'); + return; + } + + const lastUndone = this.redoStack.pop(); + // console.log('UndoRedoPlugin: Performing Redo', lastUndone); + + this.isPerformingUndoRedo = true; + + if (lastUndone.type === 'mask_add') { + this.canvasManager.emit('redo:mask:stroke', lastUndone.strokeData); + this.undoStack.push(lastUndone); + } else if (lastUndone.type === 'mask_remove') { + this.canvasManager.emit('undo:mask:stroke', lastUndone.strokeData); + this.undoStack.push(lastUndone); + } else { + const path = new fabric.Path(lastUndone.path, { + stroke: lastUndone.stroke, + strokeWidth: lastUndone.strokeWidth, + fill: null, + selectable: false, + evented: false, + hasControls: false, + hasBorders: false, + lockMovementX: true, + lockMovementY: true, + opacity: lastUndone.opacity, + brushStrokeId: lastUndone.brushStrokeId + }); + this.canvas.add(path); + this.undoStack.push(lastUndone); + // console.log('UndoRedoPlugin: Brush stroke re-added for Redo'); + } + + this.isPerformingUndoRedo = false; + + this.updateButtons(); + } + + updateButtons() { + this.undoBtn.disabled = this.undoStack.length === 0; + this.redoBtn.disabled = this.redoStack.length === 0; + // console.log(`UndoRedoPlugin: Update Buttons - Undo: ${!this.undoBtn.disabled}, Redo: ${!this.redoBtn.disabled}`); + } + + onKeyDown(e) { + if (this.isFocused) { + if (e.ctrlKey && (e.key === 'z' || e.key === 'Z')) { + e.preventDefault(); + this.onUndo(); + } + if (e.ctrlKey && (e.key === 'y' || e.key === 'Y')) { + e.preventDefault(); + this.onRedo(); + } + } + } + + onFocus() { + this.isFocused = true; + // console.log('UndoRedoPlugin: Canvas focused.'); + } + + onBlur() { + this.isFocused = false; + // console.log('UndoRedoPlugin: Canvas lost focus.'); + } + + onMouseEnter() { + this.focusableElement.focus(); + // console.log('UndoRedoPlugin: Canvas focused via mouse enter.'); + } + + destroy() { + this.canvas.off('object:added', this.handleObjectAdded); + this.canvas.off('object:removed', this.handleObjectRemoved); + this.canvasManager.off('mask:stroke:added', this.handleMaskStrokeAdded); + this.canvasManager.off('mask:stroke:removed', this.handleMaskStrokeRemoved); + if (this.focusableElement) { + this.focusableElement.removeEventListener('keydown', this.onKeyDown); + this.focusableElement.removeEventListener('focus', this.onFocus); + this.focusableElement.removeEventListener('blur', this.onBlur); + this.focusableElement.removeEventListener('mouseenter', this.onMouseEnter); + } + + const container = document.querySelector('.ur-container'); + if (container && this.undoBtn && this.redoBtn) { + container.removeChild(this.undoBtn); + container.removeChild(this.redoBtn); + } + + this.undoStack = []; + this.redoStack = []; + + super.destroy(); + } +} diff --git a/web/core/js/common/components/canvas/fabric.5.2.4.min.js b/web/core/js/common/components/canvas/fabric.5.2.4.min.js new file mode 100644 index 0000000..d28da51 --- /dev/null +++ b/web/core/js/common/components/canvas/fabric.5.2.4.min.js @@ -0,0 +1 @@ +var jsdom,virtualWindow,fabric=fabric||{version:"5.2.4"};function resizeCanvasIfNeeded(t){var e=t.targetCanvas,i=e.width,r=e.height,n=t.destinationWidth,t=t.destinationHeight;i===n&&r===t||(e.width=n,e.height=t)}function copyGLTo2DDrawImage(t,e){var t=t.canvas,e=e.targetCanvas,i=e.getContext("2d"),r=(i.translate(0,e.height),i.scale(1,-1),t.height-e.height);i.drawImage(t,0,r,e.width,e.height,0,0,e.width,e.height)}function copyGLTo2DPutImageData(t,e){var i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,e=e.destinationHeight,n=r*e*4,s=new Uint8Array(this.imageBuffer,0,n),n=new Uint8ClampedArray(this.imageBuffer,0,n),t=(t.readPixels(0,0,r,e,t.RGBA,t.UNSIGNED_BYTE,s),new ImageData(n,r,e));i.putImageData(t,0,0)}"undefined"!=typeof exports?exports.fabric=fabric:"function"==typeof define&&define.amd&&define([],function(){return fabric}),"undefined"!=typeof document&&"undefined"!=typeof window?(document instanceof("undefined"!=typeof HTMLDocument?HTMLDocument:Document)?fabric.document=document:fabric.document=document.implementation.createHTMLDocument(""),fabric.window=window):(jsdom=require("jsdom"),virtualWindow=new jsdom.JSDOM(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E"),{features:{FetchExternalResources:["img"]},resources:"usable"}).window,fabric.document=virtualWindow.document,fabric.jsdomImplForWrapper=require("jsdom/lib/jsdom/living/generated/utils").implForWrapper,fabric.nodeCanvas=require("jsdom/lib/jsdom/utils").Canvas,fabric.window=virtualWindow,DOMParser=fabric.window.DOMParser),fabric.isTouchSupported="ontouchstart"in fabric.window||"ontouchstart"in fabric.document||fabric.window&&fabric.window.navigator&&0_)for(var C=1,S=v.length;Ct[i-2].x?1:s.x===t[i-2].x?0:-1,h=s.y>t[i-2].y?1:s.y===t[i-2].y?0:-1),n.push(["L",s.x+c*e,s.y+h*e]),n},fabric.util.getPathSegmentsInfo=l,fabric.util.getBoundsOfCurve=function(t,e,i,r,n,s,o,a){var c;if(fabric.cachesBoundsOfCurve&&(c=w.call(arguments),fabric.boundsOfCurveCache[c]))return fabric.boundsOfCurveCache[c];for(var h,l,u,f=Math.sqrt,d=Math.min,g=Math.max,p=Math.abs,m=[],v=[[],[]],b=6*t-12*i+6*n,y=-3*t+9*i-9*n+3*o,_=3*i-3*t,x=0;x<2;++x)0/g,">")},graphemeSplit:function(t){for(var e,i=0,r=[],i=0;it.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,e){return void 0===e&&(e=.5),e=Math.max(Math.min(1,e),0),new i(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)},distanceFrom:function(t){var e=this.x-t.x,t=this.y-t.y;return Math.sqrt(e*e+t*t)},midPointFrom:function(t){return this.lerp(t)},min:function(t){return new i(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new i(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new i(this.x,this.y)}}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var a=t.fabric||(t.fabric={});function c(t){this.status=t,this.points=[]}a.Intersection?a.warn("fabric.Intersection is already defined"):(a.Intersection=c,a.Intersection.prototype={constructor:c,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},a.Intersection.intersectLineLine=function(t,e,i,r){var n,s=(r.x-i.x)*(t.y-i.y)-(r.y-i.y)*(t.x-i.x),o=(e.x-t.x)*(t.y-i.y)-(e.y-t.y)*(t.x-i.x),r=(r.y-i.y)*(e.x-t.x)-(r.x-i.x)*(e.y-t.y);return 0!=r?(i=o/r,0<=(r=s/r)&&r<=1&&0<=i&&i<=1?(n=new c("Intersection")).appendPoint(new a.Point(t.x+r*(e.x-t.x),t.y+r*(e.y-t.y))):n=new c):n=new c(0==s||0==o?"Coincident":"Parallel"),n},a.Intersection.intersectLinePolygon=function(t,e,i){for(var r,n,s=new c,o=i.length,a=0;a=o&&(s.x-=o),s.x<=-o&&(s.x+=o),s.y>=o&&(s.y-=o),s.y<=o&&(s.y+=o),s.x-=t.offsetX,s.y-=t.offsetY,s}function w(t){return t.flipX!==t.flipY}function O(t,e,i,r,n){0!==t[e]&&(e=n/t._getTransformedDimensions()[r]*t[i],t.set(i,e))}function P(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(0,s.skewY),i=T(e,e.originX,e.originY,i,r),r=Math.abs(2*i.x)-o.x,i=s.skewX,r=(r<2?n=0:(n=g(Math.atan2(r/s.scaleX,o.y/s.scaleY)),e.originX===c&&e.originY===u&&(n=-n),e.originX===l&&e.originY===h&&(n=-n),w(s)&&(n=-n)),i!==n);return r&&(o=s._getTransformedDimensions().y,s.set("skewX",n),O(s,"skewY","scaleY","y",o)),r}function k(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(s.skewX,0),i=T(e,e.originX,e.originY,i,r),r=Math.abs(2*i.y)-o.y,i=s.skewY,r=(r<2?n=0:(n=g(Math.atan2(r/s.scaleY,o.x/s.scaleX)),e.originX===c&&e.originY===u&&(n=-n),e.originX===l&&e.originY===h&&(n=-n),w(s)&&(n=-n)),i!==n);return r&&(o=s._getTransformedDimensions().x,s.set("skewY",n),O(s,"skewX","scaleX","x",o)),r}function E(t,e,i,r,n){var s=e.target,o=s.lockScalingX,a=s.lockScalingY,n=(n=n||{}).by,t=b(t,s),c=_(s,n,t),h=e.gestureScale;if(c)return!1;if(h)l=e.scaleX*h,u=e.scaleY*h;else{if(c=T(e,e.originX,e.originY,i,r),h="y"!==n?p(c.x):1,i="x"!==n?p(c.y):1,e.signX||(e.signX=h),e.signY||(e.signY=i),s.lockScalingFlip&&(e.signX!==h||e.signY!==i))return!1;var l,u,r=s._getTransformedDimensions();u=t&&!n?(t=Math.abs(c.x)+Math.abs(c.y),f=e.original,t=t/(Math.abs(r.x*f.scaleX/s.scaleX)+Math.abs(r.y*f.scaleY/s.scaleY)),l=f.scaleX*t,f.scaleY*t):(l=Math.abs(c.x*s.scaleX/r.x),Math.abs(c.y*s.scaleY/r.y)),y(e)&&(l*=2,u*=2),e.signX!==h&&"y"!==n&&(e.originX=d[e.originX],l*=-1,e.signX=h),e.signY!==i&&"x"!==n&&(e.originY=d[e.originY],u*=-1,e.signY=i)}var f=s.scaleX,t=s.scaleY;return n?("x"===n&&s.set("scaleX",l),"y"===n&&s.set("scaleY",u)):(o||s.set("scaleX",l),a||s.set("scaleY",u)),f!==s.scaleX||t!==s.scaleY}o.scaleCursorStyleHandler=function(t,e,i){var t=b(t,i),r="";return 0!==e.x&&0===e.y?r="x":0===e.x&&0!==e.y&&(r="y"),_(i,r,t)?"not-allowed":(r=m(i,e),n[r]+"-resize")},o.skewCursorStyleHandler=function(t,e,i){var r="not-allowed";return 0!==e.x&&i.lockSkewingY||0!==e.y&&i.lockSkewingX?r:(r=m(i,e)%4,s[r]+"-resize")},o.scaleSkewCursorStyleHandler=function(t,e,i){return t[i.canvas.altActionKey]?o.skewCursorStyleHandler(t,e,i):o.scaleCursorStyleHandler(t,e,i)},o.rotationWithSnapping=S("rotating",C(function(t,e,i,r){var n=e.target,s=n.translateToOriginPoint(n.getCenterPoint(),e.originX,e.originY);if(n.lockRotation)return!1;var o=Math.atan2(e.ey-s.y,e.ex-s.x),r=Math.atan2(r-s.y,i-s.x),i=g(r-o+e.theta);return 0r.r2,o=(this.gradientTransform||fabric.iMatrix).concat(),a=-this.offsetX,c=-this.offsetY,h=!!e.additionalTransform,l="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox";if(n.sort(function(t,e){return t.offset-e.offset}),"objectBoundingBox"==l?(a/=t.width,c/=t.height):(a+=t.width/2,c+=t.height/2),"path"===t.type&&"percentage"!==this.gradientUnits&&(a-=t.pathOffset.x,c-=t.pathOffset.y),o[4]-=a,o[5]-=c,t='id="SVGID_'+this.id+'" gradientUnits="'+l+'"',t+=' gradientTransform="'+(h?e.additionalTransform+" ":"")+fabric.util.matrixToSVG(o)+'" ',"linear"===this.type?i=["\n']:"radial"===this.type&&(i=["\n']),"radial"===this.type){if(s)for((n=n.concat()).reverse(),f=0,d=n.length;f\n')}return i.push("linear"===this.type?"\n":"\n"),i.join("")},toLive:function(t){var e,i,r,n=fabric.util.object.clone(this.coords);if(this.type){for("linear"===this.type?e=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(e=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2)),i=0,r=this.colorStops.length;i\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},toLive:function(t){var e=this.source;if(!e)return"";if(void 0!==e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}})}(),function(t){"use strict";var o=t.fabric||(t.fabric={}),a=o.util.toFixed;o.Shadow?o.warn("fabric.Shadow is already defined."):(o.Shadow=o.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1,initialize:function(t){for(var e in t="string"==typeof t?this._parseShadow(t):t)this[e]=t[e];this.id=o.Object.__uid++},_parseShadow:function(t){var t=t.trim(),e=o.Shadow.reOffsetsAndBlur.exec(t)||[];return{color:(t.replace(o.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)").trim(),offsetX:parseFloat(e[1],10)||0,offsetY:parseFloat(e[2],10)||0,blur:parseFloat(e[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(t){var e=40,i=40,r=o.Object.NUM_FRACTION_DIGITS,n=o.util.rotateVector({x:this.offsetX,y:this.offsetY},o.util.degreesToRadians(-t.angle)),s=new o.Color(this.color);return t.width&&t.height&&(e=100*a((Math.abs(n.x)+this.blur)/t.width,r)+20,i=100*a((Math.abs(n.y)+this.blur)/t.height,r)+20),t.flipX&&(n.x*=-1),t.flipY&&(n.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling};var e={},i=o.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke","nonScaling"].forEach(function(t){this[t]!==i[t]&&(e[t]=this[t])},this),e}}),o.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(\d+(?:\.\d*)?(?:px)?)?(?:\s?|$)(?:$|\s)/)}("undefined"!=typeof exports?exports:this),function(){"use strict";var n,t,h,a,s,o,i,r,e;fabric.StaticCanvas?fabric.warn("fabric.StaticCanvas is already defined."):(n=fabric.util.object.extend,t=fabric.util.getElementOffset,h=fabric.util.removeFromArray,a=fabric.util.toFixed,s=fabric.util.transformPoint,o=fabric.util.invertTransform,i=fabric.util.getNodeCanvas,r=fabric.util.createCanvasElement,e=new Error("Could not initialize `canvas` element"),fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e=e||{},this.renderAndResetBound=this.renderAndReset.bind(this),this.requestRenderAllBound=this.requestRenderAll.bind(this),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:fabric.iMatrix.concat(),backgroundVpt:!0,overlayVpt:!0,enableRetinaScaling:!0,vptCoords:{},skipOffscreen:!0,clipPath:void 0,_initStatic:function(t,e){var i=this.requestRenderAllBound;this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1\n'),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push(""),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,r=e.width||this.width,n=e.height||this.height,s='viewBox="0 0 '+this.width+" "+this.height+'" ',o=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?s='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,s='viewBox="'+a(-i[4]/i[0],o)+" "+a(-i[5]/i[3],o)+" "+a(this.width/i[0],o)+" "+a(this.height/i[3],o)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")},createSVGClipPathMarkup:function(t){var e=this.clipPath;return e?(e.clipPathId="CLIPPATH_"+fabric.Object.__uid++,'\n'+this.clipPath.toClipPathSVG(t.reviver)+"\n"):""},createSVGRefElementsMarkup:function(){var n=this;return["background","overlay"].map(function(t){var e,i,r=n[t+"Color"];if(r&&r.toLive)return t=n[t+"Vpt"],e=n.viewportTransform,i={width:n.width/(t?e[0]:1),height:n.height/(t?e[3]:1)},r.toSVG(i,{additionalTransform:t?fabric.util.matrixToSVG(e):""})}).join("")},createSVGFontFacesMarkup:function(){var t,e,i,r,n,s,o,a,c,h="",l={},u=fabric.fontPaths,f=[];for(this._objects.forEach(function t(e){f.push(e),e._objects&&e._objects.forEach(t)}),o=0,a=f.length;o',"\n",h,"","\n"].join("")},_setSVGObjects:function(t,e){for(var i,r=this._objects,n=0,s=r.length;n\n")):t.push('\n"))},sendToBack:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(e=(r=n._objects).length;e--;)i=r[e],h(this._objects,i),this._objects.unshift(i);else h(this._objects,t),this._objects.unshift(t);return this.renderOnAddRemove&&this.requestRenderAll(),this},bringToFront:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(r=n._objects,e=0;e"}}),n(fabric.StaticCanvas.prototype,fabric.Observable),n(fabric.StaticCanvas.prototype,fabric.Collection),n(fabric.StaticCanvas.prototype,fabric.DataURLExporter),n(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=r();if(!e||!e.getContext)return null;e=e.getContext("2d");return!e||"setLineDash"!==t?null:void 0!==e.setLineDash}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject,fabric.isLikelyNode&&(fabric.StaticCanvas.prototype.createPNGStream=function(){var t=i(this.lowerCanvasEl);return t&&t.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){var e=i(this.lowerCanvasEl);return e&&e.createJPEGStream(t)}))}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",strokeMiterLimit:10,strokeDashArray:null,limitedToCanvasSize:!1,_setBrushStyles:function(t){t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,t.setLineDash(this.strokeDashArray||[])},_saveAndTransform:function(t){var e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])},_setShadow:function(){var t,e,i,r;this.shadow&&(t=this.canvas,e=this.shadow,i=t.contextTop,r=t.getZoom(),t&&t._isRetinaScaling()&&(r*=fabric.devicePixelRatio),i.shadowColor=e.color,i.shadowBlur=e.blur*r,i.shadowOffsetX=e.offsetX*r,i.shadowOffsetY=e.offsetY*r)},needsFullRender:function(){return new fabric.Color(this.color).getAlpha()<1||!!this.shadow},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0},_isOutSideCanvas:function(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}),fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{decimate:.4,drawStraightLine:!1,straightLineKey:"shiftKey",initialize:function(t){this.canvas=t,this._points=[]},needsFullRender:function(){return this.callSuper("needsFullRender")||this._hasStraightLine},_drawSegment:function(t,e,i){i=e.midPointFrom(i);return t.quadraticCurveTo(e.x,e.y,i.x,i.y),i},onMouseDown:function(t,e){this.canvas._isMainEvent(e.e)&&(this.drawStraightLine=e.e[this.straightLineKey],this._prepareForDrawing(t),this._captureDrawingPath(t),this._render())},onMouseMove:function(t,e){var i;this.canvas._isMainEvent(e.e)&&(this.drawStraightLine=e.e[this.straightLineKey],!0===this.limitedToCanvasSize&&this._isOutSideCanvas(t)||this._captureDrawingPath(t)&&1"},getObjectScaling:function(){if(!this.group)return{scaleX:this.scaleX,scaleY:this.scaleY};var t=g.util.qrDecompose(this.calcTransformMatrix());return{scaleX:Math.abs(t.scaleX),scaleY:Math.abs(t.scaleY)}},getTotalObjectScaling:function(){var t,e,i=this.getObjectScaling(),r=i.scaleX,i=i.scaleY;return this.canvas&&(r*=(t=this.canvas.getZoom())*(e=this.canvas.getRetinaScaling()),i*=t*e),{scaleX:r,scaleY:i}},getObjectOpacity:function(){var t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t},_set:function(t,e){var i=this[t]!==e;return("scaleX"===t||"scaleY"===t)&&(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof g.Shadow?"dirty"===t&&this.group&&this.group.set("dirty",e):e=new g.Shadow(e),this[t]=e,i&&(e=this.group&&this.group.isOnACache(),-1=t.x&&i.left+i.width<=e.x&&i.top>=t.y&&i.top+i.height<=e.y},containsPoint:function(t,e,i,r){i=this._getCoords(i,r),e=e||this._getImageLines(i),r=this._findCrossPoints(t,e);return 0!==r&&r%2==1},isOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.getCoords(!0,t).some(function(t){return t.x<=i.x&&t.x>=e.x&&t.y<=i.y&&t.y>=e.y})||(!!this.intersectsWithRect(e,i,!0,t)||this._containsCenterOfCanvas(e,i,t))},_containsCenterOfCanvas:function(t,e,i){t={x:(t.x+e.x)/2,y:(t.y+e.y)/2};return!!this.containsPoint(t,null,!0,i)},isPartiallyOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.intersectsWithRect(e,i,!0,t)||this.getCoords(!0,t).every(function(t){return(t.x>=i.x||t.x<=e.x)&&(t.y>=i.y||t.y<=e.y)})&&this._containsCenterOfCanvas(e,i,t)},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s=0;for(n in e)if(!((r=e[n]).o.y=t.y&&r.d.y>=t.y||((r.o.x===r.d.x&&r.o.x>=t.x?r.o.x:(i=(r.d.y-r.o.y)/(r.d.x-r.o.x),-(t.y-0*t.x-(r.o.y-i*r.o.x))/(0-i)))>=t.x&&(s+=1),2!==s)))break;return s},getBoundingRect:function(t,e){t=this.getCoords(t,e);return s.makeBoundingBoxFromPoints(t)},getScaledWidth:function(){return this._getTransformedDimensions().x},getScaledHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)\n'))},toSVG:function(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})},toClipPathSVG:function(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})},_createBaseClipPathSVGMarkup:function(t,e){var i=(e=e||{}).reviver,e=e.additionalTransform||"",e=[this.getSvgTransform(!0,e),this.getSvgCommons()].join(""),r=t.indexOf("COMMON_PARTS");return t[r]=e,i?i(t.join("")):t.join("")},_createBaseSVGMarkup:function(t,e){var i,r=(e=e||{}).noStyle,n=e.reviver,s=r?"":'style="'+this.getSvgStyles()+'" ',o=e.withShadow?'style="'+this.getSvgFilter()+'" ':"",a=this.clipPath,c=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",h=a&&a.absolutePositioned,l=this.stroke,u=this.fill,f=this.shadow,d=[],g=t.indexOf("COMMON_PARTS"),e=e.additionalTransform;return a&&(a.clipPathId="CLIPPATH_"+fabric.Object.__uid++,i='\n'+a.toClipPathSVG(n)+"\n"),h&&d.push("\n"),d.push("\n"),o=[s,c,r?"":this.addPaintOrder()," ",e?'transform="'+e+'" ':""].join(""),t[g]=o,u&&u.toLive&&d.push(u.toSVG(this)),l&&l.toLive&&d.push(l.toSVG(this)),f&&d.push(f.toSVG(this)),a&&d.push(i),d.push(t.join("")),d.push("\n"),h&&d.push("\n"),n?n(d.join("")):d.join("")},addPaintOrder:function(){return"fill"!==this.paintFirst?' paint-order="'+this.paintFirst+'" ':""}})}(),function(){var n=fabric.util.object.extend,r="stateProperties";function s(e,t,i){var r={};i.forEach(function(t){r[t]=e[t]}),n(e[t],r,!0)}fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(t){var e="_"+(t=t||r);return Object.keys(this[e]).length\n']}}),n.Line.ATTRIBUTE_NAMES=n.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),n.Line.fromElement=function(t,e,i){i=i||{};var t=n.parseAttributes(t,n.Line.ATTRIBUTE_NAMES),r=[t.x1||0,t.y1||0,t.x2||0,t.y2||0];e(new n.Line(r,s(t,i)))},n.Line.fromObject=function(t,e){var i=r(t,!0);i.points=[t.x1,t.y1,t.x2,t.y2],n.Object._fromObject("Line",i,function(t){delete t.points,e&&e(t)},"points")})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var n=t.fabric||(t.fabric={}),s=n.util.degreesToRadians;n.Circle?n.warn("fabric.Circle is already defined."):(n.Circle=n.util.createClass(n.Object,{type:"circle",radius:0,startAngle:0,endAngle:360,cacheProperties:n.Object.prototype.cacheProperties.concat("radius","startAngle","endAngle"),_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},_toSVG:function(){var t,e,i,r=(this.endAngle-this.startAngle)%360;return 0==r?["\n']:(t=s(this.startAngle),e=s(this.endAngle),i=this.radius,['\n"])},_render:function(t){t.beginPath(),t.arc(0,0,this.radius,s(this.startAngle),s(this.endAngle),!1),this._renderPaintInOrder(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)}}),n.Circle.ATTRIBUTE_NAMES=n.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),n.Circle.fromElement=function(t,e){var i,t=n.parseAttributes(t,n.Circle.ATTRIBUTE_NAMES);if(!("radius"in(i=t)&&0<=i.radius))throw new Error("value of `r` attribute is required and can not be negative");t.left=(t.left||0)-t.radius,t.top=(t.top||0)-t.radius,e(new n.Circle(t))},n.Circle.fromObject=function(t,e){n.Object._fromObject("Circle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var i=t.fabric||(t.fabric={});i.Triangle?i.warn("fabric.Triangle is already defined"):(i.Triangle=i.util.createClass(i.Object,{type:"triangle",width:100,height:100,_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)},_toSVG:function(){var t=this.width/2,e=this.height/2;return["']}}),i.Triangle.fromObject=function(t,e){return i.Object._fromObject("Triangle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var i=t.fabric||(t.fabric={}),e=2*Math.PI;i.Ellipse?i.warn("fabric.Ellipse is already defined."):(i.Ellipse=i.util.createClass(i.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:i.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']},_render:function(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,e,!1),t.restore(),this._renderPaintInOrder(t)}}),i.Ellipse.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),i.Ellipse.fromElement=function(t,e){t=i.parseAttributes(t,i.Ellipse.ATTRIBUTE_NAMES);t.left=(t.left||0)-t.rx,t.top=(t.top||0)-t.ry,e(new i.Ellipse(t))},i.Ellipse.fromObject=function(t,e){i.Object._fromObject("Ellipse",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var r=t.fabric||(t.fabric={}),n=r.util.object.extend;r.Rect?r.warn("fabric.Rect is already defined"):(r.Rect=r.util.createClass(r.Object,{stateProperties:r.Object.prototype.stateProperties.concat("rx","ry"),type:"rect",rx:0,ry:0,cacheProperties:r.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t){var e=this.rx?Math.min(this.rx,this.width/2):0,i=this.ry?Math.min(this.ry,this.height/2):0,r=this.width,n=this.height,s=-this.width/2,o=-this.height/2,a=0!==e||0!==i,c=.4477152502;t.beginPath(),t.moveTo(s+e,o),t.lineTo(s+r-e,o),a&&t.bezierCurveTo(s+r-c*e,o,s+r,o+c*i,s+r,o+i),t.lineTo(s+r,o+n-i),a&&t.bezierCurveTo(s+r,o+n-c*i,s+r-c*e,o+n,s+r-e,o+n),t.lineTo(s+e,o+n),a&&t.bezierCurveTo(s+c*e,o+n,s,o+n-c*i,s,o+n-i),t.lineTo(s,o+i),a&&t.bezierCurveTo(s,o+c*i,s+c*e,o,s+e,o),t.closePath(),this._renderPaintInOrder(t)},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']}}),r.Rect.ATTRIBUTE_NAMES=r.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),r.Rect.fromElement=function(t,e,i){if(!t)return e(null);i=i||{};t=r.parseAttributes(t,r.Rect.ATTRIBUTE_NAMES),t.left=t.left||0,t.top=t.top||0,t.height=t.height||0,t.width=t.width||0,i=new r.Rect(n(i?r.util.object.clone(i):{},t));i.visible=i.visible&&0\n']},commonRender:function(t){var e,i=this.points.length,r=this.pathOffset.x,n=this.pathOffset.y;if(!i||isNaN(this.points[i-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-r,this.points[0].y-n);for(var s=0;s"},toObject:function(t){return r(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()})})},toDatalessObject:function(t){t=this.toObject(["sourcePath"].concat(t));return t.sourcePath&&delete t.path,t},_toSVG:function(){return["\n"]},_getOffsetTransform:function(){var t=f.Object.NUM_FRACTION_DIGITS;return" translate("+e(-this.pathOffset.x,t)+", "+e(-this.pathOffset.y,t)+")"},toClipPathSVG:function(t){var e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},toSVG:function(t){var e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},complexity:function(){return this.path.length},_calcDimensions:function(){for(var t,e,i=[],r=[],n=0,s=0,o=0,a=0,c=0,h=this.path.length;c"},addWithUpdate:function(t){var e=!!this.group;return this._restoreObjectsState(),o.util.resetObjectTransform(this),t&&(e&&o.util.removeTransformFromObject(t,this.group.calcTransformMatrix()),this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,e?this.group.addWithUpdate():this.setCoords(),this},removeWithUpdate:function(t){return this._restoreObjectsState(),o.util.resetObjectTransform(this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group},_set:function(t,e){var i=this._objects.length;if(this.useSetOnGroup)for(;i--;)this._objects[i].setOnGroup(t,e);if("canvas"===t)for(;i--;)this._objects[i]._set(t,e);o.Object.prototype._set.call(this,t,e)},toObject:function(r){var n=this.includeDefaultValues,t=this._objects.filter(function(t){return!t.excludeFromExport}).map(function(t){var e=t.includeDefaultValues,i=(t.includeDefaultValues=n,t.toObject(r));return t.includeDefaultValues=e,i}),e=o.Object.prototype.toObject.call(this,r);return e.objects=t,e},toDatalessObject:function(r){var n,t=this.sourcePath,e=(t=t||(n=this.includeDefaultValues,this._objects.map(function(t){var e=t.includeDefaultValues,i=(t.includeDefaultValues=n,t.toDatalessObject(r));return t.includeDefaultValues=e,i})),o.Object.prototype.toDatalessObject.call(this,r));return e.objects=t,e},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},shouldCache:function(){var t=o.Object.prototype.shouldCache.call(this);if(t)for(var e=0,i=this._objects.length;e\n"],i=0,r=this._objects.length;i\n"),e},getSvgStyles:function(){var t=void 0!==this.opacity&&1!==this.opacity?"opacity: "+this.opacity+";":"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")},toClipPathSVG:function(t){for(var e=[],i=0,r=this._objects.length;i"},shouldCache:function(){return!1},isOnACache:function(){return!1},_renderControls:function(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,this.callSuper("_renderControls",t,e),void 0===(i=i||{}).hasControls&&(i.hasControls=!1),i.forActiveSelection=!0;for(var r=0,n=this._objects.length;r\n','\t\n',"\n"),a=' clip-path="url(#imageCrop_'+e+')" '),this.imageSmoothing||(c='" image-rendering="optimizeSpeed'),r.push("\t\n"),(this.stroke||this.strokeDashArray)&&(e=this.fill,this.fill=null,t=["\t\n'],this.fill=e),"fill"!==this.paintFirst?i.concat(t,r):i.concat(r,t)):[]},getSrc:function(t){t=t?this._element:this._originalElement;return t?t.toDataURL?t.toDataURL():this.srcFromAttribute?t.getAttribute("src"):t.src:this.src||""},setSrc:function(t,i,r){return fabric.util.loadImage(t,function(t,e){this.setElement(t,r),this._setWidthHeight(),i&&i(this,e)},this,r&&r.crossOrigin),this},toString:function(){return'#'},applyResizeFilters:function(){var t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.scaleX,i=i.scaleY,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||e=t,o=["highp","mediump","lowp"],a=0;a<3;a++)if(r=void 0,i="precision "+(i=o[a])+" float;\nvoid main(){}",r=(e=s).createShader(e.FRAGMENT_SHADER),e.shaderSource(r,i),e.compileShader(r),!!e.getShaderParameter(r,e.COMPILE_STATUS)){fabric.webGlPrecision=o[a];break}}return this.isSupported=n},(fabric.WebglFilterBackend=t).prototype={tileSize:2048,resources:{},setupGLContext:function(t,e){this.dispose(),this.createWebGLCanvas(t,e),this.aPosition=new Float32Array([0,0,0,1,1,0,1,1]),this.chooseFastestCopyGLTo2DMethod(t,e)},chooseFastestCopyGLTo2DMethod:function(t,e){var i=void 0!==window.performance;try{new ImageData(1,1),s=!0}catch(t){s=!1}var r="undefined"!=typeof ArrayBuffer,n="undefined"!=typeof Uint8ClampedArray;if(i&&s&&r&&n){var i=fabric.util.createCanvasElement(),s=new ArrayBuffer(t*e*4);if(fabric.forceGLPutImageData)return this.imageBuffer=s,void(this.copyGLTo2D=copyGLTo2DPutImageData);r={imageBuffer:s,destinationWidth:t,destinationHeight:e,targetCanvas:i};i.width=t,i.height=e,n=window.performance.now(),copyGLTo2DDrawImage.call(r,this.gl,r),t=window.performance.now()-n,n=window.performance.now(),copyGLTo2DPutImageData.call(r,this.gl,r),window.performance.now()-n 0.0) {\n"+this.fragmentSource[t]+"}\n}"},retrieveShader:function(t){var e,i=this.type+"_"+this.mode;return t.programCache.hasOwnProperty(i)||(e=this.buildSource(this.mode),t.programCache[i]=this.createProgram(t.context,e)),t.programCache[i]},applyTo2d:function(t){for(var e,i,r,n=t.imageData.data,s=n.length,o=1-this.alpha,t=new u.Color(this.color).getSource(),a=t[0]*this.alpha,c=t[1]*this.alpha,h=t[2]*this.alpha,l=0;l'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t},_render:function(t){var e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")},_renderText:function(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))},_setTextStyles:function(t,e,i){if(t.textBaseline="alphabetical",this.path)switch(this.pathAlign){case"center":t.textBaseline="middle";break;case"ascender":t.textBaseline="top";break;case"descender":t.textBaseline="bottom"}t.font=this._getFontDeclaration(e,i)},calcTextWidth:function(){for(var t=this.getLineWidth(0),e=1,i=this._textLines.length;ethis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=t):(this.selectionStart=t,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===e&&this.selectionEnd===i||(this.restartCursorIfNeeded(),this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection())))},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},fromStringToGraphemeSelection:function(t,e,i){var r=i.slice(0,t),r=fabric.util.string.graphemeSplit(r).length;if(t===e)return{selectionStart:r,selectionEnd:r};i=i.slice(t,e);return{selectionStart:r,selectionEnd:r+fabric.util.string.graphemeSplit(i).length}},fromGraphemeToStringSelection:function(t,e,i){var r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}},_updateTextarea:function(){var t;this.cursorOffsetCache={},this.hiddenTextarea&&(this.inCompositionMode||(t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text),this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd),this.updateTextareaPosition())},updateFromTextArea:function(){var t;this.hiddenTextarea&&(this.cursorOffsetCache={},this.text=this.hiddenTextarea.value,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),t=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value),this.selectionEnd=this.selectionStart=t.selectionEnd,this.inCompositionMode||(this.selectionStart=t.selectionStart),this.updateTextareaPosition())},updateTextareaPosition:function(){var t;this.selectionStart===this.selectionEnd&&(t=this._calcTextareaPosition(),this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top)},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),t=this.get2DCursorLocation(t),i=t.lineIndex,t=t.charIndex,i=this.getValueOfPropertyAt(i,t,"fontSize")*this.lineHeight,t=e.leftOffset,r=this.calcTransformMatrix(),t={x:e.left+t,y:e.top+e.topOffset+i},e=this.canvas.getRetinaScaling(),n=this.canvas.upperCanvasEl,s=n.width/e,e=n.height/e,o=s-i,a=e-i,s=n.clientWidth/s,n=n.clientHeight/e,t=fabric.util.transformPoint(t,r);return(t=fabric.util.transformPoint(t,this.canvas.viewportTransform)).x*=s,t.y*=n,t.x<0&&(t.x=0),t.x>o&&(t.x=o),t.y<0&&(t.y=0),t.y>a&&(t.y=a),t.x+=this.canvas._offset.left,t.y+=this.canvas._offset.top,{left:t.x+"px",top:t.y+"px",fontSize:i+"px",charHeight:i}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text,e=this.hiddenTextarea;return this.selected=!1,this.isEditing=!1,this.selectionEnd=this.selectionStart,e&&(e.blur&&e.blur(),e.parentNode&&e.parentNode.removeChild(e)),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},removeStyleFromTo:function(t,e){var t=this.get2DCursorLocation(t,!0),e=this.get2DCursorLocation(e,!0),i=t.lineIndex,r=t.charIndex,n=e.lineIndex,s=e.charIndex;if(i!==n){if(this.styles[i])for(l=r;lt?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown)},onMouseDown:function(t){var e;this.canvas&&(this.__newClickTime=+new Date,e=t.pointer,this.isTripleClick(e)&&(this.fire("tripleclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected)},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},doubleClickHandler:function(t){this.isEditing&&this.selectWord(this.getSelectionStartFromPointer(t.e))},tripleClickHandler:function(t){this.isEditing&&this.selectLine(this.getSelectionStartFromPointer(t.e))},initClicks:function(){this.on("mousedblclick",this.doubleClickHandler),this.on("tripleclick",this.tripleClickHandler)},_mouseDownHandler:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.__isMousedown=!0,this.selected&&(this.inCompositionMode=!1,this.setCursorByClick(t.e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()))},_mouseDownHandlerBefore:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.selected=this===this.canvas._activeObject)},initMousedownHandler:function(){this.on("mousedown",this._mouseDownHandler),this.on("mousedown:before",this._mouseDownHandlerBefore)},initMouseupHandler:function(){this.on("mouseup",this.mouseUpHandler)},mouseUpHandler:function(t){if(this.__isMousedown=!1,!(!this.editable||this.group||t.transform&&t.transform.actionPerformed||t.e.button&&1!==t.e.button)){if(this.canvas){var e=this.canvas._activeObject;if(e&&e!==this)return}this.__lastSelected&&!this.__corner?(this.selected=!1,this.__lastSelected=!1,this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()):this.selected=!0}},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())},getSelectionStartFromPointer:function(t){for(var e=this.getLocalPointer(t),i=0,r=0,n=0,s=0,o=0,a=0,c=this._textLines.length;athis._text.length?this._text.length:t}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.setAttribute("autocorrect","off"),this.hiddenTextarea.setAttribute("autocomplete","off"),this.hiddenTextarea.setAttribute("spellcheck","false"),this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea",""),this.hiddenTextarea.setAttribute("wrap","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; paddingï½°top: "+t.fontSize+";",(this.hiddenTextareaContainer||fabric.document.body).appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},keysMap:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown"},keysMapRtl:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorLeft",36:"moveCursorRight",37:"moveCursorRight",38:"moveCursorUp",39:"moveCursorLeft",40:"moveCursorDown"},ctrlKeysMapUp:{67:"copy",88:"cut"},ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){var e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),33<=t.keyCode&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}},onKeyUp:function(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())},onInput:function(t){var e=this.fromPaste;if(this.fromPaste=!1,t&&t.stopPropagation(),this.isEditing){var i,r,n,t=this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,s=this._text.length,o=t.length,a=o-s,c=this.selectionStart,h=this.selectionEnd,l=c!==h;if(""===this.hiddenTextarea.value)return this.styles={},this.updateFromTextArea(),this.fire("changed"),void(this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll()));var u=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value),f=c>u.selectionStart;l?(i=this._text.slice(c,h),a+=h-c):o=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){t=this["get"+t+"CursorOffset"](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(t):this.moveCursorWithoutShift(t),0!==t&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){t="moveCursor"+t+"With";this._currentCursorOpacity=1,e.shiftKey?t+="Shift":t+="outShift",this[t](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t,e){this.removeStyleFromTo(t,e=void 0===e?t+1:e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this._removeExtraneousStyles()},insertChars:function(t,e,i,r){i<(r=void 0===r?i:r)&&this.removeStyleFromTo(i,r);t=fabric.util.string.graphemeSplit(t);this.insertNewStyleBlock(t,i,e),this._text=[].concat(this._text.slice(0,i),t,this._text.slice(r)),this.text=this._text.join(""),this.set("dirty",!0),this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this._removeExtraneousStyles()}}),function(){var a=fabric.util.toFixed,c=/ +/g;fabric.util.object.extend(fabric.Text.prototype,{_toSVG:function(){var t=this._getSVGLeftTopOffsets(),t=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(t)},toSVG:function(t){return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0})},_getSVGLeftTopOffsets:function(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}},_wrapSVGTextAndBg:function(t){var e=this.getSvgTextDecoration(this);return[t.textBgRects.join(""),'\t\t",t.textSpans.join(""),"\n"]},_getSVGTextAndBg:function(t,e){var i,r=[],n=[],s=t;this._setSVGBg(n);for(var o=0,a=this._textLines.length;o",fabric.util.string.escapeXml(t),""].join("")},_setSVGTextLineText:function(t,e,i,r){var n,s,o,a,c=this.getHeightOfLine(e),h=-1!==this.textAlign.indexOf("justify"),l="",u=0,f=this._textLines[e];r+=c*(1-this._fontSizeFraction)/this.lineHeight;for(var d=0,g=f.length-1;d<=g;d++)a=d===g||this.charSpacing,l+=f[d],o=this.__charBounds[e][d],0===u?(i+=o.kernedWidth-o.width,u+=o.width):u+=o.kernedWidth,(a=h&&!a&&this._reSpaceAndTab.test(f[d])?!0:a)||(n=n||this.getCompleteStyleDeclaration(e,d),s=this.getCompleteStyleDeclaration(e,d+1),a=fabric.util.hasStyleChanged(n,s,!0)),a&&(o=this._getStyleDeclaration(e,d)||{},t.push(this._createTextCharSpan(l,o,i,r)),l="",n=s,i+=u,u=0)},_pushTextBgRect:function(t,e,i,r,n,s){var o=fabric.Object.NUM_FRACTION_DIGITS;t.push("\t\t\n')},_setSVGTextLineBg:function(t,e,i,r){for(var n,s,o=this._textLines[e],a=this.getHeightOfLine(e)/this.lineHeight,c=0,h=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),u=0,f=o.length;uthis.width&&this._set("width",this.dynamicMinWidth),-1!==this.textAlign.indexOf("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight(),this.saveState({propertySet:"_dimensionAffectingProps"}))},_generateStyleMap:function(t){for(var e=0,i=0,r=0,n={},s=0;sthis.dynamicMinWidth&&(this.dynamicMinWidth=g-m+r),c},isEndOfWrapping:function(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line},missingNewlineOffset:function(t){return!this.splitByGrapheme||this.isEndOfWrapping(t)?1:0},_splitTextIntoLines:function(t){for(var t=b.Text.prototype._splitTextIntoLines.call(this,t),e=this._wrapText(t.lines,this.width),i=new Array(e.length),r=0;r { @@ -46,15 +47,15 @@ import { checkAndShowMissingPackagesDialog } from './js/common/components/missin console.log('Flow name from URL path:', paths[1]); return paths[1]; } - // Default flow name console.log('Default flow name: linker'); return 'linker'; } - // let response = await api.fetchApi("/manager/reboot"); + const flowName = getFlowName(); const client_id = uuidv4(); const flowConfig = await fetchflowConfig(flowName); let workflow = await fetchWorkflow(flowName); + let canvasLoader; const seeders = []; initializeWebSocket(client_id); @@ -232,28 +233,31 @@ import { checkAndShowMissingPackagesDialog } from './js/common/components/missin } imageLoaderComp(flowConfig, workflow); - - function updateQueueDisplay(jobQueue) { - const queueDisplay = document.getElementById('queue-display'); - if (!queueDisplay) { - console.warn('queue-display element not found in the DOM.'); - return; + + const initCanvas = async () => { + canvasLoader = new CanvasLoader('imageCanvas', flowConfig); + await canvasLoader.initPromise; // Wait for initialization to complete + + if (canvasLoader.isInitialized) { + console.log("Canvas initialized successfully with selected plugins."); + } else { + console.log("Canvas was not initialized due to missing flowConfig fields."); } - if (jobQueue.length > 0) { - queueDisplay.textContent = `${jobQueue.length}`; + }; + + initCanvas(); - } else { - queueDisplay.textContent = ''; + + async function queue() { + + if (canvasLoader && canvasLoader.isInitialized) { + await CanvasComponent(flowConfig, workflow, canvasLoader); + } else { + console.warn("Canvas is not initialized. Skipping CanvasComponent."); } - // if (jobQueue.length > 0) { - // const jobIds = jobQueue.map(job => job.id).join(', '); - // queueDisplay.textContent += ` (Job IDs: ${jobIds})`; - // } - } + console.log("Queueing workflow:", workflow); - async function queue() { - console.log("Queueing workflow:" , workflow); if (flowConfig.prompts) { flowConfig.prompts.forEach(pathConfig => { const { id } = pathConfig; @@ -266,11 +270,13 @@ import { checkAndShowMissingPackagesDialog } from './js/common/components/missin } }); } + const jobId = StateManager.incrementJobId(); const job = { id: jobId, workflow: { ...workflow } }; StateManager.addJob(job); console.log(`Added job to queue. Job ID: ${jobId}`); console.log("Current queue:", StateManager.getJobQueue()); + console.log("queued workflow:", workflow); updateQueueDisplay(StateManager.getJobQueue()); @@ -324,7 +330,27 @@ import { checkAndShowMissingPackagesDialog } from './js/common/components/missin } catch (error) { console.error('Error processing prompt:', error); throw error; + } finally { + // hideSpinner(); + } + } + function updateQueueDisplay(jobQueue) { + const queueDisplay = document.getElementById('queue-display'); + if (!queueDisplay) { + console.warn('queue-display element not found in the DOM.'); + return; + } + if (jobQueue.length > 0) { + queueDisplay.textContent = `${jobQueue.length}`; + + } else { + queueDisplay.textContent = ''; } + + // if (jobQueue.length > 0) { + // const jobIds = jobQueue.map(job => job.id).join(', '); + // queueDisplay.textContent += ` (Job IDs: ${jobIds})`; + // } } async function interrupt() { @@ -356,6 +382,7 @@ import { checkAndShowMissingPackagesDialog } from './js/common/components/missin if (!response.ok) { throw new Error('Failed to interrupt the process.'); } + const result = await response.json(); console.log('Interrupted:', result); } catch (error) { @@ -398,3 +425,4 @@ import { checkAndShowMissingPackagesDialog } from './js/common/components/missin }); }); })(window, document, undefined); + diff --git a/web/core/media/git/flow_5.jpg b/web/core/media/git/flow_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6f7fc1ca77fc5e715c5d58fbd5a3a901f539163 GIT binary patch literal 300675 zcmeEu1z1&Ux9&nfBm_ZHQUOUpx>+L90@Bjm-3_9Ibc3{XgLH#}(w)-XU5j4a3F`jU zz3)E%x#z!io*$X;$eio@#`})(jq#2-zqKyEUe18-hzg1bf?!}^K*GR3(B(LY9|U{j z#??3Q1qXb?--3sSgM&vxK)87e1qlTO83`HrHY&!Q+oB zz!HC>W5SkiqvWK3FCuMv^3ad7eOkw2uMq@reKVP#|I;N*WMASfg(A}S** zC$I2QQAt}zS5M!-(8$`x*3RC+(dmt+m$%PbU%#;Mh{&kucQLUkscGpMnOWI6#U-U> ztK|ots}+Tv}dPUEAH;KRARO9iN^gewX3I{&! zy96OV%)bQjiA|s1a^KBcql6WLVu&k4Uq?3_-?;?M3!Rh2R$Rc-yYJk;1T~jry}wO- zEW%=billZ4n&H0$1rqOs8BHHx)?I==`dotUb*H>ycAq61YFMFiz65!oL7CkfMRMJH zrH?K_H;B)TIqPH~ZWoER+he4k?`1@%sE)lP?Qo=^)TZPUn#wqnw>t3JJ_tYFR5%nxC3sW5Zgx7JN)5>L$f2`0Mo7s2? z!dN9@AFL(kjh`NOatVrN@OcsHwSM2~splsIOA-ygsh3V4Dwx&MD@Du#)c+RVii_pW zwL0G??&zHRk+4K%D;!@&A0- z|J#JC#sA-cg&apI*XT~hB<3P1+!qeG3-P;ykWI1T@y?b6`sm=gMU>?M{AxFr!jkCd zDgOoc0fE9_*XM8fG6VZ|*7LBN6w5>}KN7XrgVU*$-KVq^+0T+{2rk^rz)EUeC$1|h zc@=+`MC9zownqMVj9$rkK(P|S_O^%EO>z&sh@G4v|tNiUk z$f+@{_^_`#8iW?XD4C33nTC9mv@=ZS;u16&#GAwhP6q?y96~i)FF_gp?thnMUgY7c zV+ad_N%mU6>T$ut(Yh7y5aQ@Mtz44hPql4{095PeO`(?{aqNbl)6=iz!YJ{p9o0VB zbWP}D0L*&Aq-*xL=@EEa_aiaIRtv@S()?li#&q=5o5=rYoQ!ez$tA_dLOo|iEdxu- z2br{wOPLWIg%{Ci@P3TNT{*q@s7RJENMds0wcQ2F4n+$XiCI}{W)h*XI>;;M*mw98N>xC< zw@KztMc_QKh15burMGyxN3)+&KXc)y`JoR=G-=FB)ewbGD7YtvuZX|&QtL@v2OGJJ zGb-l|CUu3VxzxAWNGw!SQe$GSIEPT>lD=dqStCZJg3M`7)W|gDW8&w7`K28O`kr&F z1|F1%3(JM|# zaO=TF5TI*rn1!z@?cHD&2wxsDqmLC6EP^GEM#9r4@#rumh@Y#qhkPAyq1k1d<%ZJs zO-7#cFpC*G?o&_k)4-8xF1RDgOrSX(tUWCtieI;y%$GYQ)k}w4G)}@ef3lmrn~{$a zGJX*(QR1nrIId4l3Kw5-_AE?-$A?d)4pX5?Hk)(6_Tkp(qNs$##>zSUy(U9P$5Q5^ zY~;iVy{eOR!$n7e#jgvotEq1d6Y(Qwz=ljHC3KHtaCy!Y9;r2J;s|;np^4En0QWlX z_I;s{h@@6iIBSelu!dQ)6p;wN(7F(CFt+YePQZ8Ik-;x~y*$kAzA+>ty>n^^31pn2 z{UVHiW1a)7G`V{-oHd`|2DSjD2v-}SYQ!REtZ4wf7JqCi)UIKS$**t|G#oZTFldMj<*iQM+|oz`QQp@r-*1`)M0f-bDO zT!Zp;y^3L4CDb(u2dIs)l4`A8l#G(lhv!eg3>;*ZgBQl#*-;7^8IyH`NjXlc_8jDI zvQdr4#lW(ssW<&rT=1?7K_w7a)8TK31 zbpe+y8&8NdBo6o5KDMQ@-dCQinA7YNz*>k$5SfiSvrQO^c+dPq*I_k&guTfaeZ^AQ z?QX*SAQ4MIb!!6yaZ}JC|I3n~=99S~DeA+X%%VbjbQ}fxRD}~||MUL+3p9yh>&Ag3 zi-9#k)uJYDGPlfvH9Q^0Y#b{>|KJ{t7IZ|kILg3YH74BS$ZnZH$}#Qa zb=#u{ond@S?2{vdd&b2tk&2c?GUlt5>Nd5LXY~rg#S6v`i-HAS1~ocrFj4D~%pzmM zhL7j-l*W}B4keFi;-__hK&Q*G3$ipUwg~1z7dGyeKE+u>gX$BqDTOQL3~LGq zcJ7FC=VZrAJ#1ZG;Tr5)VQR}@`O1U(%*Cp%+xk?t3E^#GQ3j-blFN_Xsd$Xu_&lJU zdc*0_#xT@MxkM=7O=uX8k5cSdGsh!S9RrJi zpOBjw-;t7GiC-lNd>^VqdS8@aegyM`RwwYm$;%qEc2f=&A_IsV%aI+l;RVEMMBHys zNOu)1mXR1vb8;FdrH_GAiDZ@CbP!nx5?` z5_SJ-^rLu^Zp)6WwvX%tdlrTb8cA*YthXyCkGw4><~ed8Sni=0oo?Ok?d=D0-bFFm zs4|P}(EFi@F@!?%(yTFLcKgB`etmb4%%vTB>X5t?AnFrfUGO4RpZtT8Fo(hBbbssv z*jI?lya!1-wpBqmjnO1JcbX6?N%JL(vvp2vv>;YfpD_V=dcY6R)q%CCj(7<&fSIL7 z7MNAl8jTaJh}n8%mLI|#S`wnDDgqM{I%vf)TiN0_@&Vf3fNBCIcag`AO~{#Ab+U_b z%vO1_FxzPndS@nJN#9eu-narmsSIg10m0CQC7tT2VUzWct+{tKUD7TV`~t^7N~xd*uAT(PsQ!J*u=xlSbnjIFg?#47XPKv#w{lHeeIqdBPUk0AFn3NMK&n6#_fQt-3cB+6Xm!8%~u6gnd~ zj)vH47Wl`h8h=t4351VIH6~#ch%XjmbVtTQ2#w^DBqdSkVL5r8GPlu_WSEcFe{6je z%bSdQ5{IyOnr|(q)eLpzHD^Q^o4mD#Hk=Zxm#8250k2KlqlINfi{VbbPdZu|a$)3_ z?NIK$h-9LoYP@d+l{Eq*4Sl$Fv8pww@XNjk3Tq8vIC)9we1DZA9r-)Z9#b&nU2NjM zZ1o@({O5WNwIoX1b1&IK8OCN>y$5oJlLF&HD|U0c$mnw2I3=7tciEz~HCjRn&{l|wZ$}7v%IV}5}X6A2Jt>;TGoiYbG+NZeom7=&kjT(@zEmHj;(b_Qik#vt`b*OXa za9N(^!O6qavVwSb*y0S%(34N(0Av>R%@rXRCZ|UWKc{g6@0-cS=dJrlUO9ZNG@u?l7x1Djcxz z=8QL{Xg|TIh#4@f5X%>FhV!8&$DrsXhE}Y+S3!tR#Aq4Xg-(xS5mkA;27HVNV(53@(o-+q4T;KY0%V(zX0 z71C8Iilnwlg_s|EVM?hPHvd>J|BBx)T`xhJK3pyh47=;`53M%`4l@mt_Rz~NK?VNj zYY&kjFIxrC>WVMkHqM|~_AF6TuPiTQ<3TDG0v)UL(#M*&>he_c7l*Qd_aI#s7 zH)Bg=Em0|_A<5n%T9$LOvVXBGNcD(yEyDz@76grKlaf3WW$^bjT$%6KwHawME?gaS zSMl@r3kp6SBf`1_g;ZaHDyQ4?n#@iK^ADm0q(wr~EVtm|j|!apmQw>|4Fw6J zBOLR#Gi$@frn4itMKj@vROL3dCzZ{QDYWq)eYR7;hODv&-Z=5LN|fhZkhjBs(YJk` zt~xi<-kQfwRJE;gfi)n*42c!J$2>4`=9)SV2DBT@#$y~veJi-j|7(p{`Y(af@Z z&Zx4Jq-kq!ndNM%qbe*+DU}Qu0n8WwKOOK1thyET-a=eb%4G8_FQwl`oo$vMJM|h1}P-n4v?caP{WG+=ZkF9L>D%dRSRzr=nS2`sRnxy_}$|H+<;o(X{xMBJ9@YVK!+L zvL%X|rRCB|FquYxrAI)(uq#$P1BR!mZr%2}G4z>WX-dBN`l(=t+IVx3rwzQk)Y<#v z4tiqe#4Ps5)<0Id(R2p#J_S4)az5?HWeH%9-EFn!QREF?>MbEfd{;TK>1G; za2S?6UxFB`^%gYZDVg#j=3BunayRL zhJ5g>FQmB4x4y*!<<+N$+Ia3E=c#zh{lP^OcX98C#N3ow0JFLA7;R$aqxNhAPnpM0 zS9H6Gri0IK_?E>;O*D}_<5Db-r#j&EPJ$pOv2~m=PwBCle6zjXjhO_4?uVo%(?Hz~pvmlPWwJ->f>0Dkx0QsX$_P#@ld8IMP7-4_ z%_Zn-#jt7m*k^6sHuZa*|{X1k=E9!BRlqS^ZTsy&~w_JO(^O8K*d;8o&r2uxU4Dk=c7HQ{QC0 zbPL);|4wkG2Gw#sShOmZNoeZ~+yDhx3suZtfng$?5=-S6Qb+g z6iJkM#Z&(g*H14owrudjCZ5iV%e}UiGLM9VNm+>^_dX- zq{l)KNBhu9I)M4PxNj4(GK^hKn50w}%OrW^nlugA!jU?@3xJV1!)jhuf1ujR*reGW zEVC*C;pmBeOUA1|aZPk?RVuUFH_v_N>EW=&&n8Hm-R^mJcVlmx)I!yV%xMmQ@H9-@BR$U$L2}&I5LYn3WIl_hr*ad0 zvGP9pz|GE&s0NU8_Zdtm5NFhX;LT_IKAXPTW+vXj>Ci@Btb5JR!zX<;V`IEXRBdPM z_^^N`BTT#efRQA`mv_0fyB4?ibVd_u%H#D1)`5uVUQ#dVs1j7PBk))=S~BRu{>6T;v<1OujOY~K zBJBN`1ol(SkXy&rAI=-pMQdW2M0?-a zXJ);G?4QU7mOj@gVD2G)%+>UU@M(+M5AbeKRug|-qddsFtFt60WQ*htckb_)CgOt!AXWVW|?q>Ya{ z;bdmk5M)H1{S@7@SeA# z2k4)tW+nJ=h&c^}R`j0ESJeJ-2_|4E5B@UvRhHNM2hJ~I=EfYa<&oBkNs#y4^G~7| zi7t*0vR88aJykbO4}oMSosD_Dg6dn?_nF|{bbL1>q5;VL{=fodZx8gLq@l92;^;KHR2()TKE_?5%aApWc@mP^w%wfn0I7E>OVY;)w}?t{BFin%?>oFbp^^_ zFApBoLoYdDG?6JSA9&@;TY6Q_y}>0NwYPyFpZ`0s_}9||0?A`Z4-p~y2+F^A;Yz*v zTLfK|9AJKxR>n7)Cq7w+85dES_#EEies(3M>#TUd>_u62Azi5zfAy0m_Lfzl?6|JSTJx^ z$^nAuV*i$rrK{PGQsmI5BC*TZ_xEK$4&HU-BlT6&#+CkdFrV+rlS^Jd1Y zrRBW8D)e=WO_1A{iKP9u&k~`-VQ%TSwSzi6^5mPQdN$TsRP#>fmX9&(m5AycfPS)G za&*^^>ulbPyB07Nzr~$EUgujtL~#HjYBu=&A#;Ov<;^D=;S2!{t!`@Pr*eORTKfhf zV1kR!5^fJssrRt%AE>X?ccGL(^3PIR@`K7rz4~YdARP6sh2y(NdIo);88NNPl&?Z- z?Jqsecny1A^F&C^mGX@66N3j_Oo%QZnC$0=3;Mp#z~!#`UC-Y&W^CTl40%A9H!gvB zO3Z(yV6LcE2dFl=qWaG%54(if;2*e;(t+?YLdDzZZpCIQ8^2bL*RqZDjJsa*dwl&BXxt%ydToIEKeQ^hul04?bEQ>( z^BsNB1Tp;`VVCZ!=Ia{schz>y@?T>9Ni6#rl)Y;%0Jo|Sudh;Gk&2n^9{I!@T2_LrL*73vf2!YR=Qn0o&_?mlX1Bhc?Jw%oRX6fOBLk|u z_5)B&a5rxQ&B#>+|22HRw<1+HUz%`8t+`V1ws7q2!ufQbCEY)%Pb~XW(Zv7Wh|G3h zH$#A6HvU(|9!eYMS}Dh!SZ$Q zwFN9=K((0aBmJSrj}Ct1mG6z(b?0?elf8i^NcbwZ{~`XriIv}=Y64vsP?tn_y{ziYMb2K{KOfMTF#5B?|uKYFt?+GSqFJHpSt z_j_*)*%cAJpOCVDm!-dP2vp!Y8Nj2OK%W)HV|dka{3Hv1&uc)xv84+b8lfAl*-DfV zqS*aRhyM?~{}(8At`w;c*LOYEefSST|132ChUwkIA9ij|{?KFg#eiP^uJ(T~?jfb| zZ(F^elAZZz0><0u`6VNyt zoDl$%G5*lFe~wwMNVgukCA>di(l&%Y{Ad^TU10wnvsF`VK+I-MC;;9pecf*bh_74U zX98|I{i>IxS*?Q~zazT={wDpzfR3RRh(c?Woa=7tyA=5mg+B{Tpu4%&US8MT%$3j_ z{ypj5H|C;#?ESQu;65M<#;@h|PrCLmgIJL@r7Bb zyFK83NFLBh#4{WamHjD6y9QbQr2MGdnk=huHunC|wSToj)!V`~xWoYAcilPmywe7J z`th3C%3qT-NRFoP@Xe|Me!6t!B}nmD-s%CFto)ajH-~3DH*VX_^AEo7qcANpl2#Hf z?`Pwt^)#h;(+go1pP6(UZ`w5;FmQ@cBFHc25#J=k?zR$yOEaY)398Gs>L^N&2^PRg z*PP8)mmQ!lqj^Mqx-U@#nw%UTulZtz#!u?u)l-F;H`T~wkWx)d;DDfZY@UCc^s_v8 zbj-tx4vyEx3cA@WyNKt*8`FhtS651yxXdGfDShXkxHJ2&*v|k%-f+5@+nB`#mUeV+w!`~`op|yjn0RD2E7vIQJbHn{{K$<@08?HE zxR3ng-^ZUhxHU-~*>c*`SWqFFZV4^f$qJR?-P;NFnLqY8BXiLHM6S&i+Z^r4ny4}p zm-TQTU1$*d943GIZ9Q`TxyX*c;IXBtHAIz3d>1w0eVavPw>*pCOX6*e1?#DLiheha z<9YtlouRUz%HbUcGZFIsA=6~AzCIk7obd$3!6nEDxglVRslIos)VHinJg_^%)>lp| zP-Sv!a>@6Gk4)kdIGC>rg@^4bQI___>NM^#D`yT$!>ih>Ll;SI_s*X+?7DfR9$W2y zI!eSI+N4#NH5F8ZP5`?R_QG^ugod#mQ9D_xKI6sOiL7|-#^gZJI7JxVgg!c+A0?ZSOiBP2=P42svq9eH zJGUkzNr=jfKf9NqeZB-?udv0^<C($4*boi`-h(I_H2g81 zQ+jaCkQvcf?5NwVBlQ4xSU2=z`bH>CzlO3Z(`O~t_zL-G<6M<4XKNBz-~2HK44N=Z z#=BunTL*<~7nR_JGNDV5hBNpAZscyETR#}XMSPZRXE<{%H?EFII12B+ffk1Fn`5;X zuLX&!v=dJX6k3RQN9xIp`4x7tjvztr?~7Tog%haP@Oj}1NVOC&y;LX^wY1E{SDSnU zJf!UGP8Swo!O~7l@uTVHcEP&bw?2A5z|_hoq;**bhFsV@-o8am>Wj-Y){8I zg=iO_X79zknn1L`Usj>-2yFS7t1qH48p16@cI*dhop0jz$#tRCC-GkHG64e&VT!)#Jk~9eqY>ZHhcGd-6l|2zc z_PjvwjJl_pO%lOc@uYEw@l2N>WEhIuSfkpU*I}Y%i9Ki%JY@z4v#-flaIGX8Kzxal=$Mngd+m#?j@#eKcuu&5+~bz3{2q*6@zD}}SeR%(!dwK?x*7|6P; zJjB9@;Ev;r->K4wNbfn{uGox8*K9s^`}oUZkwTj@WpZUh$pp%i(2|B%2%RGH;cECf z4n4wy%%l0qI}|<#s|%{R&c?j&bptLzj{K9w`fF*^I`FHN8OghO)D;^g>m2ySui%S^i5ICin^5NG6ZbLNV%6|wO!8G|M`bLVNB zKb+SAy^HR85r`l7@$rdAA@MH4mu+l^*s1=hZ5c6VXXV23FQ{?)@Bv!$9Q%GB-y$y` zza`Vz7xLw$cPRXlq|X_YdY2jJ=`l}PU|k8%M_i27KEVv3k7qsMN@qr_!))#`E<0-l z1};yI?K2(lU+g3XTU*G z+rvp2$(mst3FCGATyX(9QmO{(?8UO$TH?u0c7m-FaYx?lU9r!n!|~RqcvRK94?a@TEo1lV+4=dYm9F zmZJEC_vMpR*fK|xOAwKZInPw66^pX7eLs1WGgjHaBaI-0P`lQrWPB2{BP4s)BeBV| z)BaO5I|aT(;h9EK=>ha)A!HB>2}tKWYH#h^E_9Ok4VvL{$e&(9DaRONxnkco~N!!a*>%)3~G~e$778 z(jiavudTa^A`szw&jR=BA6mtw1#E#yqtu*aSk(O!sfSIrH?~-ANq3(Pb8+OGnwW0R z?rDd2K6@6#BHI*y{_5^D3tbs@!F*xLCRA(L$5c{Q-6Qc<*{)u;zGaRPn%OX?D= z!bpDjZg&L|USEN3K%**xK;w1~oW>xVI-Cpfta2bH_)gMYj^VPCQh&Njw0aYuERlIGqsAekt z!|~C49p~JZ&4|lMK|$9U&te+RL$24XF^m=iN6xyGgS_9y4_m5`(qe zwul=Abj#&9VMf^1Uipm~NY&yX^+&DTpVup$;uWx`(a%MD4bk0=#eu!ZaaHsi3oy?@ zB}ow++2*Y=+R-}2#pludh{$#q)3B?%HWb#v&o9px=b zhx?229~-&VrWbnjt8E+O&Uv%94`LRszb2^Zxz z7oOgf>%B3#$288xLGSM*`KFdk>5ZG8Dwi8b+?Bd~F0_UtG+9Mz zI9fUmTcI)8UWM7wssi>XMXzc^3lI+%;-L-ccRC?^w4n(Fb*N0wQ%YsR!ouu~4=7@$ z)-6)}s1cFE@Dis4!dS=Vlbek=rR4C~Stx6m*~=4pBP!FGW3umPC86|~lY}vqjU+c4 z#${8dQVC=Wj3#HyZN2uR%)TQt8?(89A!t{9z~05^m(}*==aaG_-{r!6Xz+$uIy~%9Ce99m?SB&>zU^Yz5@!7Y5FyjoH zrTwM-OZbC=R?M12N(UnXMdv8)Q8 zsuQqjyJ8uuizO9)ZMXQBNuWiLCdq7K8gDKBpSb-xCKO4zRGkR)Vg!D8-O?WDGGyOU z?fe{%IgFM@Qg#N0l{N2yXngi>p#MSi{$KKFV1KrXd)_(qYEFsgVZ{Y|NFe=>lHkbz1n@k%OzbTKbM;lsh|6Iy-Fg8HFOA5_uUMV zdiZd9@M2lQAnZOhHjki{!zHNRXr4%4E2W@mBL{Y?(ihKRe4pUr7MxpYlK%6|)92vF z%RVP=4fK0md;$v0?vZZbC0^aHajoKcZhh#~7C5(~j)>{^GhJiBOy*;=%}h0D!I_g? z3MoOh=efYHi^of<4UFdZS+mccJt_L6!m2QF-q0SsvATZ=O8c^RFbg%$>^R?jAte^$ zPJQm)snSsd9vz_M9YE{kV0VvR-@61+OWtQKI(zo)&8te2B+I=)W~t7G?^YB+430L> zRM?yCHFporO8ah@%0S+FXuqyBDXcnikK`BN{mBUTlFS}xI8Mia&q;j}{r(qX{pat` zWWkTyfO);Zhxt)@lSo{sZux9%kH>2q~@3F4(wmxgX&Slu5?_%k%!YmKS$htr7%cWk(+ zFDhv08f1R$xZivWrugRUz7>xJ_+DFXtOdm;uIYQBR_IY@t-E?-sb}Oy>h#_ra^}Ek z5fA3dh>KtP>(`c*2Sf+LHDtPQj}h>F__sy7M;@0)<6q~W!7Ps$K8^Pw$V6|Zq6830 zDK%y=U|~KTW$K%0<)=6In`TN$Ke{;=mgt8!h>e8!NsB4iNs&}8G?GC0eFz~Rj87qp zyj`WTSil!@x-r)NI}w$c%{l$lH75oV$n#u61zi2YImM5Kre1~MxhkTa$A=GBb0#o-sZgaYjTd4rS)={pfJk@k!MUT_}az0Q3PJVPTMTOh&!+{m?W zcJ?Tz>>uy z$%K3+dOzpSrBe7f{R=r|+70Qx;lNU4DT9>o-S_ZmUmjtiTx+Lvsj64qjF#cg{1c#OoZS2#kHP!biX(yv?g%?3GZ!7$fmM zp#RPom6UyT!PABLM<0om6jXycLcX%M$G=gss40Y&z*Pr1i*`#ZTwE%qSG6l8;oeCY^#a{|KoKw&nL3@IiuV{`6T<4RRB*EF z6Dr)dCot1~#ak*|uM$voyL6t~3avjkay;(+6&qJI)X&CvNjNv8CWx^GsR{ zRbOGugMz19>>UI!hbdPMXf@5mlL>K)R4JI4M9?=5ye^Y6sp^aZDqa(oQS7km0IRJX zA>$H^nIsp~Ro{5M4t2^*!FnCPD&)#}S__0>U!0E6==SB1Pvf^k-!rqzDK&;rP1Ua(L6^Mz~{Es#i2<;vx?! zGR7l}AtQeh^rW@Yr2H|{kt9nm+Nk-LFc&p-pU2ZHNB3q*&vXU^xHHBk8REHck6_ym zWRASli?SxGoZYza&p7P3?fifZ>cEp;HS%4b&zt5SLseF*?TXTbm@62kJ6CUh9hD7f z53sO*&4@r~sW^?!ixKQoZJIx`Tj=Q`zTCCwn$%RCTpb0DNa(J?L2hPR6Ci3f;_fn_ z6H$V&-=j<^BKf-}?T>T$(}>3uio0Ki2Ji9YNSKls=lbeb`c2_#NyFHO$;(QGamMxx zF*{#i3rj=0jRj-L6Nx#He6`GL9uNiiAfPa!X#*+3*#O8S=~uPnk8yu`*YA(NQNM&- zgsIonIB5^y0{1RN{WAQ)nsH0`F0FfYJ!n1q=j)=*=Sd4H_GcaSxC0M{Yemvl_e;{) z>@CJ?1fOUW%!=S4#1o62rp_sBM9(Cl81k~RG9EXGRqh;y)cD8`e?}0m)2iA_wGBjO zbyMTKJDu)QI2$PO2L6T?FpiIhg*h&|XD=O4PtEbyV#OQ$ zx6A0!SDQcC)V=&zZG!itUPB->$e~BVaW!_c$(cyRSxg-Y%bMQSei8)Zu1$|!Iy?+) zg${FguCAi!Zjc@f@oX^IV>RDLag(2EXiAK$>~Z?I)3EVrZW_nX4QG(ntTfbg?v@#y zmSF)QZx<#UB9VExM{DzBOY8yeCCEq;rD?ZBa916omjBQn$NTP+T7Mle3;d;t-M~fR z?g?EVr!wO+k#nw{iv|zou6sRSRx=%}Xj;AI+fdlv>V8th(TOAbguqaV#JBA?GCHd~ zy}PfzBes}2ecGG9vkp-on0~U`I4iTj;>_LS=Z$?GX5yFro4V&$?#EzZyQXc-Byj?Vm=irAS_f_*Qkki9aA%*j=R$ z1RGyaG!r3Id3Mcpaj8}Iqb8o3ruEWA>C%*TRW3=yoLIgYm@12~C>|;U)FyZ}Y6vGg z7rdc4b9`=|Wyt?!quj#5!N?GKiheB0%-vyr*I5dkNw7UcJsm7 zyh!z60gEAve++4T5EZEmDGh)5-Tl`$7Ve0UX;t%`$vU9Uw^%p?&5P|~;BVh%^~mAJ zc;ZrkWBe)lq-r|hE0l=S&tKpooBM9E0q4U=c<%->PIK?W+vsY-BojSM&05;NPVoGd zr-?AR#>g}q(dU>l5Ze9Wi?DMIC|Tb@jkpls;3F0>L>5ZhT;*Y7xQc*RTm6`D8pS}K z@~Nlo0^UhiM0YUcqqftvl;o;unH{J!bt+iuH-+JmkksCdx*M2Wvy59Pam=)v)AVI} z$Mcv%qL1bFv$12nOOVizCUA$Wjne&*N4b6of_X?_eno-vy;WXvhcnyWRp?$x2b-;FH*HX6UDm1uYo?03>u+POFDb%^1Qd6+M$11zSpM8 zwrXSw6p2}A2Gyeq?D+HpXC)|y-IXTp({Mtcw(k?YX53hI!%c#k0)n1>A zSH)?Icz{Jde|3Xj+#^IL$vnnb)TzBmAYRJP7UPbe$g0vFQ*?}qF1rlf1b*h;?weOP z4pyHd3HHU$hl)x`g$F`7)5QhKtSkj2HMK@iWWs9-SxT!-t3h(G%%t!|p@~g|UHpdV z9fi~!YYeJ*I~T>!1#c#fiD|Y82vKDJDio&JIM>GDo+9Lx)`SH@<(9ZUbx6?C?)wGD zI@s7Ffn%ZBW7CY+a~yK^2w~5{k31SGeJc7Z8{Ur5g{Dl8jT^E)9Ghde>sIUt)(|=> z8XO$RM+%N28&1oTu{GjB1E&U9%S*Rtj4v+o^}yCi6bbedF)nDl27x1O_X?IH58DZ+ zCtl2j6}tK=Xv(om#Ov=L=AMez$3k`M4#=@(LOB^uBr`uG^RXHGj2PIMZ#`yDFBseZ z*q7}$*U8fOp7#2S26#kA|sQc}H6+X(4&`QU5ltX79^p*_xG#7^ZNo-q#*m&mPZLhnnItH^Di^(}SB@I)nz7C)`!O zO~)DFceu(+xWf1e;}$s#K39}X4X@`B7OgrOvtXD4_U1kI2O@;f7hIbN$*1y3FQT@D z$H)7owzq&gybjBlmTF}bZ)}X$E6@GKqwG%5A&hKRQ>p8+E_}1fxVBWH%0jp#pq%$8 zcR0Ri?c_h|T=q+acXgZZJWi>OVSb4Pc^j?8s^Fp0b(pOjGwSx@a{y}6g;7_pp&8~b z^BNaTU>bXN>FDj;J0Pym6t1e7pa!Lt+WW@F%uFiAGA)`ZCzfNi?iLXvd~D3sMVpWdRB|Rhw=lN6Lwi#ygL+&+TW=q<1L2Q5f%> z&km4HEYe^0o?QcTsx}QOOr9>kIuK!Qpxc({&r1W9w7{22ec*Z0%~8m-YwxpJdd9vj z9+cpkaZ{5jXcQKnB*=o}Q%iqI@@LF-E=rbt#vn~RE~_MZOOe>#UD)KI%$Gyb%v`dR zAPt)wqy{R4WbTn6p_keAJYa)-OLjd_LhU?rjol9FhCSihGdccl@Qf;zKy7G|s%PlM zlz?j8cr@O_0wDpK8&&hT?7S_#15r4-WcNv&+(qLUz5ACEhxan4#8dGm9Eg+h1#=YT zqT!fKVY!!AB_kmO`GlXDE5C5Hg)`muu~8K&EU`$=d9uT@^{9{me$A`b!jVg85%0Q}h~%Y&7>tdgCPVDlsJq;IWWJNjLWuOq2w8$%G%A4nVAp zRGz z+sm9lq`=asasTL;(rU+)KrEwi$*9>F2Y*8#2mag6nmjo$QVqQmo1na?6f3Aj<24(3X2(lXv3xfx{SliwVgj%CQo zjlL&7S=&V%wugQ$l}&mgyYJw(hWk8;X8u@)yn*&bR=3KqI_jLf{g7dOR%c4#*owWq zvQL!O_$7#kPvwF=E&5q~ki0;7l!-g0R0)8NE*EZmt)f}#yHArTaJuwLr)4#zl;wGE58EQ5 zSgsz?kgNp5zIJL0D^1^a-aWEE ziarSxXosv;HTJ1;x-jlaj*-1Kg_SN%WW-9TEQuthC`VdKiJKkqyC0Ff1IhZRy{t?n zx5)_o{!a7+^f>s`s40Oq^E>d~mOd z?NbuI5Zb$XoZ*Lf%?}2awSi9(mbDh_cj=g%mV;_ybvd(SoTmDx)Hs7*tMSx!Pa~`s zg;@GBcf67uSjc4i*zh)&A;978=fZBbhrw2|P%diMbY3|++k&yeeSCi@8D}Q%lsZ)N z(d{`|1{@;zT>`-7G?k)DP@j#GTMzMFbF8;J2)?OfP9mwQu$Q2e^~_PRq|w7eeu&l5 z!unb;cS;@nB}l))50N1liZ$Xl9&e_Kx^6zgt1emu-WcB%#XSo4si%yKH}w~&28>Tx zlO>3VJ>y#QOc^t^;U4ol=m3vK&vosEHQcUMddL1b7VB#dlt29viM19@TwK^p;{d#ytFdr5pmyHGjkuQL5+oq4 z1Z}?r;hM=N9m`EI`Xk^*Hy!y&LZ9YBWR@YWu2MiUVk0l(F7`WEx`>7{&^CjQ<(QH$&P#<+5OjnWwTh*M#K-F%4Q50nmDRrtwl8yH#E~kKDq=U)ig_K%wrt8 z?Mg!ZvXmj}$Dd11+;?(nP25atT71k|FRT}B(q;x_6MIZwaLR~?jxlu_6v|dzMAkDX z3*tku+yiu%@wIm@X2GY_{_3OZ^H}ZJmmn|odCCu#zAj(~G^pPX`_&q+?Ju~p{~hn+ zJgC&M!n}H2h5I>aMV!-NPh@}8K1B1lLZ1k7Y&6tY>_2=qo@UPn?+ZgnB`K1_v6r>1`M-1 z73U=Nq;Hq;b^GaLp=zppfJ-Rmz+>F0GvK>alNFYITXu)*2?>-o3lTaHXIOcWiiViR zJ~c14jiX&Ua+JgyyN{YB7*K<)KD#e)x>js#?y@fNOz*rpjv`H}c^GJeHgch=&G9rr zU7I7Fu3PN93yZ26?&7kx96UPDjQCwsepKT+N3945RQFJa;A5@ z9A2xofCSQ27%oA*G+ujv9irR+GLS5EyF>BA1>OyoE+FgCm zC1G20G$T8v%2w~Wc7ti6N?imj(dkc|U7wwyP24K;CLxvJ)7!Sqs8);q;-`iCOks;z zt0L*-{VRt_o}AN~z2%UFa3gKQT=m z?HF@@#8IP)nYY*)3#7_58W||MtD?^M!z5dz<(ncTwt$gwwzKQwstwhKVs^fYZ!f3> z<1-PYIn$m-sHj9lM#nN4BO-_)Q(CQqBFyilhQ3w{TcJ$Q42?!7DPJ=m>t7gHW zF`oOHscR};ZS9gxs1P} zuFck6RjZ2Om(QThB1bn@q#-gg^^fh?9IBJ{+y=F9+rLiszg2oG7B)xQwVQmx^#NpbjPoC{+xY z(LH>5UjEeGchKWJhpR)O_}%A4#iFGDLET#hwfRNizVu(AMO)ly3lxW<#nYBTkV1+( z6!##(Eu|D_vEUR*?6b){H1b6q~n%rQKADy{QIDeDkL)b6>vo5*oQKZMZ3n2PIO}WoH{oktcW%SW7Gowk| z8y`jkHTU~3wx8&^^vbPXY2LoZRA0#mVSy`)KV;qpa4qn(2J(KKG#olGe0(=(&eFv0dn^zf#*Tv}hS)#z2K%(CWWu^ioH6=QM874mRXS)-3w;5V?4+gf6b z|MvyztE6(p^%?Ox05>8Y?=ggU;&Z50F?I%^zLh*${IX92to_j}?ec)wb??5#JEk(_ zdt^^~gaaKrw{nfBirSIM^WLY&cM4MdZZ&wa0wJ^U|7v%2O?hsA5u z5k#4;@+*-8ftvjo`PzxKhzV%X_vRDixl(`fOPzy9`j&(}auk<>d+?_RWv`Axdn$6w z^v%?A-tmcFh$I?_^NqdZr8}_t_-uV`GhQUv^o4?l>N9%L31^qxitK`P^;uTqdEbSH zt(U*?yv^^oL(9C5n_;qKk5zh2Uw=R!u4}V z{nyL)OSeeZc9t)eA%{bP)6OTaXg)qW4p?26I79++1#Q|=g8*xwro|JHty1#J*$tVJ zpZ7Pfkb`csF#x=@k34zl$^C@m%uWKoXEC5QDu1!t0esc>`Gr5unur&;SG!>2rMA9$ za1|nXHoTBEl^3ZWQ2jv3nDyrY9os00Yv5J>9_B<4c^i(ueco*16o`1`_iC>ah+jRv zl5;!G@Lq+F!~XYaW${@Hye&b>2=1|e+tAfNf;hN>nRxjXm>^aXz&-bx@HgGs4Oabz zzb-X1!Pn=e_49Bbq%Oaf>)i1wWfk}C|C~zE^Z&yN2zs||*p3;pTGtKw8oVYPIf4CL ztz!zp%lugR|56Zgu1kjzoU$>&gZ|eX7q|UXy0B^I=E1%60p$G2Bgk%Mi)@7&P5G7G zWBf5MH1`_#i*D)W1T>A82{^AV*VF~zSp8C!Iz8!KBE1}A7+iT71 zVj;bfOm3s-#HDQB|FL{u2aEuNP?b{lFx}pp>|C~98)>R#NME6@Y)eZhWr`(($Nr(v zf^ukoLNc>b;r`MIW1gA-ip}Z{FLEt(1iy$%rjzKyeXUH;3ut1NDY|yzFHx^#cg6Eq zV8Yc2^eN5ue_!hDmhdL-%AixKEXq*bQxLo33kyv#^SBI8g!=(cs#tGv(gXvfr**&J&B+ePS}aJ6TpVt{3s{s5LCj$>w1D{CjvN zU!|++Gvwt;t?2hnbd6x0@t?gpnS%2Fq5{WY2L)@_8CsrqelvEPY5RSndyF362-F4_ z=UJLD#05KY+A;MrLL2@}BR>Lk$U-dd@?YBc{xBlel}T7oL_AMccFB#m&&*9z6d3l4 z_d{4~dA3~OuGNcPtCK+mLan(ROS2L@&VOb^P4}{g$ zM?9RPM`@055YSV?A9F@l&wF=9&kD=+0Of>fK4xQo8YsIBs4}HF`D~Vcxw^M{>zFc= z{c7qT0r4E8JOAR(*#m!8P_Ac%Jf#YUP+=^I3sT~A2r|0ezg6|#7yoF1`z_R@csPKJ zA*QuNjRl!+8pT2yMW5nyWZa#LcsZ0R^-3Hq-&y7R)+pHIis1Wd5Rk-!RP=~x8C?9r zlpBgHt~eBY=B*XCw%QYMY^6eZq{H@9Ns+=%i2;8D{U^CgbQQ0DxNQxpJz8}cPd^Xd z{WN5u40}OvKPE%htEJY?Je^hQ_8T70NOOdzfE_Z|vaF;2p0}4wyDUVU@)Aa-^lJkfwuHI_$;UX%gN_(c!nu%GU|;4r{gR zjYOsF00DBtO*f#)nTU<)yRy|~mu}U?dk(rsb3(17$u=oBa_)w7YvwR9JsDPGJw|qG zpJ9hbphS$UlMFA)V~00SCqdVCA&VZ%8GdVEN!1t_T~L4De>P=1X{iu7h<}V2ay5LZ z7E)L&JjUP}+m!CS*8d}O7Bn*mlx8jF-cVGICcQ(#bVKqEYUN&G`9til@9v7Z6~k;`_B%q| zpG*mByr8svLx?W;(-$T=b9if&)-Pf`N*!E%vWB-Sxw4K%bmD)f%}&#KKTn zo_;pHw*+<5N-o7+{EA2mv+LvH8M0WXRZ0~=KxgpXn9dok5zRJm`EV^jwa1@NDg!65 zV41Eg?kDxmNkqo>MI%^pqk$jnB4A&-N@u*Gi^Ib}XT@U%EycrP1s|nq{(^_qyloP7 z9xI^6oZRuWk|8X8qK^mo6WY}MvGa9Zeg22kZ=1zdlXr{?DLMw(rVrdiXfBZVv52&9 z)|w7NhH%w=HgZ4E2OA&omVA*y(}D7F-KuFwz8x{mZ;rt)6!ph zAh>G2_x|=q{YwYvRh>x5ipe~d#_Qzf5PmLnEV#&%e0lJXzT}>zC@Nx zf-|upv-^AY4SlD;A<%364EboW-02bFD_e`NNR((Pz1p`d$ZW0}iL{=q{+Z|@=dkT* z&qE(?Y0qbWWGc@Ncqqk}6XK?Hayk15nO3PaS1+J%mM_t92lnb0qs6`wcKvLgOOr~L zTW;Midkl3)G#wSkrz*C)J?eU4)$Qig64MWxnRnJ+yGXSE-PHoRoIJdrmC3X6_L(bh zTwhDvLxmo)DY z)mAq_HA5znD0|j)?i)IeDsBe?tiet=C4K`d~4#H$&Z45u8jD-R= z)iGjyHH9=BkEE@g`^ekaI8REZ&u3?bB%K~l)UoEek98Kb7lL~e8*;KK$CJC)EFL4B z@IkN54S#O;EJY*<=mp@QknOC@f4QwIQZ3K|m#DZSvCi2i2p$#JqJlmLZ=DVh`Kux}BwN(+TtXT&VSl95o*2LvS4YQ$ z!u2RELy&IW{sCJjOf@39lp}OV7nKG}&gl(;yPoAAI8PZbYpeDha(sF547FC}+23o7270vD1zGgxfgrypex}V>&zb-=>j?Had zlt0&vS2EC%+>O{QaRRe~zHV{5?$CMDU*nRHDs>G|5k2OZrgj{)xEH`7l@RWFk8uL5 zv7I%UT{_*U=xoUYwtBw|WEXtDsP1N<$4UuC4^fcPaOInl#P=Hj>&>=JygOKlL1hLz zhUeKrSqD36(bCxCq8NfbVTFJmVX>_q{Wm}eivK2OnufZFHPi`le>)nL z^CEk^#G-w+tqs2Ay$cZ=F1C9(RQ8v>&hmuBH7Gl)W+1GGyo8&tiI%cYE2w?v228x2;Cyk$D%7upVn?*4e96bEXSxj;Jf; z69S1o8Ca(T!a@{FP0Je%PaQe4gRtj%3@Z|Ivu%aG!$-xHW1_R^1zi>9GHuQESD*%# zvuxJz<@&}~6f`g0<0vy+MN9<4oHXZ*fhXYQav+ng+;FM#jZ|Evbit=j-XF8`w%)L@ z^*={&K;ZbkI9W*;dq4kf@O>Cx;30pHa<}*-ER9X4moQf9g7b9OC^`9$wWPw7qSW2t z(H}`?DQX?C?eDD)J#}u`NX$8+@`|Ev+ zS~G9EUPPUhMffIiR*@Iir#DJJjD0$Fad^qF=ai=q#pQ4^U>{}uemSTOU28r;uea`8 zqPP%v4ezhLzO`?v8ta_lL4p}&#u^*C(W=7a=}cCZaeXT_zb7o?-1WKcb7t|jCJQH- zg=TIwbFci4c{_lI?s8Q~yk(H}~L8%V#kLyo!W`C$k~ ztfJ`SQ083BEd;KzDZow$H_a@zW9#WwTj-*clk(gj(u`ME9ud9DTRZ82_TfAg?PJuR zbc5s8YsGDLMACk<2UA65h16Y9UFFS94@>LNzgjIALDwjCm!~;J>CoqFZb7O3F&#IL7)JWC6 zi+vkbfAGEgfFHNpVxXr+_Uwnw$6SB)!=NI@bu)R9?m1DxjiF+xp0CaqI1Q)MwY2p@AC;pPxhWSwyH=#9pCvQ; zLy-B@>&sR2k|xemhgmE_x)O^I29xDph7Y~?7BTjp-+w^5TgR$NC%DauoC~h*AAw=L z?EB8W3o=@+Hebojld=?L>`-$u)Os>f;U$-LBazZ)f}6h{vc6?=YLeP%2sPuLs8w5a zL;9Hwc%5=wjC)D_b%OE7bIuLk_H7fwE(D!Xr?WLp>horh$Vj~%jQKU~?n1rqt(|4m z&wWPU2W1-%?$3&yN_yB7%$H7&m+S0`Zu2J7s>d&~Ho4 zEpL`bT!#}l3-E7!H8)lGnvM1^&&jDxq=;p|E6U*;YcZU}szcx`0E%02>31ZpA zo^hd!#zBlaCkFJ%zWTTX>9u!9USs@~CXH^5@Q^@(Gg8mVYn5)jF^~tBK%bymD_4A{ z2ANQnB?s5>e`Jn)MD64G=1pHq?uC03j#jLnDoa2>7GEODX~Gc-;RW|V^!NX%EKe(y4t25= z6XxM?;KteBi28=y)I5y(1K%J&7{iaz`&{`~Ave|dkE;p#xpALy`z-iDARGbx31|Z1 z$6J#BKYqEm(d)2s?lWlTgL3-@ZmqvET zGz@W1@%gMOe3b^V1vs_9U>3L{Mphm*tPIiIXidtfS-Py;JT5C03w_;fPT4>9bD!DD z-P@M%kqlR_;Z`niCJ#j|6*OkL*{!WNX85KPM(l&oKAK3z(Wp0Y!M<4#3 zaovQci{X2&T*#jbFKiAc>W%#)U=@`mG_Jc0FO|=J1uxl}S+A*RiCEEd%uN=b-{2K` z_cfc5+UKw2TBac34#RNnGMwbnp&KD19dP~NSmDotVQJ5g(!V-WBQF#maUxWW|}`MVMyM^%(l zZt{gjTbqAFemok$gQle=aGwV2)Ry^?+yi#ONpA^%Uvil3p+^dpf6155ju4(FR`rRL zTQWLF&6c*3r!@Jvz8$a{JsQX8{PL$Q%O6hE8M5#x^HeP~FNdlA$l-9xwzd8S^`Pa5 zk?j*xZy>|V3c3H6pM{pS&C_10FLdTr+p*A}R6EK->*c&z8Q1QBkySnBf$%PQA`j-q zv<4CzWy0Kd;0Bydu{GhrT0$lEGHq}!>oN5K!$)#{C{OcfMVJgMODh(T#HY)Dldf?A z-+<;i%Y$1#H=5u4#A%N}Vt6?Djl^rF1=3lk&v@PFdTZ%4cGeiqWNB3$odx?i$)&I2 z6DEJ2j+8TDD3>xt_TTimJzo-H8?C#%XPUIWA0f7NBL2v4{{YH!EJSu(fqLv|lYs)- zW~)3cFt5k4_!a5Fpip?%^`hKLcD_ZqEPTZ_GTt7pTo?P2 zzh;MN)TZ`+!q?g_U6| zS*qsYP5t7boXd;~16vnqbMm+-MDeJ%nJP}D{FW5N94K96ha@3HZVg`F2CZU{OSLN@I&X3|7YIgmoi0;$9BMrc@&X@~f^X1xpj8Lsg zi#)L|lMrU#(<0<|TXe7d3Jwj@~ zJE=eXB8{HA{^q5T6H}=&^iqN8b=fvY+|P#}O!t)kQsZ%gY2?bA?vWospiob8l6jL$ zfBl3{M#Rw?K8aG&()+p#k0#|~6v=oKp2_LYHf))5LzMeYW!cW*m(c70?z@}-o#jPx zd-RNW(p_er8MD-oO#SmLB{zYtt=|#gzXy)P49?lqlekf-#c0ow8BQdo?dhpRz?+pG zf2DPlvz74QB?w_<*Mn^0nU`-cdNzpEU`7YxJuqzSx_Z&z}AmK}W4( zeOme?xp1(>@s(55c5+cKoZl?YZ_-{bZE%`e9FrSBeE9`Oi1pAgmWEoJC50_REq^&B0;gr?>ymA^9Hxb&W|3yRs&?{5=epBto*j z7LPH*nk7pQ>3xEmbr51FB2wQiLRCp9p1s|~4%vKYiPj|w$qx(VK1hnn=2RbI8Xy7G zJTIn2eg$!kdY9xOPecWKAtbzX?(e`&J8JVmK}L{Z@XM?67qefO#1v>2D~2x}~4iV_j7R z39NAc{TruJH=!qQS(rP%FQE)*g0HI<*;nkuBAMWx#&0IPsSj5ynY@^9I3XvEu7xQU zzK*NCtvbI z^%hL@LHrL{Egp-b{{z%JEKb>b|JY8v4(LEN)cPUH{Z^NY6+xy8Rd}ws%$SvUa_RGI-#-w`RB`C zL#_^ShT9Nlq?oinZA`}iJuKClr6tr#trUtZkBnEh!h^k7t zRfnSTb9|<~#)^Ms0gR)ZV%=0Nc3^=XypRN~xR^QEz`-S*u1lxvZaQ?wJ$u)DZGsoR zMf}Qpd-9fSa%TwYpV9A_m^_NTqJ|w8Wn}JNL4GgzDSg*9n?C z$A0fz;y%Pz^9-9T3x0ft53U6_9c?MNgPxc^-I!;EpC~jvHJpJ-G{^+UtJ#~`?KANv zwX<=!{VhrN{{w#BH}glq=HjZ#WPReL(qMS3pDx{u=j&lIllNr&A|r=<9Y|il11{u0 z0@KXjTgPU_Pjd&I`wRM*yNxh;55IADdICTy)0eic<(I+EIV;k+Gk`@V*hrj-aG_=v zna-awbRIT(60Vhflw1n2SV8YKpO^TYyb)0hYylSGbQXO$JLRmrXB@v-1>fH263ST# zxIg|!;IYPZ9kJakyKM4CQyRQa)wk%{$%-wD2ZSZqmy-5`%cMpn8%d_~bR7-Amq%E? zQ(u`%%ly_*Nmr+UdJgaSNOl*3VGLMIIJ9DRNa1)oM#|$%3?0CUjbeFr2`$3|*CLVh z6YXF{bTUwriq$C!JH^m_IZ!$aWT!Dt1=qoa#Q~x|OCgt-Wa6HLlx0~$b?H?sqGq5n z)mGBVGGa^|UIaQbG(Iu$4()2t+P5q|>M6Ixe(-Mm7A7zHZLV)(xq&mw58kUc)_QO3 zc{DhdD$e?IU-g=BTql(0%6;%re@McG^6mdv))w1kGniRtRj0Lwp(@Q*XNeO?V@I}N z#W>k>`{twYB(G7UNefw28zm8>#ssb<0vd}(eCPP8+cS{-oti_*(}FtOQ}RHvkL7Ha z&+9}(haRI6i1vRF+XF;81I%u&dO9x9etaXeZ>m(z8VCq{e;$pz;AW|N!~Nz z;X(7+GdoAY7f`<w}n=93Ht^^qI268hPc{B z`#e2a!2%>n7?YJf8e}>-*Yn3@!J@>!fxlXCgAi0|_(3^Ig{NZa>wKet^8U72Hc~jz zBduXA&_p&y52QiCvmZzH2!!=u4L>X0mjl+=`1C9Y9mjxLeetp3l!^GF{UbTZiG=Y9 zDnU~`g8J`?oUX)bIU8$iNn16y>WZ!uo1(^4q?*+fRsK)N2$ljew+aJG2l57?m1gbl zW+?n>y`l1#C;F=SbMmZA_fTwcnBz@Au3=p(?=jiWO&4}uPiF&DlAXLOZ=jYVo2A4E zCnJd64JqTNGm+#~&}Sap=dy`9E(4Dr3wMI`6Gl(zkn%G%{ACvfuRgNW?|`nDcRNcJ zHEeTXd?dO*8y#uP5yj^Yn$@Wmx8VX_c&%46d`7 zXxQ7xP+Q`AOJv{=(hFxwl3L%J79bv-!jvTajUKMAx{{V@kLJI^L+iDU@W33KE-iOi`_Su+Q#sz#HA1K>r}b z5GBKBbP0QN~ot8v~vWhcCt=4TC(NYQ$o{1^{_HEGNb5$plD7Dl$d}Yot zMo)S#5gQeUl)Pg(C@k8lJcPY{f(F^Q}k;?61&4#z@^!0L*+IEzp=jxgr$96qaF2Q9wmY`cbVYc=tS zw-H(T>*-8Q-WJei2YLa?n^{@{$=x0WdEX)sgs0u*CDL_~JGMZAxfk(eXfi;7s|Rz{I9*44*;=3Hz zc$FaKix~Z1k;L)G0OO=RVjjbC#!%m8?G;p?Hujx#ng(x#rd+9RC4d_}0B7MV_(DvDBcAw*5k*H z(1O;V?env*EwD?7$)n$a3{^aEq4wRGN_NsWa+@)er`o>Rh1=#u+J6pdEotp26v+qQ z6nuU}Zo1NqJ-CNg zWxNSk_;c8&-y?(4Mdymz+A2bLKlGDpwnX2aTun?RAGj+cjGl9$5LlK8{lr&s<%Pce zLzw{AQkxKbSs7J5NbTx_OUkjd@*Vp-OnI(pdSNl&k^a3O@m#9a@A#3M#tw~;BTePI z7o98`DVJmtfK|<{6OQv#(hkaS}*`G+xue8)RWUq!>^!u3?*IYA|5$ zI@(L3_Y~foAGh_cEK&t4>a9`Q`l~|{6D;r=u?6~l$E(^UCD9gY6-`hd#bkMzGG2eh z@6EmXK(83|Y#1?d6QO-{wLmXftQ?3hmn4YFsQFS)904gyzKTg&KR?@#GrWGps2JM7 z;a(3g!?m~*)4`?!rO_K9{x5q*5wFA-XeU_O#xsFKg%WclcAqU(1a<@=;F~*EP|}aJ z=wG(zhC?d(ms{7C&s_w`+fYTTV(u%~{sq&_GA$)OLxNEUG>gEB+S$Q~xtJ*)hk_mf zQ06S~VtP7YAw2cVH+u{F_n;t`JC4~yi8QW1m2xGDMcx2B$5{V=B?j{pK14)Z9FpJC z9}$MOGF)1An^AZ=`*F*ti4YU3-TTb);rY@4cOp|v`1+catHVOojnpLwbR^g{Q20?rsT_-ugQ;+2*Tsxo zTNrkz1TD0#AHDRlRX872u#xe)hDSl!6OY5+{U>V8;Su1k;5kDWTq;KXo$?Z*hb4uD z?>pzG@kZ4vH{7;)qKeL(aiW-F*gFg`+36T>;d8qMfG)#W3AOF?rU!0^Pa4`Ht z=l;4e*I!9C&NSq-YTU>lwz%U479D&h^#fkd`1b#K=$Zez<;K$fXnt6B*#@feJq={g zj#y9TrjJq7FQY1Z<~kBD9;UTWB;-E!B4+`~s^CZdLym0T$GX&M9dlZ|_|)W`i;UF6 zs5g}h%9}iuTzI+X@ql?a<39oscfSPnWSP$kP| znv`wYL2D(dWyy1(T}w6cNOijUXc5b`#f48M;!5HkzG zahU)=nJ{+XxF)Ix4Cv)1` z+XqbhInRyr4_(BPr&c*x(>{3mrg1I8A#t`QypMMVnLeiA?3hJ_B@c7j2cJa~YK=RC z+g2C+cO_pa*N^lL{(8fbl$kzBVKHVJyy6nv%70XY2xD-(@9(=pY%j21J^LWuv0#jV zk3CAT->ck-WXZGJM(qfO)Wt#5m)f3ouK_nz+f*`q-A+#G`Z|t$Wn3NRCG%~<2LzBD z3Vw>=M}qp8YDejMPiF>x#p@nt#Sw*MU%6?w2flm*-v>X(mb|Yjl#tPxhnxpsA4M*? zkU6q}FfN|X&Zc(NvnDja7`ha1L4mz+o;RV7gG?b22uqFPDTFQmp05sd{t7wqt{i16 zjo(H>V7967lZUOposN{WPo2x|Aqn9Q6~0T*XWQ2#4D;yVA|t!1{o@+?k{nfE5tLJ? zR|X#Ay0R|&X7Dpn&pQA1IW~Hu;rDjJrK28d9nGoF&)$UEP)LwTHbx9myLUw`{pYCH z1ApMTPu??w2=`#->@s~B$Op|CxC`gwlVtNzuqRJ+OLA9S9_G1A-1ny*;59{NXqdDX z9=UY;0lu8VX^ri@iE|yaYMSNoeXJrB|EsbV4|Si?d@>(mfMF#Gu(U0Fmp|tNGX9G5 zNwX`pLfIHtMF*V};X4}61qUmm(&mYiReukTnJ~f0WQ@pKSblJZp5>r(U_)w>)mNdN zoEP8xy`QyjG8ajkh2ywdF#;Z{E~Gmb3`6Dfa+%cMO5L8WCPxXZ??}b0q_8&;C!N3M zIe^2fKqmxm@(1RQ=J2$g;dtF8bS1s_j4-6ruz5SbienXM&P!~gkxXG8^q!!PG>XU* z87kIBwv9D*nBl;sKHR|6WF1c~8zlax-tiaADx3jx(J(|sB_hDEV{T5wU?Iu4(O`Vn zK2=4zl?S_UtovixXb-=XZgP4@#i<<@evC_W$sZp%RG}JY((|p|h8Q$UcG_RmKZ4ck zSzM#w3H6L#OR_bL^@+0fdeuI3lKGN}xVuM99gW9KzM9)D$YBBDx?A>gY?IX$9ysT} zRjtXalK%*rZ}h=(8*$CPD>h?`$}Z0wkSgB7Vn13_dTsdYE7WF{=ZD=eX$yZ^U}x?| z{?N{U1huk)dwTd6ZYcRBr=agjwC$&ubLmpU>ka8?UB}$C^*PYXJ4`I)$?Lv$Nj5PD z6f%ngbt)-pWcG9iJtG>Nbh_nYZRACI5ga9s%DUA(qkZ&!n@ecB zh{r#Ih*q)j4_}cz3}>;ig>Ei|BP_>7&y+hMp*k9S1p7K>D})j3D6%vh`y}26=Bj55 zkt^hzUUxX%#8?+F-2)i{Yk=-dQf~hd+yZXQ@p=qZTo8`+NL}R9MA@1DHo~PWucbM& zZotj$MZ7ZI8DG~L9HO(^^e6ky@E<|`;+5bn1+)UNy@^Lm9xQW}9Yg>o5!d*(o_Nl^ zoqP{;?Ti1J5-Pk+e_&^hI5>2z?MVKH5|JKn|;vu7nvFUX!ai4Q{~dGADweFkAW9vo&frs(nc`KF(`{kT#>y{z;9 zv4a-xSSBAe68oFLt?FcGHRRMVNHS1sE4$p z#PC3&&uVSZNs!Lk^?5c+MS-u7>i6e&bH=N3rI%^zxxiV~)V(OTOIY#Pg}05-%$&)` z@l*-}rg+si>?o_6G$#6|!8?-F*^c>xQLp=vH9rPTx4t1!4QpYgIfcL#>MPI~XJ(kz>(u-ft)zr?KlxZ4A@~rw! zqRhmqkmjRzNxnKYlQl|cBTwMZXpayaI1p@yM`)cW!2Ks{Iva2)9%Xi7^^n8d(m!0?{=G^y} zJ;U~8t3H+`xXi&2cn+W8_b4Scj=%RXbM0q+o4zu!RL`RipQ}E{-`k`|An~6=&ZW^rX&TxEZx{DArzW?$+GKoI-cPvxaX)A>q?sXh_$OgsqC<;a3J_akIe3@{g zX>4luM*Jd~CWxt~CVpkQv$!ptEx6wEIV-wZaQIc@NDQArGkm=R6pr>G88bHH?;e(=c^zbP zPLCkR&Lcwk0@SF(zn*0RO;LLjkwco-FNlm)@1|CFsJuB_)MT_d#2!2FBw8g+_c@Nn zvAe@o7#-=DFj|H3oBC}rLv(+gx`PjxsC=X8!O@)5K_u0W?*}LzcGm7aM_6llJqpag_-TKVv4uB(-4|8R`h(^MC7;E|RwJr`{8XrW`u@&6a>#a~G%SYdD$N4$s|m+nmQuF7^3oH01!oaY_K(%71TdS5OQ||DXFRTPW>A0#A z(*OM*L9WCS)Wa_=#Ta8TwqNO+S|0;|YVDhP`}%UMjqo8F=8k(>m`r)6%ap(Y=b*&q zk4X*#^Je&7arAjMeSG=}6Bjw(tdbA>v>5qj39iw#u>ABNU)a_WS&8w$?dok~BgXq~ zsIYyLSK)bA!ATgBe3HD>Uk0I#v9GW0$CCdpE8dgSDyjJVdO6&Jcd%4LT*$2ljHlzIJQqfPByWv&qvgppqW0GiYpA|Mt`nCNX}^t zuBG(@b|%9w%`NH?TdSQ>TT;1XPIR4eLf@foc@p(p+|k_jo($J)%=E}=-6r?6Mq0>>h}F-cV1{U$S&^?4HB0(fW*~9r+_`~;pz$Q?%EsL?4G@)D#|YeYn$Ww^;iXz{5h}f ziHVQR$N=lah1_Ih z1if#9XrGsZQaH}!4yNNq9G%z+zs{y9XtQ2oZ$%6NPjQTMcHW?3gSSD$SN1FKPzfjZ zw)f41WX8i7U;BF6+FILgTm#}d4Rb#N4|6fK$l6<0ERoNMd~Mq|Ajf?1V;BC2FfL@a zWdZ5bHKuyI9O=u%39!tFrS&otce)$*D?ArF0(`xN6b49QnOkdem6`)8XIno)di=6u zmT*ZI+;ROZs7jH4G-2^7 z0G?udJa-{{tL=bHx>d!>;e{{zK}f9O8ePx`@9c*Iq9vNy$-s9A!LLgKPv|!b_HjN4 z)w_Z^Al4774!V|+_GN!o?w94*Pot5M<582xfnDOIG%J`2cveyxT9S{I+1V+tEFRC!qu$FZBr`j;B{a|+^-lT-(XU(`d)@5?=V#5NR?Sb-l=z{ z3v3+F0^96En%=oP`hzg^Hc>yGxx4?3eT)1h^B-iE`uK7#Et$j6tzj1UOv+{67R5r1 zP0Gsp%_44Vb-Wf%{~$Ptejgr`#8FoLnddiJV2LlntAOxfFhE@H0Qh^QSssYx75(ub z#)N6#HOM8UmDtrEpH%nT<_maV$}rUY>Xv#o-iMPNFHe{3@!d_kB0meF^X=C#%Bps& zj8`!sw^cK+(P5NW-E>RZ%$Es)e?)gDoqjBlISY)@6XJcEL*Uw3l;MBvhl$s}{P9F_ z=J_UnGEtX@%$LWKXFZNVn6CJueFFxo;coNTHMiqr<}fw ziJ8KAs-rad27^qd=q;wf%5={?=?|c}_DCPC@Hx6`SIDI&LQbeK3@$8nl{hwBdR3#< z3e;==RPtJBiG(E+PdSt@^ zz{GBL-ukV8aQ(2NUrabNsjIGEHBbMq{){ECjgwmxBrXbKl-!tiHoHNyLuPdX!26G! zZ8ZB`(gUr$P+hM)jg{H-=4CDh`j-C$oIAb#f?Vpve9#{%ABPRVGM>sF!wgn0DeH0Zb)wpV2k0zu4aDQ$&lm4PqLlW{BlHg|4K`-6jxK4s(PN*tDlPB5{9KQ=**XW!pJX3 zM2oGdL)?{>rTbH5Syx%dH#(CsbliWD&p+dI1{WNR`uYHHF`~l{zLOOyQf#WaEisU6*-R*2*8lu`0>ALnHJQgeIM50nsW=+}b6-Fnt?~d{ ztWD;U+lSTPoyh_Ln+>Jhe|y}ib4dG)W9Hwo{38GbCAH+te%N9WN~q&Vn(Pb$X5H$^ z+LWE}hSWVEom$1Z81C|$+x?QW?&vLXRUC^t8&Nrd@btf4|A-=Iv2|Bw*I(5X8R0RD z`YM6^K$=VlZ#lf%>H~NkVT>Ppdn; z*<-@Xkg6u=}nCUg5`vZalNw|Bc z2Y8pn6&G;Ya{0WaNz>aax9vSZN9m5xc|olkjkYJ=M?^yjx%tGe()Ph}!C(!KxkH9-v9>3s+Ce6cQZ7<5%NtaZ|iCa$jUF&#`UB9nXqvs&{C z3-O6K7`>Chqc^hTb?OpIMO4)5>sNSEm<*D|cKMyH#`kw6?Wa?ULg^=`BzmNnONc3C zh178WtcjR-UqBkL|9GJL<)B&I@MGkorYq5EEMe3)uHX_;^qlW}{ci%Ri-EYa8ArmE zkUSWLtx; zokk!2b=Ix?1{1TJl3=3VZ^WoBetOQNH~x>{8NVe9RcqqWW6i7vzSq2)!~-4-$!KG% zO~U+wJ0Y{*M|V({cm0mqdp90eDbhL_q3?9Wj6 zH|3eI$Vt>i>e@+s&34d>cg$HLCz5|3tVXPVw2WO8_vv;HOrPX>U3lQ%gfyDA}S7mW`5_~L!v?9plQ9Y z2vr?{e1)S6OA)tvB%qr(-1p&n!xK?5X2vwwhUG!rho6XXjwXC~Td){S4p;GU=`d3!8vvKnr9 zMvH<)6r0rDJ6TJ;C|_)&WbPd0cKD~6KD(v$kSEQZyr!G}T+9;*E^d^;+4)U)ohVzo zS8*L0?e0u^sJG`G=>^-(!IEuZjloz@rcs#dZ_a|aqE>>|{y9|I1qV{am;f3MtWj{pxI5mZ@ z3WnjELE+5=*g9K9u?iz0H2|XCqjisI@M=q)1sN6cf{}nE>l+KHhbil2@R7r22P>t_ z3-jWEC4ORqv}w^R0lovoJo+{9pf;EdLf)wV*>X;=uUgNrTiLN6QCF6HI9n5wYjAFc z4j;oYV&8NwhMAECar@Y+VSBM`yNy=Fmad}d>1N`et>$UagmjGR8_$^+dTIc6pqW|Y ziJHqjIhM=*Wf_5MCn42yf3p`|i?0*N*)86>)g?)sB2u_=&x#_L{txcH`m5>q{}%-T z1;L_YDj>)R=^8^(T0uHSNOyNmMNo3m4I-VB9F64YQQPS5u8{-pKHqch`QCf(z5l>H zhw;OBzZSe-=k{!wDU3Hs zK(BKwoqt30d->zoA(rw#D;Lp9-HSc+>t#M&G(*MWZ5_?6#2hc;U<9fxP*C>&mL~O| z=bG8tf}W2op1)Z}QO|9uZ(e4c)OzdK3Tsr(`0}jgQ2vRAY0uSI7QHp4O0q7TM6GXBcJ~;2y?hW!|MwFpR%OMSz}v~{ zLf!T0UsCwmq~N&BG)UVoTbJVW%wFu+VxsG2j9#&pwtl0n;qfu0?trka8m6G86&!s% z7+4LHv#mbywM5j=QKW1>PI#Ln=0EI;94T45ZW?>+8@&-r-^XW2~wu?UNNE zsf*_}3CmM&|H~j$Z@NcO@B}=Gt`Q7R=uS;C^14HFA<>-(YP#&8rfPYBK6eS(CPmXsw z@NCJ-Q=A%L6wRU;Dgx)_&P;p|!Drc6bMfpwB>zmqUEmPoc2}y(?~AsvQBRMJlDq-X46|53O;O>U8h_HM8j@ z_Ryrc*a!9@c5zXjO0)OzzBRW1!pXfGI1yldIM)8kcy6wPHfpI^kWjI~bRA#JNh?#- zTIg_%eQ-N^7owyMd?fgX{z9JU!Yh18Btv-o;lrZ7vd3FdGRx~{QYhT6>Q22sm-nKuG)_Fk z(s}mL?Tm{%EqktU=~gX4zv0{3{Lt-!3!2@$>wwmtv;FU2z5|(HkH)m@C9aU#?1I^j z;*FzC2NAjybi$posdu0{SdYtS;liq_Pt77AB9m#v0Z$Lnv$xL>YER9~5K^F={@sv} zE5P;4FQa3PnQBFM=tK+okZY>f_8$>3{#$WP#a0W?A!+ck+HD^?)uhgs_JuYLAC_hU zf6w{eO+xWMx%HKR>V{sG%!HrZ*Ia^q^W-PZ+66pm9?CsUb*xm%g&0k4ahS!Z2jyVd#xuXAvFv!6DjTz{tVyalN@|HLo7s;0@} zd!lze34?3okH7SP8Ft?iTJ`iz>?7xi<6DfDk?Y+;_NU&dH7&nQGilu`#`P;@lIwc( z<;T)p+)V^V3M>dOpgS_DUh7rg3`Ot6>zR?_X@VIjlFxkjl`vn@S@U z|LJQNF9{wFds}8+z$#*zW-TL+iKSJ6axAq;=}lVs&l+Eo1!4=<2J8G$l}f)Fw&yD|T|- zpCeA(uUUVWp2L>JzSdkh)1UjR9coR1{Nfo+gY_C9y}OfTZI2*D+}PVZe_l2#^`$Qd zn~08R;!>tCCZh;fe_eZkT!7yB2%&}l$VbR%%)`-mV|K7u&nc}hRzigQQ}t19okL{6 z5Lq9RlPG4h7jJRsl(c-e%-I2#cHio7rlzYaFArThO3f#tQx~o_dl#(3@NMA>>Hzx_ zJuBrs>GXD(Q6Z|CMd9wbB4^1=p8L-%4t2DIoO7Y{OzcJMt-mpP32h*jY}Zu$I=m#n`XAAq+k`a<1aQyYY+wp6oZZL&wOdcM>E;X4e4TTD`)ReeKJ4vwVz+FyTAjdomYKN!5K zIb|6X|5?1kTpW-yb5>w`3M;Y`fGBJuz!|;pUR1PLfK-0IOe#N zW*o(o26=GzgonUD4$1z&Xk;||>mSj(KW|8kcl=U^Yw8${;|Mfitcz93^to=C>v&VO zf(0*)J79@3oPlJI>H7J)fUHbC!2KFHKwG-aShZ~spTz&O)Ft8?y~ACM9X7SOVziT1 zOX<=+Me`4%$8aTSf;rD^kOxXV@Ye_MA3UCSf6C8WHEcXfsDoz1Um2tdjpo`*U zT5NPHpl>LvYRAhFN?c>kaYTj>k(E7CMFau$x=gjgS4c+?SFm>YtHjh?|75O3YxVDd zA8j=KKKx4w*zbGKU>_s5bnHM)LJyy3FMRfgnHzT<5^Ig!aNrr5>MPQXmGbV?hy5d3 z{ayG}P<%%=t5bJCvjf}jI$VhRR(&!h{_S&9yxEs!?p zP_4}y@wm(0fiJ(-K5T-=mBG|P#|m^Sam!v}$5GCIYyC0&yaI1}c>7GldA5TW)9<4j z5;{vYk)uArO(bAa06lm=&%9}1NdWVzDN2%e_nZ=ebtI8bUa5z6`=7vj0ktn+CCagV z<(Ol^#}s5#+CTbY#sLOr)WqlhOGucb29zQ|^pLf{DH+JyT)jx|w<^1S++_|)R9|&C zHTT#H%pgo<8;mfoS{H!aVhmnZjs>d9*)MWyxIoA2U z3FEG@LRaGs;~2lF%-l~aT9oqlB~pJ`vVr>CQ>r6b2_wzuH4!IW%XZl?9q=UgmG z?7ADRUrPf-2zVp<{H?ub;l%WL$?|^0((Ebwr+}EL=N<6~SkwUcib|ZAnLc$ZymB@} z%eEm_2{>;#1N+-r$=`;WK(^HeNu6Jm=${vKjV_jX)T&9&a%`^}OnauZE&JbZ=_vb% zZMEl*1OP-7o1_lr)d;SI){C_l&!RCLaT-3Cq+Z=U@={#On5N~wP^u>TtM>u2SzUAd z=q%mw701dgH@>GehX05PYgK;)7ci$@Wi2AwXQ>zSV|l9^U0%3eZ6`6rzTFE1u9YmY z>;|fh9Qd+;Ks1Ii{jwR-1}vool_~oy4xBTS6=i+pYKOyA-lZh$QK&qKqI^9hO1Ge#0)UD#R#E6 zu;xIQSHC~1ys&5Ip((MAtt(A~j#lriYVRYJk5~L{w(&2;_FjAkl{n$=+t@R{lN>Ax z*S>{(`E)D4exGWF9QQh9NsjFjYs^$o7RX11cEMN52oAA<_@u}43E!M!yn3@b4T(rL zO=>lhmgB8X^Ffi75tud}a+uPd*LV6TyXQxnCcQgX=}qGof{o>$2j>7iz+*sUsUxs8 z%*ms{aV0x}jXPq@-Q7r}p~~>uSST>THb3#|&++R4RxU4Z|Ye2yGgI<=x zhg5?=WRmD;kiGY9YX|@H8q>N*)1|-grHwEgJg?7{d3=_07>^D610HH} zePEz+EMf9PtT807+|NowCc!<`!8Dg)!Ee;w;0s#Bc6~@wO7nW8OQm2>GX`-87oyXg zLdVD8>UEg5>hv`IaTjUfbC7q9y+$1pWr4a~E_&VO2q5TM{3>V5KBl>W@7~^^hKBxY z)a}Y_11+<0zf^O#OTDR|8Ae)uk7s7ppf00*Yf4N-GJU@TE6mSxccj798)wR1oiYpB zMFlo3R`lg+C5+t~Ta%k(xv}cul`r)ss-t4>_O3NXQ7c`sl&Efh&S4WClu?VFC$ile z+>Qy~aIBt=_(i*@Bd&n2(u@tNS;v%3;B1Dsdhjy&{HH+|+A7LjEzW*buFt3B3%_#$ zxNd6Pj+Ugs6Hkdbe}}inzGaWxa~mAT8biJ$@&#cE{7VzxVT1^tiH@j8Wf8>H^^`Fq$u8;mp*YN)1S|^+o!Oc|4tLX z@b}d>v9>8QubDBdWxm(hF10QhBW#uv9#$u;?M--XMbpiCPwA!-{-P8!8m?V5;b7P0 zPrriZU#b7;wwn%6MNe-^+CvO_-Ini_bngjeCSTiSeXovT{GBl5e|BjdjcZ*3ra>sk zdEZrZHJ+8SJJzv$2B;0SFl9~aM6zPXuUj9rWPeUC;?<~BY3V^)QIg6?M*GszPbnFh zzv*7XofIyos(k%D`h4LZQNL|`aS%m1VpFp#uUIAxDAM)!A5mf~72Wm72s9&*3}cqX z0r0&c$44^=9ey} z;Qe)SAP5aXaS6`UBHpHK*xTT7t415s1cgDP+0zYI%%IlujRn)4<@sG19l13jfa>`# zMZHW?J5e%ml=Pq&7`ImlwDC!8MisPLN&z9z+viBVhD32!cW0Z}-Vr70YHA&xJ|bL~ ze{J5vNi(EGI@2NsUx(D7CN%b_51`TfP5j>Zf3borRP#DD=yD!iCd*jbzPN6mJ9V4s ztnICDEe~(L+b;*Qb)+SfNZ za!z!uF{^tCexTT~#Qy#IV}1^5qIa| z&Z99%%ou>v`z&i8uKf}DU}ag?a+LTYMvG5d{?=3PQqTB9?T5|Wa!z-Gy5vJ7A4GAh zD+Avp_FVWX4XJ8)JG3OxFPyNnW}TFLoTWeT3zV}gc{mTQFZy{#{A88HmWiqMEX_Uc z20CP~IoxAmvD`>o^Ahq|ty&dRMJr^G z?=H5?gEqB$^X|_gGo+M{lbh-raAw8_Uv%>_@Nr}0rx+AqouVYPX|F|)2(zFk*smbBr1hbZY>X8m?F^xk0_i|M=#+khPXQ9n`3 zIf|GJpg!SIo}`A3xUf=Ull>KPp+c2ROp+;tXWP2t;}h8;>c^rEH=jJYw()(f@cfnf zXGpZF`&c@2Fw79EmTw}8rgWipqQ)|x!k>@g0=OnRIQRA}tzCNouU5r*z-GQI_5^oL z@(Gr>pMTvxEn1?$ z=-2rh1oa;Ol(b0y1X+A@$4;@=A2dUH+OJ3bQ%}P*Ap@tKr5sHZ)l$r=T|Bs z&iRQfOw;J}M^IKA!EEi&}aGgs_bi{P1IqaxUTtW-v4#jwW#81`VP&A-vZvYUfxM%c4iWf`7C< z6>=RTXdT{Q|I?;UM6{*d8Be!Zpp`f~MY;Yxg_HV#bt^Wyn@7eC=71_kcQ~(ezHIiK zz?DYyZ@NE!l?oVa#KBo>nz)IE+ED!nnF8orn8C?Dh28D7Uav-RW}l>mYUBFMgT^YK~IgOLGeyP40(D|^- zsaq*_hLS7RR?+bC);yfZ4a$x14R}Gc$8(KvdA*+QNppPkdr@Oxa$JYW(}Q$LLHbC5 z@TrZBr9>rJiOz0hvwVHWv)%{SQKJZ=8$G(DG`*j`#KbK1+t|x9@HcF>YD%xRJM^eMHIMdlh4~$-03L&3E=dBFvGr4Fvu}E~k50S%s6+9Z z*LhAFZ``yM=%~t8)9)ksUT=;OPrqn!7X3TkTBGu|k;0hQ4JXEzoM6_$aMdca4J$Y* zg%lBK2E+EE=g`@{JPw1a!7qqb#l?}t@PcwOiIY-bZ;ako@@Z6GpX+v(+WHBc_M1xC z^N^Fyy}#l_t5w~SaVOh)XILihj5=d^*ZoMUS?<}DMre~)tt7K&Z`=Ab{ho{Dim8#2 zHNmBTVM0j)xs8)a@E2Y#T2+-(DZ0JaJ={^S*u#v`8gyafb`V9p_Tq} z)#?9uuC5E=Na%-bxp}XKoq-dM#aZu{y)3SeQknjJZF0d<7rFN!IGRzkRVVNvK_mWF z56?pS`}rie`27m2Vw8#_e%d{dyj*5Uq`3dIY<_D*Um>5U%P;VI6iB$`?r1LL+|;u& zoVsfL?8nG29gScf@TZ`9IL+Z40^Bs#b*Cw@*0gd^jFhm}{yE(@kqFH**1H%lVb#h# z8^w63px${c8F4LUtER1aL4u&ZYhb}cj_yWtYeyI#g*~#h1~UfdS|R;K-5D~j2Auu%N`nn) z8QR~r%A?6<9GU$jpg85~cNHUBZ?}K}KZDaWR5@JHXFE&z?V}yQ;MS4R?r@6s;6@L#00s{p1|a0yx#K1QZDvP zS+9r`_Jt@Y`{w|)5c05f@!lz5dR>)31wFXC;e#zgSZP*XZCNW)#v#I1M(j=8{4e39 z8BduvivtElYFqApWx89@1~%?>CrfEX_P32h9QBowvI8z3C>)hBmAK`7p(l99%}sS< zydPy6OE;?JtKRpUu$E9Nc7~|zt$O460(sxd2%{D8>V#vjlI;zh00F*P2emO48@?2@ zxL0eJ*O3rF{3Sev<`HkfXq@dy-dv!~++59_uPwA%X9F=r8PSWeP5H4+mF8x` z->Qky)bg0r^7u}1IsSgbw;jRpgrCM~Ow{i7>%0Gd57TazejVyi;xv;iT@i{pxwb1m z#g(M`3qjP5Bc0Wf>KE((5rJ#U_#;;S5j}$+^G^0u7`5-X6mKb=k~TQ+_5&{V{}Dxt zo$GSS`JFQl)!yb4j`iM$9xE8rv1pQ~e@blrN3=Lpb>)V<@h5EQQ8!PZPI~`{P*A*U zYkR#UkbuGJRY3azgttkVzOMRlqfOARrC|P-i(voTn*g?H`7g}RWR9tK(-r=c*Zco| zZGz_If4+1w)L}{HKLNv@S<{I!$MgS)n4J%D{`*7G^o}T8c17IiU8C?FSJn^zE8JJ8 z^k#-2O3nO7biND?0sQyCa@BAd43EhXau2!&m==ev60DvxtWQ^A__KdRNG3ej|2odi zL;a@0jBxCdaVI1v-%NJ?S0?hd41x!`-g+ZGzo_uv1A%b_B6mR0g6|9K#~{B_oTb!Et>>_a2aqiWRALFt0mBb@yiE@f*RS3yY}Gdw=%zx$Wfa9A5&J9xR1nSN|4i!)Odeqz#G}&Dv`e zE44pO7LaxcIv5$08j5k+=pQlLSaOa2$at+zMNWGv(m#Jhgz zt;p-lc@TH`8(-@82Y1VLjmMc(N1XW{+#Iq=QD=jQFR^M@>X6!}`A;=mg@xX%T2yy}RPZusJ(z58cT4+qBAAE2 z0}vKgqT-Qw8b!>rI&@2YkS2SOiETLg`-I7X7V6t6Sok{48D#L2>yY}J^#|F}9qROV zdOQ{D4G9v+LUt0*&g^0KdVHkLKaXeaRQ70bE3+_~DKk^O1RA-Xjs&!&W< zAjH8a$bY&j-u5T!Rjb$c@roP9zJtuTCHU0irG)O*C8bp8qwUJOe90DhA>~0TKL3as zXnZc$2#gmyXBs{G`G+3P-;DuLj`;frM;NZ>RX^~t#tygM;JBKyPLr|2CYAi3H5Cp9 zQm<#Ao4RF3w1g<5!-sIm5uf5Tl;tErIU{sZ{cm?L#Z1Jjt0r7hegDPy6}) zpt}I#&WN+&ptr&1E%$xTB6%>=23~JMQr<4lH+$nc&KHC2MhZct<|4Hc{FYv>D|{++ zmR0gb@o9P%%X1BbVjsiI|IQ%)XqSVrE~X(f(j~>C`y`4Kaxb8>OD#J2$jy^8ku}uh zt*61^Jxy4utY0&-Opk?pU9X78F_G9X>H6uqS6ij8>?5&xGwKRwRciM&v{q)`yC(aX zJ;(vc?WElIreANbqnbF)z<|8riTz&YNjj6zyqjSUK(EyhJB zHQv$<->jB?W|e0Cv%DbQiF#2_^>=vvm}*)a*CrSsB+leh4p$j{`e~#gvS>={wB!<; zPVhIA*BbC;0w?FyPw}Pt3}KA#?&uDOA8qNldnv$GBR|2PjTqFX_dWLbiJ%81|0C+u znA?glXP`I+i{CDqv8z;crR%F}liucDImEJ`!JWzCRlSOSjCc{I(vpxWSHXuSFqtlX z7Hrhpv|e|;Q{aveu71Awx*!Bz9$J=Tt z$@h=0CCBvd_H1gzimv=5)MrLUBGbOK)1N_f#s!;(35Op$kg4x+l{1KkDcYwVx+NRo z*t0?5C|jGLAQ;!~7Fn~+1}oFTqqI;T!WOixJxkrO_xBbRp4F#^cS8n*{WS6>XR>U3 z5CP(L(YvD7G@*z@YITlRqMKu`S|Ew0N0CC9Ub|`hqz+2$A@X_faj8G_at;^fnca!) z-dgR9LlhK@mKyqeg$%YSBk3&3vbujAyLBn`?q~jPe0A|bVISjl1m+iBCV#Q{Dce7= z0MQFg;nJS2=6W**t`RKX0W_zUm%3xcar8yYD5Bf0o0rt<#@CXsa?9?RAK`Tb3F_b) zIG@#fb^WTpC;9Y28p`7__z5Dd;-;G{Pxh0wDwcc8V})nsm5Mrw zuPv!^_T6D9Oy#~KL-d+S5`d4CY|-e%-qy;VF@pj2+2(Xv zL=sLz5|n}()=oZ#LGx6E)@)MfQvKkAF~egy%&tBEh{Q|o0!AxM8EY9>b$^1tmQN39 zU0RqEG;=sKlvA8d;t8AMf~Rzqexp#ikcRwhb3Z>vimJ4$ffx2e9m~WD(k`W%{-?U8MAfgajI)`mS6T}X=%MFJ_3&E@G71dNgjWaT@pc3RQn%Ew|tV3+!3CA zLo4_Ag`u|>M-rhhyLTJ~Uha#jo9h$&%dgs$S=U26oxavE2wvEK=jkl;nT?D`x-Zjy zRX|G%o;{|Tm-#*CZCT)V)yHkFoQYtKB6?3?Oh0i?x9SI9aBImMPrp@13??X6zRB^E zqWErb+ftcNM5iXt<7s;Bg$`g}X`j|3vY}>0l#7%u&5P`{SC&SNEsmwr_0nHX%G^pD zCyjHqoDEu~b0#(%_jL=!*|N!w%2XhK>;Cq|iW|B|M%VOoxO9d3`8_spF|zbq@j$7k zdtBe~kNa)Pz>+{P`sDVG)lGjqSL-NpXE8Z$dwUz!T^He>&m-=D>tVpV8k~A7z|x|x z^nzsad=qR8H=;hM-e4}gDHD6>XB5PdWJk9Vr8uGoMDzStNLazSF2N1+%c5qcLLc>5 zoJSp>z*P@;f;=Go=2ycH-V$$P>TT3lQ>6{1O`vaEy`}!sI8p0N zS$9DJ3^oG>bHck0$=^DskgxyZWX8h#{IpGk)xgbZ&Me=XO^s&GBnYW%^R~zR~p*Di_R~l+K2IoH)=kZ&4c&TH`PW`i}@|5#|mwpFrXHIspC%6 z+`9?8!SjgQwVuG7Q)njdPythXFwzj_-0=(Lw;}?}n}5+Oy6|(_FL*u`k0ec>ML9p_ zV4)n8T@c+Z-kpBB9PPh8CX?ug;lTa13fKe1zHv^<^eqyhsI17Cxx;SpLIHt=tFDBv zJJ)brR0g?tMF)LLH*3j{qD9?v=V)v)YD75pbT4#%4a!6(iD2jN)r&8CkuN_boVjG~ z75El0OHhuiM@^8ynO!lJe4bnr2_RAiDVX>W86X%?v@EhS*3rlutt(uRO#J1uP-Z=i z?2%lG@~zLh^gFKG7wEep9M%heq(8He+T~7t?R`O?{v~)?+7C81mbw|ulB~3$<|}9s zPf1s=N+5%u0LTM)zm$#cYpA{IOH0JM%6(K|>e&h`8Q|UD{YO;IYrIiWqZG4d8WS>e zS6X6usyR)IKyWGyeO_PJ4DjHsX?!^(&hUv$&F{kLd7`OmI@iLp7pwl&wMOvK_3R|g z4rPs^u-GvRLJ$0d=&-}dMD%mTSb>CS8uDMRaakQjaFX+k!^Z>lu^sO|nZmfvUVFA} zWG(CB9S>zb9)9vy(Pp$t?LY3U42?DRtMc=|w^AA)*^Ig-lWJomY4x5j4jrGQAzYOhGqF-3gDEz$z0&$BE>D3pH%=<` z@!}=6>ucX4kf1jTh0X}lKF0Nx(auEPXU32_t&f1)Mayi$>0Y3_vRbQsXW|i!lhsuW ziiozjER&mxl2ba&)VEKaS6M%`t`~7M6`ncYBESAtoL@CHRIOS(8_S=ki~^j!&^&(O zF9xUCG2I#~tT$dCTX3lh7)|X!^y)iK85_5zjP&IF@gWv5)-meK{S3)7?O2M468YvA zPpWtX9W^sq18PY1h;W2Ld}$RC*Q@IcfNZ#3G>e+n38+bjjOI($ix;%Vn`g0t$4GE} z@zIM{3Z&(gxLvGF#+&B{7!x!%2-M&4Sx;#t~u7T7uuW&*2Aq6HEi7kyXodtPY z_jBz8W~gx%yDi38kuNs4wk{46NccH zqnH1P{?;F5(Cla3#*5|J5qO+If+q8}I=To9?Stk#bXS8CZzIcvKn26wznjqsIKI{c zLQKYCI&Bich`x!!{GhoyhU2D{H?O8&wQu%x8Q9u>@>jUJ<_K-If`kT$MtY%BM9bH7iDcFfX ztxoRY`W;U6e}6Q#QlH;Lb!Oee?Yi};6oKC6n7rn!G8A^U=9(xkrt@0lCt0UAMfw$X z^}iENn^@$6yBw;uo7_Jao$o9@#Wr;KIL)gtHboTkR^^SaTvYsRwf5u|H>~gbsWv!l z9`ODE{uKmVG@+cc^|StQ=cYA3N|v(;^E44?zEPG8b)VC&lfNBSZr$UB(mzWUJ0vA38MSY{>2g&Lo7YbyYb4d$`Z+MYq7_;pq z-H*K*d(Uys=&1=?*RKAmPf6Y~Pl-pEz-ZPXLwtr@-$lLZy>LPu5ZX$whd8(1xfcu z-?%=P-wO}uU@8O=EIX({ln0V->KguJz?#Ya5#wW-_W4_eKFb6&KXlijNrCwMH>Uk! zFCW9ZLc8gry3tM{M<9BLE(p3KYRrA63737xKU@N;ING;?#Siwvu5%sp&>~EoKoGYg zFS)29g*g@2YQelkKKffMq3NysrD_1_FT%=!gG5X^vdW;RccAJ8gkKl|ib@AjaP zZ!u<2rewTwIA};AUfmeA?EG1jQLXa>RBjAp{(ExMFW>-z1XsCp4_GGcb!tDI8IVlW znjogEb&qNd&ALU{=N6xjRqxYm3JjSa@(xA#Xny?Ze6%z7>9_EkqZQy?k`!stebs?2(8j;==gRLazl z$i$H?FM*jp%dvL@#c;8`+60Y0`fd~gG{yt9B4|mBKe#gW7ECe)DzB?1l&@K6(QdZb zfAxYEsl(EWc!)F={uCj&{3X0V<>drU`r*DzZ&nHzs>%dIUg~DUcL(jYWi?N%+lK|ZVr-X%+CJFnze#+nbvQ zY;}XkNw^nGT{DAIM>Af^A0?*Um|!=+@^KCe+l}Rq8XK-y83{Rz^QZe;{*#>eri-9# zxhJ~QSs$OM%MqDxwE)LXAbE&J@2DR`3*TU)a6P-khFoLI(oIQdr7u8zs%d@68Xx-j zx~ts&J(^EAEiZFUUY;!7gKZewg+bYwy1M6Rylj(6Ij#|sQ14VuM=xa!oEZS6-k`@I zV`la0Upv;+CoXlO0z)KYO74hD<@+DT61)kj?ycZZ7xxI5&n?2nC+C^ayPb9PBvS35G>EjgST6~8h6#-CAA!E3k0yxA z=@`!7T5#dRg5&_7e)_8^3*`Z5$oonH9+PEo2?i8tJ z@?D}E*Dq%l7$q?1FA+4i)t~~1!?bHofnEF1?u7RW^LA93y zu>$71yYFfCMhkY9`vP|DqDyDKmnr9GYidBbhyTVi`lW`czHBQZPiJ(ik!8#*Q(aIc z{Qel4Gtl)hf~jcEQfD^x<2ZT6nnnr0psXd6{ntHK?x^*H>jhPPEwHr9n=;f?L^lQu zK2Nb+l48jA@#Lj#hw?Fygwh_#Ry%I=X{|6Ob%5!c4x9I~N$3PN4Mfu(Bd46s6|ZTaf6)_!zEj8zb5h?hUdk7``uX?T(wi0y$tr;jrJY~5_SK)PzQ7B&IX+4Pbf!2h;J88g)lLv2i$ z&%Kqagg$r{mttruBAxxel7EyI6FV;F7BPgZ`!Se3^O>)JE}+`Vte5Abm^!8`dq%4p z#Y5)m%X@@aGwd^4j%1$EVKYCcUKK3ri*7gtYt|xH*b$8Ev-T*G|!iVx5Yc7eeeDLN6-n-8ZQnBq>ROaX=_a$B# zy|1Tp`wC+m{_Il>7Nm=xb@~uYZg=6)j!>)CD6zy{SGsoi!x_1#NyKNxiA& zJ^%3t6Sm!(yoe%Yk>>caxq*fE@nalf1~n}QLxodLjrk@vjIp>XG;ivhTJLueT6?U9 z#$>wSw_m#)rlX35r2}5Yk#QTq?X1bis)%!m1GesYCeI(Tb6d1WZ}ZuMV;mXU32T`V z$CPwCw%0%{bPw;k^a0Qz%01{_Jd@YjKmP0!J>fKY1vzbKs6J>74PwOu$B3faK}Kqi zT)=}ijUNGLtAyq5Gq&6H4%AU2(TMD@u^$iAaqUa5NKTaql-`ntwj)3ai`~KgaJxix zVsl1Vf=7f5|4?rikpcLe=?nZfO(pum1iQHpp5QPOu;ERySE?qj$0wNIolj zVKgg=*3UjIlSrFkBS&h5LNbBIXk=gWpjoGK?R~qc)vwE6x!G-O+5;MYD2aE#kIOdz ze#e{iI5yJ865V6RrMRm;>P=$|gg*@MxbtUgRaTLyzi#TbxBNdM?Yek3vBjX^@I72f zg?ZkL3f|v~U@)8Z3vatdBl@|{oB9wF^aEkl7bzA{gVx`2>7r+XEl>e7|9D1)-jJ0G z0`pXIk4W2d&HunNQ_iZpx9IFfEcG5J&~(mM8QI-={QKa8!xna$6n%vZp-~;eIveZP zo2ybJ7;=;V%s)N(M44qU6+Hk!Hh&*2xA7A)a@+r7X%HJ71zFne}U!KR7(uG}T^ZcY`i= z>Bh&EtOPEPXA%OhUa*OM(=M`K3+#rp;fh5-_NzvT|A?S(Ssd5V79S_| z8ouqwLk+e(s41GJNn9Hf#ix6a;O3It;Q&^v_?H&~M+tuqze0I z-;e8*=eQGA+>vL6r+~J^%d1iAt@u|yh9%S}plmu6-g+$LNm6kTopf4{W>09*GhY_; zT;3q>mFX8*n@TKlEisZtcQ|>0xIkPdtmD@Z%_ht~>(QQktTpJ?h{Ee9er8p3YGViR zs(!()Z!qZ(go2TpJxC_&kmT6*iV?iaQMtcHP)g|$s8e!kk0Sxe(aqb^7W+DEaRq*7 z%xV$wAL!HQiC1xi@*7j4j&Qi&eEuK)M#_`43Z2C`=l3@>5n+Suwgqe?PB_A-_546s zo^=POs^A9#iS>>-SF#|sZ$cUtu)cZeU1$-dt>kc3tE!0S{;;rO&V1yjY4NF~?kJ~R zfhN{b@I9|AeVfArX6kq(jw^|TdJ1JI)K!2Amws#YwJh`bS^a*r%)i+)mF<~6^ zi$!QHM->LO^4L-+2d@9HzHMFLc*v~K9j1#sUGUq#)YavbPce07fu zG8f<1Ge|5=iqyZWyU|g>66Nxis6=IMqHf$~Q$$+bqTy$5EMnmAo*9x*`#YCV!<9ps zB4g@qyT_%QOCKAa2t^j5#E~-U1c-yu)2aRpZfQEsW_qQPK`D02kFdguvHq$6F#`%r z)MM}^8DHJ83}xh2v(c|4VWxV@F?I@Xo!v;qS=_`)YaRK%Gf2y*9go)ATXD~|j@InH zV2eB+t=rQ0!1$8IGh-B=mjs@~Z6n`XBWgSh9Hwgn>Ykdq4nz5XQDf77k)Gmgu%2sw zUH8T27m)rRKY@*`uf)N)B{QxPmiV>3QjaOUe(nUDkvd;;0(6BM3m!X$I~|neo*D$W zpjKOk9>$S;Izh4kLl2O_a;ejXqBl&GIa%>14uH28;U`k`8W<7nk0JgqFQC+RN6X4X z>%)sn%OxUWtn1+=fzGGj08hwdv^c*Hz63AdigezwM5z}u;Jb?=mnBon<7#C0&+6+bHe(fs{tqes~$#L74M zhyEa^F>5nGyr`A8BHuHIs&Gn>u@qO%URb#G2X|8wXB}URzE>gv^cD5Z z3!n_$AzZV1{mC;oHh9#pS>(V%j`EOIi;1_o{)bL(3gGVf~Z;kL0+MrKx9bWF-og9+22f6XL@-mn~| zdogGEt$9+cF@3Rp=OB9ICV+MF%bYjCRM))x94R(4i|q4Rk5xQD0)F7iH9w|#9c3qp zqg;EoVSbkZBJ948V~qDdI!N8$m`OZ3JYl}qTZg81DevE+i_RJLcg0tHoPQ5C({&z$ zgMviD+})VG0;K?`%X^piv^3@E`1^}#cvN+<&MT6h#cp;gXR2#DTTd32({Hj+(YOSW zk?qWz8fBH=rBtd4WPqVY9TxJ*y77K%rXZcG4k!2jzyi)=mfC$F-Il zB~hdS&k>^@g`Th{oGHRvmD3x$Uzp8{tNSFpBuF^3*QXUab(bA_AC=0IT=aYd?Q^KHxwHrWBMN*F^!eT*=xsK^PoTq=K~RZ3qItR`)=dd7 z2L+8IwUF4;nz^#w5kG#8v#L$&JF?92i4ptIgY{%Pokt?^Nsl-=5cPYcLaXPsA24gW{6##o##^Xq*@XI%MCtb73S&|;b3rzLC!#Uo_@Lr_thMKcx@kz6}>OJ zZq4=uG48mQ;aoC1`S*Fa*^gWFpkvr*mBrBO^)0{Dt8_ji9%=b?U{2iBF-L#4?6FGd zVvylWr($`n8=8Sx8*fI3?zKMMni#dYs6W)J*Y@RR?lG`mg=fsm|AV@>{%ZP<|Nc=F z6cj|IV=ASjfOJemy1PqCx;rKyAUOd6$CE+vTdbkIqLDr8u!u~)XvI4sZ0lzT&57#9pKT-d@ zEc{BCIR^Q2A82ptJaDMa(0j>6%vXq}_9(lpSSl^r@Cq{7XWwu@93i;y_NaY#chk-e zbzU`L8dY7vc6(yLHGL<9;gS?Qi&gWJ4^fb2aOmhZd1`5A=8!~DT(fV5LM&T~v1(br z%f>`W^tH8AZ{0>vYVM{$W#6z)7{e63C<()F0_%76 z8HB3ka=aYN_6IC#<%W$Hw8H7g`uL;QnG^PeSnoPMdcSJl#?zVcFF~odB>aarZqmw$ zmEFw{jofNOWlt@5nt(x#?tgNl*kZe!lKx-g0J-9Uhbpr+6hUFmV5Rf{d*J5MMvqq4AC^dsp*) zq?#ES|BjNysL9tMTpjV|Iqv#etQU1JUmKh7B2cYWxXSHPDu)*2B?Krc7%*SUZM?`c zU+z0a{<2&{eZyH*`reay@=sD$ul-4Aub*kBDZT!6g!aio(1*Ao%8(vI2(ylpK%Yu4 zp|j8<&-O!O!JgxoAnNOSvAHBz@YX0s)>SAuP{YyBesSjkgI?^Iwycsx;m60m%&(L5 zi~S|CeiN^4oJGQU3xPmgX84ZAMz#FaUCTLd~dbBpP^JA3l4raLE$DV+jRY!~ZV zL}DzO^`|8G_8l!&zn`<0OLYnwaHZTQqx?MYdal^FYEqdWCQ+N8Zk&(UBa2HftB>zZ zaFDLi>5(5Ks)ge_gV1=B1V4;)U$y-E?KfNW9!1)@Ygt*?Uxl6Nidl}X4B-0GzjHuz z+C>q#NqjBPUu`l#QvmFeC{2+EVv5l=6eVBw8dc54u>ZaP1dyD^LFg8B{k6*Uel&VQ_-BHSL5xTg0%Tnac zJow$K+E*vKe(=Yb3^{#uOug}t%zA$XLzKyMKoeqAc+=kKysm}!CP?H2fE!U(p5YKi zcx+P2Yzt1s4KTGq4maBLH;R9px!`|%94kibxmI_9yq1DTrox5~r!u!%U;kDirr=q1 zm@MXy6&8Cay5YO{`o0WTks6vMTNEI5z3z=x?5vu-j#gGI*Py+spYVLY`SeoM`);~X zAOIcnyeXvaSPPDfrMc+3{WSOdvS8Jh!$Z-S!g>P!lu?lV$s5tv^X-dQDz1CD3!XEb zkvTs}w{cN_aGP@Y*u2EH;b6i?M{-Ts{ww%v<7A5FeY+OXqf)}8-(BxEoEhVIhJihR z8u)*BF=9aenv;FCJ-&HK$M>paMj-2;DhWX21 ziQ`HQqsEs_&?Hdj)pA*ty6Fl|7%M~>6*TO^^y`JiS@QEGDNH@M!u>2GMhb8!U)?p1 zo41|BYyaau%!IaDv`Fi^9H5;7B{i(wM^L?eTQ zAKd|y-!WKw1)g(gU?lXA}89otp2 z8+<(6hj{rRO@IeM7b4TsChkYGF6NECT<>X+C^BmhvF%vbg15rI9|=b59j=^OL_ZF4 zk9pY@=icorjuYW)CEzY&IcTUzLs{?Qm^{D_j^e)T@kbW_!eKA^T@_l zy&v{0H)Wb_=?aS=wUyYeHVPUY^e#4LK1wgQ7op!uVoC9IEW3^}97K?;V!ATd=cym- zKKRz&`{ts;qBlq)qBpkiK0+~&QF+{f^L)m!piz+XC-3jgT5hI~gy2Eu-z|ERs_aVU@O(h77Sj^Rbt_N4jB?s$wp4td<1iRqBO`@byOf!Js8flDdE52UX(9@TV_m~J-dYF_Iy8vmx0?okPT^PsS&2+?fCP9W}nW zL+M@-*EwI1^@icsD*HG=gzbwbAt~bQb0EiZsY3uD;LC$Go@d|1U(3|pv$u0PO)qK1 z$C0bpTYcx!@}6jna=1VeE)oYCP>isTZJ><|1j=oSsmJ+ildL#KUO%J59aVwESaOWy zb$#GVA6dx+A-(lGnUfn=QWsUili@(c719~^)z&aiV*lmXR`T;yuEF;-;+e=frUjLU zhf2Y_`YK+tk1P5xxa8om2s-7L$MOO2slLB2P)o|t3C8=_P0P^>@|TDC{o zW=){d>xwdnX7r^b{q`XLNcM80>7Uatdf$Heod86tzjB&oAzb=rV63s#rjqjD*o6cy@zJIn^R$!|LTlmw76-xRK-!H>t*r!6}sgGb(&=M$|pdPETj z)M=?o^(B2g2*rACo1P@TXyTV;jrob6vemM`PqtZkAIw(sT0A4SK1fF*8FAg5AMj-i z8Q${ICkWZQMEA#ml2Q#e?+BWYlMIbVg^-@Yl5h(Epc!-v;qE0?{5lXiy!Id7PruOM z%aDM<*tat$3Gq{WZSFA)BqV$sIETPAKQn}QU*E6ykP~(dT3wD7W6U%1O_tz9h-lR& z2J}7q>69vKP4wgn`42`(u1IQQ0BK~t;zK)qT0O}1v0eW+tog^&{-9NQ?DqR0@Sn}k zo<_7|fTWmVa?ew)JPuxR-3{=W1*8Lxm9SqvNeUWW;;bX|5D^oY;}Ad54(JD=w_%3& zxS}r-@G7n(E7q&Wg#F3<{jVOw3t0N6#m_j^DVn5qxE^k7cX{k8t~HxLV_WvcoVEYKb@(A)PXCUBh?AOKd%Ml)hErRt*+YeTgQhOPo#FyO(rd3724>4= z8@FjUimPRSIhy25LQGWz$<(>{c8m@_c|K=y8=Y>EzUU10SB6n;u0KO2^yvm3P5t_F z<4?c`*NGbLVb$YDMXbB8Xf^`q`IL$3h53lbdUFa=}hP4v=qDA+?2oVx+8>gg8gK;@-4`xubtKpX_Q!@N;#P4 zZWi~3p;vd)tsxaH{*4-b^!xYrjrbAo^s~{$2x%$LuM(5vZ}3mbu~xlz3KBOo(mI|aHkQiJEG)MtLoT( zu`7pfWd=owPdHKJp->fPE+xe)U05sJB|z!2<+Y@9!#w~^*I<&Gl{4piZubKxl*UILrp)2X%D$6$jw+;Ee>cA|SC zTT8NWYxlgIlVt+?a@bbM6uobM`c|9@x27@GCHvh0tdaCIuzVK0x=7fUa&Q`3CAi2T z1XS3$;C=@ASJU|AA2qEkP(z#@0V0|2xI9&U*RdCLWerd@C|I{I<~)zz2vMW|arx#F z_F;`~tIW?eH;2-FP;5(^*3jjkjBpTaiY`=sW3@@(8u$7k@R_D%8W5onCI6X#5B2Gq zWAWb%e$1=1<9SWU+Gy@+V2&Kw!5eS9Q;|E1eRbSoE_|JmZPwv5J0s408Pbcss7OP~ zkSu(#M$*}wlGod;u5#ez;s z`B~N-R%h5Ot@4#fW~P~#Y=U0k;sVCiSO?K;OxW9!$y$@Dj|61XN5HMWbVvw~xT*L} z&1~x2Ucy=jPaA{-Jf>B>?;V1uA+7}M!jR^p2}9{1=f;StQcZg>mpaD_P8>C&S^6@Aff#ryCj#-^%OdD7>+_Ja5!*zg z$1-nL;zxMEz2a;sa|A)(J_@b4BmK$){Sm(OxGyeC;*^gu%EVRVtu)~zF!+Su+r>P9 zVcI5{fqN|OjIS~%pk(#K-m;Z@B2Hv-sj6bwnhU3`Tm!!;s!w{FFZ~lapHYTx9lsTU>pm`At>S59$e8;6*MBN@Rz1Fva36e9p#x_Ymt!8dG`jZ# zNh&^re0+pkPk`fm5Bzi^e782j#YrP;ghe-4&njJ6533xwJ3kD@7FYXUEf9oVOzm4mfYBA z&uy_pt(P)h)S?lR5Y)XSlBLrVny;sdR3p6+fg|%3s$aXJ^{|*W1)KYR9uTOtpTb zP8op9Fy9MSs?v0sB7t8;_C+IxHc2d}ysrQ}>%f5qPC?1~zn>`t7;H7`9)332M#bH? zZ8aXUw)gvfa+hf@kXG}ed+b6u6qFZro=Mm_En?5!OOs0875r=48-_{{@AlQ^p^x7k z&-rj6q)HGVns)p3Z1sDmW3u=NkwWU*f1Npx7(O4t_ZetTs`RLAh`xDP540%akCN#g zObao_GD=HJhRuoClz;DLaWxT_Ws5tw+|>x<&w;-B`G|zDKwsXTSD39sUhgz>Pv%GB z^6O(>oR?%Sb4%+qWklbW4;8O;$Fy|KuPYSV?`}B=5blXSBtE+vh_7s z^fATxr%g0iB#y}X^)@)=Aqu=cr$-hJjP6rd8q+#fLC+GYRs1&YRe`@?iXci`gXB{B zGD=c+*ZzgqRfno;9I}j~50K@)&xbN)-uK>sO20443O zZ!a6lTD$f>`kJ{AesdGPEas}{>dSsTu;Jpj9ufp8_x*EnR>1zr>Vv5!@2zu_I}#Uq z6__t7x$j?FEMq`y6ODgPC42mEh(>oE({{FSx4%|=TD*#{@Ot9)lr7W#h(wbYl-Y41 zD@i-O#lHDn{ZCs}deN)yK>0hSSy|^5Acft#&rAthLY=p4P~b?5Zor|qY@u?X;vLKW zLuXv6-NYB{C2ifNFrK-d8Dyk|G&bjh<zg9Tm7t+aRD2B5?tZvKa7tAViqVLgO|Cq{n>dEW~Uuw^PydxEXA?8PaLlAK)9I|b?F{Zndx%^{(8ZS@ zR-QRpJ&05y$EUM6!|ZRM|Jv0DTB#IP`UB6-fS~>}B?-^)?ZSE+K$LhBDiO!__>vUZ zSulZ%RFc5%Bs+cL_6QWmmr{n@df~htS(T}&FGaizEJ+oPGmFHF5+ABldQku2`FIuy zegheFj~;brPDs7&(zrTz>Z#qjF~oZ)qEjJYvvw0swu0u3kS(EpL(i8bd^=4V#nqH9 zm#tR5MbUrsQ7dY>-!Ve$8*W5S=F4k1G(()v&9d5Y(m0RxJ( zA!{zT@SxuKp2Q^TeHplrtfXu#*sezz7xh+AeEWf*^F;D=&6tcSa_?ze{6%sUg=<6vU!-6&aJ7xg zC(m1J|HIo|UjGjd?`S^}1>E=m#1P_mKJqV7r)PA_cV7|;4sINdn{R>43oAX=K*K`l zslmwI^0|m}_(ZS$T5p;y1yxu~TR-DtwSYdb<^k!ZNzpyL2m{%@Yy~dfpJJ9(d|?E+ zt)jh_HLg?5H5(JBh#Nq$3oLS`f_zZNQ1&@>{(NJis_9pM%K2F)XbszTOCvV4=t+r;FM%)0*aj(=~9EJN?4L4SW+%TN|&jaJ0 z&Sfj>67G>(O?)Z{yHN4+>)~~g(>|c;cMsOz{)y*^pa!Vlpq?7gaAN`#dqCb-?lG8- z=4T}GviOGcUzA%#LGkDX{k3HFNZxugw$;4Hp6pP8^9xyd`-b)44jZxQu(IjV1-!0B z`B_HVlJYnR=hm{=VT?ztk7;kSCrwaBZR2N2%26{wPjh6ytkg|Henz^pyOeVCl#E1w zk<^Pr=J}U|n8)^o6Jq@3dkM~UlVu$U?O%ebN;Cz9GU)ZpqTNtq?YMkLyab)FT$6Iv zK`<0X)Rf=y$lY!vRPsc*@SA;i!e;JW)W|c_tF|`GnMtU#K;r5hWkWqhEk)(CrU^Eg z((AMn*h}n~h)OWNRKYwKG>Cv;y6b)5eCw$0Pn<%ZpniQ2DXQP%|5NktVajGW_myVR zns3?njq5V^t+E@7>-%0$4!&fV)E+5K5UPc4Oeq-)7~epX51epWJF`s!oY&0HyM4A= z@3b*8)A`QTd+6`~K+i-R8?x~yT>JSq{Hv$q1NZk_X1NH7Y9jcKF2tXhuQEj7qM%9$1U3+SVA5ql#ihs2SinxYsPbI>h@mDYOzoxR zSmRPI=dR4L0fAxz)DEr4nRQLDo8y^EISCzM>)8`KeydcJ`*1nsQ+`Dnori5EtV{e8 zcGQ%NX}ZRCEo7>!{K(T$Ww+A)TZ;y4WYK#A@Y_vU(+5MiN)ZPjnU`OqodF|D?c^Rd z`sD|byH7wbJ}oog=16YsVl`br78>BICcksKAVoBa6Xk4pnlc=W>j+YMqv!!c+> z*(C*y#mrq>rwEudnz)Om>KF5rlSS?Br4JKNq4-C3i%$C&sG7DH&rv)HuKhO=erKY} zCd;Y`Jd6~{Qoq(>75lcwwA}2+JxB>KYLgW6n&Uw)uRGP@u|Fd}PB2TmkgA`amz8K0 zJ!fYBD1Q#L3ScicoX7CP>wGD{>4&(1W_L|fvpC?<+URZYLEIGOtxV3l58__2D_DEw zhWnNa)2G)e`yB?`KRp8pyVPY~vWsr;Y$Jx7*dJWe+{E3jv((!_?F=p!2Hi{S1SV#s zD8GJ7Lilcv$|vi<_nY9OaC6WVV=n7_vDl7MP;#11PHRuoL{5c%@a*T zix!MzZJY_`&4b?=xxV7}oMXxJ|EQOTIxlnz5rzA>A2w1|qbp^0O5`t4}zYopBz& zl?_~IsQVt0Vq8{|pM(`#2_Dhj*LJTF5NrAm?-w5sRyXPv!;zq4hxH1wS;yg{G)XbM zO;G{ei>Ds>qm0;5v|9X4gz}HU!!02G`LF>xB@(#$4sG39)^sSQn^JAe5lbWE#rHD1 zW&tI6F)Nx)l-7ee>EUaEGO9wihpbO})0BIXOC|b7shdcr5sC*op35FY(^~5Jq7LCJ7p% zxo^OP&v#tmgEgPxHZ-pXJ9vI!`0|Ph@=b4_z=qwP`pd7`U8USW#8-zXCEgX~ihH*i zG<^4RH|DvSaWoxhRDEJMZZ}tjoAM2J`%E>@l5v==5S@df*rfC2V8@|wDdW zO_cFhCL@?ORy$*=f?eViz@t6 zXy$%ZU1_-<$}#e!c!y8HnkX+r@T?@wq~uex(LgUz-{7sQj&Nt?d0QEKdxPhHczz|M zNsDAUMESnVm3EJLKO&hj5)I}Y{L`~~$sraDyA-wO7sO1xONC0)Y@HXhkgEAC-=2rl zLFv|3=2`l2^7)fYg1YU5i>lkktl=K3JekO+bYHj069X#iYji)ADQEA%%8h;Ho*<+` zv11iS_R8GtC*f&oXX{5Ks-xP^DZXR)R%KhvBlYM*>H`^;woO{@lr{^}q<)i{n>ZY+ zH#SN$lz)O2Se1&rL16_Z-~P&pn^Nt6g0*f=Y{#*09G_-huB(GSyl}P{eJCDSqKbo* zYes8Q`5o2A=a`J=^VeSsAfP_;+Iltq4!dIlWciQS>F(F}&tarw#={LB=TUq9fBnR2 z|6JL8yFB$tSUxB&?3BlHuiBXIuqCHEKaZW8-T58qRZF7=^kxv!E)=n1OuGOEe}(DJUvM)qgu&@@tb|x?Wg6|{`-5y}o+4UV=y}E2noUd@=5gMz%PHp+CVI1-*28%k{fYw*d;bd#N&HgI^E# z0?MDA;q^%W12X9`m7X<%Xy^mS}=raE&7*M18bDLUhc!IG=-6tU~p zCKv+f-`9)Qn#L)4L)ZT>-0-JtJML=)W}kvGDR`4a)2y8`Hoyu6u5X;(kt$QKj680& zH00~niwZQpgt3c;%kS8V4I_h}K^nJznjt1Ls3A2}6O%jUC`Jtu{a zDUl|G<&+DnN+|PAx&aE5n8dcA>;TgO;rtudoAFKIP1tBD2rj{x>Is4Qt6eF>-Le_oKYWpWdF1cJ_M zJ_8(7Q+aCxP}q$XWrX^dbl1&P#c2OMHN?A{`d+<1Z1l^6URk@$>O*plDX6EWJTd#O zzC>q_SJVP?8we5^N6>;Q9$T<{+cH6@;#MHaof!xyD}2^Z%LZNWOk9yS`vz*SP{K&f zI3V(7t*%g3w7$}M)8+NmfjhXPfu7}XwO#hc4M6XUA9{QZQrI$MEHYWx#$e&)_V1w7 z_za;Ef04MDMB@9>OI(ra4~#K6Kyj)x?!$EoxIH_xW|NF2_gPeNC*?=3;%E-UM9erJeJ&BH$U9ARr5Ao zXsdpoxbNtj{M&eAJsUPj47&!keQek5laZ}1H|@V0Wp(-Ir5^;#t=^}9pzQi{EV=|O zt7&oOhkOXwgbAcs?+?u=?wM=kB|z_yOpzrT}jtaX_#EB~GcG;S7rc3|oi z=#NIt!`(!p`6z@pAUN;c#3Wa6{|JE}wEfni80WtM`o0&Y){sS=ug5LW+-8Uw$cAa? z@;bY@hyE6srl0oRg$zOzPz_cNXA><)Aa#A+=L@ecod3hqt+ih$Vu=%`x{?b#VP`3Q@fjBL_EuN?lH%e{?|T*1Cc ziBP+jUq94iJ2B1Tiyltn-H}D`(L0ef^-&5QLJe;nclgViB3Yd)5SVWzVH4);oo*H? zZr6Y1^E>%sM7*^6+O>ppAz??Cv!3PA{KmP{{`CchJq9O!4emp(DmuCfWO_ed;Q0Da zq#-Ml1Z1!_^l_}$yg>Ts@-&bX#5%;BwEp&2^!V*fQG*ER)%R0_{&ym)f07uNZ&7J` zYJZ)mJdSX`)k^AD8f3u%H{>1*VXXdO?-1m+46zg2^zOFKT-OtDD+?vZF&mC3N981#m?=QVD z4py?<9V^hmcpP{VcpJn*{#sp+?u#Jq9|$h4DJ>s|8iC3%Y?fNeFj5Q- zTmDB;ys*Cnm?hs%aXX?$;*?KXybyi8)a@%Pceow4R^?=8 zIvbU!RhOjRw@SnME!)zQX*(;aagF} zJWX{8S7$;tt{`g1(afr(p>=h8w6(NZ`$FPjZp++63lWC0sSf3t?kK=%p;CRaeOcCE zl38lhPu^5~K$;}#;H^vanG5*yL`1jOIq#hp3*F^~EJPUoWZa7drZ;Fcig z1^=KS$xi;pM61Qq36H6H-eO!2A}`VV+#mnn8_eul@g(sJS~cXjNqLR9UT0cdg_D=v z$J3va?{T94!1!W7dDt#ZY*%O>UF?VU$$&~W9yc#p@R-S+=Lun_4)*PdbZl+CM7dSP z{*|94Vp@<)%-NYXJ9f=1--!*A@vm=1SKavpqJmBd37|F)^yUyz3AKVP))^La7Gzqq zK8f5`{*~9y$hGi{fj!6E`lz)6vSnA?cVicIOQ?A*cyjf16eGX()KghjYXaw^m+<&E z&L7R5YF3ve&*)>F^~q=6R@!WUKyud%Iev^h-I}*k)R*pmHn@unXgJu#yNVZJ$@0|ueQPyge-izvwGoWOShNrZt*J|^0ysV7 zzxM_3v5kUf#p;7td}6hJPDb7Rng9+|^K-wj^P8~7V%PTXQ|Z=EcTMG3I~NJNM*mD> zxW&GLZ=Tq)QBN%V+&&|~E%E~nZlKo&1IDIba8dBjXer4C**IPV#X2@kb`tC&k()>Q z*Q|)2`2FDRp0iBB2XXS$jXS8{c_H?bZY@%hqyV|8yeKbcnI1-sfuj$W+4gZ4t9MX1gz&(q+^le5v zI3+LfpnFpvH!ovqDkm5nM7i_iFr-(~HgP?wq>9N2S4+{i7-jZvj1l<-jZXdE60s*b z1t*4=%(kBvDJam$E`H-Q$gec=qy*KqINoIr1=5oW)vHKxQ6MQU#866%nY%HZ3f6^@TKfKxh@Gj%f zf^ExGyF7a-e1RdUGBb? zt!T2$iV6jHG~>&i9F@Pl}95*(U9cp2iZt;C{@lnnfAPFw;wJfQv6p?BVq^PrrR;dcDd8$#QOVrm%iWa8FR2&}O{Q<@It}^@`*u>1jL3R7{^>g9%F+Eb zTi#vH5A2tw()MKQ?e0nm+&1Y_&%!{Q>>C6TX)Eg~EE|iz^B>+k;B}2c$Y6Wubl=nT-5)) z_56XUId)vvFbE&>m9^-SWB+CaWN>}_^~R%I+&|i<7c0cRc5MtS)dDTulU)SS*{i<5 zjEyq>U?0PhbX?(3f9ok!OYamPlJ%yHu#a{|eRk@I#kQM^N4=XknP zQ(nLOis%w5ZgatKfy*iSIl>zOXqfyUSM3-L%ouV|*HP3T>R7RA_ zk{hU8oSdmaVMl-QL~qPUF3`A`)tTrk#1l{5I8|D-UV9gDgOiS2>v*PuzJIe43Lus~ zUA*56%UvV;Bn0sFeI2dA94NEbJF=X#NVOeaI2GO3vGDP5x)gd<@qt~GVN=*$nrHaz zOCWUmK-M8mb>&^cGF-BQl|dP4IEr6d<_0Vt>sm+Nqml%PBr?`S+pe zhp6&P^D0aLGAEDNe|!O+y(8eKoSk+a9i6~ym68Jd;zzV9!GSTG5M#95*&eDl`zjD0 z-;8X{y_*D5ORyN=-gsi_Ob=GSJkJ%KG}aU@DF6dC0^67mEqa8(s!*P{lrN4VC zKNr7MMnV*7+5LE0n??exR17u1pC4upKm4O>^I=1P(Si~FmTH?$vxK(3=}+5c`VU~a zQvJ7zVcQ;UraXoMTX3oXAFD4D7kN9yinl2C#=n8N1R>q zl`OWmh;`|2nWbZI&JJ56Pnu+7QIQ$jq+;DPSovv@ytD||ZOA^19A^x=fRcacfJdHP zm^RI_U2f$Mf8m?a`f*iSIrz?OSS9GJs`sRH^J4;+EVD{A=yorvme5>f z!4(D9eLJ)kOIq_=5|GKLq+ho?4lRA9`5v?P$3d1&`tPuQbP+wSJ4;6dPO0R1tZhNf zyCD9f^k0T|x5lq?yt6pF10jH^-GHoEYS04&J&>&x-wy;li$eZ9d}9NFsVrw2hc!Rg zpN!gyN3z(>!%Y#t@r3c0s^0yES>TTS&CVZ@P$cZU!uD%)x>}$214vuObW&4+3t#Ym zczb13g;cnCav;9J3zepg?HDHjL}FQ0%E&Fa#@d4-k%8nOf!$xRZf?K6I&nT~BfD;) zbi_YF4jYlSFuuXD^5}Wvvd}#US?)GKL)+sAk@n$MkK0#Oj!~tjz9NfTS`PCZ9n8?p z@F6ePS)}1}s5)G=P_BA^L}hu^hx9vgJQDForM`#gMnHW^(_IHA$gNn){%#%XP*~^* zWe&)sWGZfJlPBk&J(rSpr)V1Ra9p^(wbbTg-PGXhnGzDaV^Cc+aT3ue`l78=_-c9Dctwte5o&C#d+bCt0M&+x9h%pPkR@Ugi$?Bf41X; zZ^su+!uy$GGHf=_Z_yLY)~X(c89yW<2*KM}e_gmrQk<|{+?vL+!eE1YXfN(Bz7W*9 zjv1BXIW`jk1xPzI(7mVPJ>iY=(1TPU5x+wEviTf`8P)}8zWruilJ$0_SXmx z#6pYZ7SPf7P2yW)B}Tl2;_rHfMY)L10mz{AtwhF@-qg#~A9Ptk@K?$i?%kiqy^-Y4 zz!}&-^~%DEoIt;D#ki))=d6B_8E0u6-?QZ=7)XNP#PW&Pn$-UTtAQRYMN?V|r^Rb! zVJ6mNYDw4@bUI;v+!oZzU!!Q<7Sd||g|%a~nOxU@*dBsS&#<6O>kU_hJcrQ1{cb^< zZB6pyP_U~qJ8B~PcG~;hhChKwpl{(PixX%ZfiJRvzvZ}@J#1i@YH?q^$-=hn5;_x~ zII2k%m-)TEh){IW{l%WI$R@V9tA}p9oO+J(gbEgfhFRcdJw5C{f{qmNk3LgXU__EO-x&74Z9;IJ`^Wh)TJVx;Zb{Rj>r0W);RwwAq>H19falxC1 zD}AvwE2NEaAx$GuaDx(f{`r}}W#W+^MLqhiH;bvd1wQFH=KA>J+%K~un%!gBl}ata z%7Us*dc_5|bg$wJ&Jt>v5|i@xE>E>Yzjig;JK%gnu=T#3sP4%_vzNT-s^az|I|YX& z&O_Lf?G*PNXD|TX(ugKHJySlZfEMotkv3JwEd@&KEj>z_;bOW$xj%LiA`L~-p&*9X z(d8Fq7-{p0_BHwJDGrAemGJL}tJ-%W_cOB(9bJHPk5HNFx?bupf&D)pH-MgC6wsu>hfaqc(R~RcyW{fZP6w-v!I>oLnELq1j|XiwOZ8D~d90K^ zjn4((vN_*d0Ri5tS2i`%qkYaylN5^SwDu8EtJu4qahV=o|DSCo0zfK^c_EJFbS$G9 z{?Q=!dcLE-cJ*o`u0Wu#Vj;;zHk-VAO!v?Z#CJDBqfzww-}umL`9hn0&NRyR<6(TI<*USrq!e1)^+Q5JW#D ze6jwczr}N$hkHt-u?TW*+jAn}aU+^V3+cR_uKAw;Bg%A3S(LaCg5*}G0C6Nxr z?Z~=%Ak-Gq&8Ej|;%k0GI2S*5GUA>15H#q}xCv@mB9q_4{1aC|Ke>-ME6U)JZ>nk) z=QCwh5YuIz_MMIoo%I>*os*u0Zgzf{^G8VOw%4|jdXh#!$hbM1gi95s(>%+9;ly{o zEFm%w+fz%51=0pZ$44Q$_{SQTFPqa582Zx6A+I61em|goQ{8zaJtwO`F4c$+gsYC zDo7(0y0a~*n$UN@AFOA* zG6*yY1j6<<{izw4r2_#c%WWb8p=jFG9_Z>+Ga z=%sLgrx}jIB(}&S32y{k>)x^> zE^qg;eSoz691@cNY#@#-1Kn5r#f=nyoi&V(aphDu__F9&%?2Y-j4*^jVpm$1$Wl3T zH~f!?XE8CIz-Y`PX)0>*`N=H#Vvlr!Nhby-mk8^Fe|>u&dQ;MuW(MHR>GhMlORN() zW|lVi_r+E0HKPH6*|SxU!^feh2=yDYsMCGe^X0i7(|$e~ks4D0Ako0{=@LCQ@@X(y z3{X0eHFP`Q38WBXrDX)aG?-f;iP3|d!*oxUyEp*`R>Y;YX{lm_QJWO%=i6zR(~+a5 zaYv$Ae8Ndr6KN-gJWX5p74e?y4zjrQ`|<1%3%m{u`dOAHo;Ni4X-AW2aOwM`2XF~L zZmq@0^zTCv&x*lzTuZk33T=Lh45}h0)^BcP$%90kMzHT){XIw{T7R1Bc&#cz#W008 z-7w%ry>c@If6P6B&|$4P;5nVl|6=Z~!uZWtxqFksC4`u?8#x#M`^kLR!F;DA5IHm++I$MyM~@AG`W-pmRe z6}7QbC&zX+Qa!xGqJOtEa{ByiTZSNYaVf7r_+h8qwFtrMyO>va*jg+|4=4O1~C-L?T4(Gg= zxA~5haoesz)37q}8Ixj}Bvb=`Z=j9XbEgbN^>pm^0Hx1HqjFBb3)g+gHlZIZHMkH? z>hO@TEVe<@`Ra)R1mj3q&g4wzd@z?5wIwzI&uqg4s>rx!(`pr`;Zg%quej=Lp3 z9wzoa58B!#KYx#R%vQ5)ltX1OG>hVqtrH>(&pX>vA{{>1G9o;_zK^)}7wEN}wWD7V zX|N0?cyFjJU6c1=k#j8EqWT~(woyak!T2tpAXVZt zJ}$sKCxFJmpC)wQX=sS{<-CYRj783A8pkc1*dkb@pXkHbtF|#jvwKZ+`_ajwuj?ZB z5O$2$9Cs$t{QM1S@j^@M%~ziE{TED2$#@#M;@pN{$o@oVtEkTm?p9{Vw@7s5kE=pG zV0X#0cuBTh+(c!zS!X&u(1K#!z|shyY5Hr1E&G~sm?v@NR59?sQ zt-N%0m%Z4*8T{DgolQSvXh|jZ_8jVgeNU)e84{0=dfvYx&q4<@5SxYnk-+aQkZ!r- zS&S2+8U%kut^c(7l}EhZMwRVvpmoVfaAY1bdvIuAn0Jd_x~~1g|$YAfh=tx~)g&w`KaK^8BaznXFt8o%Zl|BKPIc ziJ5{uV4qFlN0$8~*{Ovuv$&taNPViH9J+TDRHk3GQWMXlPsRUcNaACD5Fn^F7!}zT zJMAcj!(TS=)ngSqtOH$*Bu6(4n_HV3$UbKt~ILEgGH z=yWS2C^c`h3M}39D1fWs7hJGmg*XN=d{!L~q5Dl5P965rZ{o(2leJ7?=1&hyW+~-5 z7>(pnje$Tf?6(ZEHS;rb^~Ym(Wd6+C&AVdZhciDjg(It783<$=8KD zot%^{SoPn_Y^tv5d+r;D4VTpK9Ynl?2@!zMw{5(joN@8`aAow#5uKmqvlgJa1=9-Z zHl{K2DStD@6r^VV^2RRWx8<9{{4bTdxAe^4Q^pN8# z)f^}x;1n65yI{WtL2z1G9;k|#^iO^o<$5vEOCMno z!Fcgb5!Q9heCzTZA_LZnrNVnkCz*{e>YEdFIsRB3cf)!bDAz9TNv+h@q{#Yvtp1F7 zf4y|6(20?Y>-6VBPdBK_$5(A?5uu+L-g_tmquLPl2{!)N^Q@J%-b;@SqL8q2!776U zuIm8p*((h^*HZB;BBh8e7?vRz)JMJNRDAms6tJY|1|kc(3u0-k!!xTtH~7h9m92n2HQ^tajKEFI^QfdMt%@;D|l886Xg4t#`_R-*yrz; zffy_>HtfObw$wM35%q``ZE~8WeXG9K6-d?z#VOzNz9x|XlP3JhfsW2W$Z%k)#&iCP z)JH8Q#(6yvq%S(T*t$!!lgSa}4xc4{M3V5#ZSDRAl$CgRvpp)hEJ7=~%WpKofm)lV z-Qx#m#PrA2(MvrcT+vy!TS4C&BJX;^0ecnGl&58PR3c9a22)(=y1{iIGXvwn4RUzpSpP{zq=76rPGWu zRWZ_J!OT?h?)4BtQDzwOvv|_CXg2(Xenz9myLV31n&h32D}(6&BBz-v?ihIalt3Ua z1+!(d*?oEKPX?}S9N@vNIu1?dw!fq4EP7RD$qn*+yp_xGzFDol1$+()4@Wb7LZoAD z{Osdll8TDf2n*J=GXC!57cU zUy84>m@vR(CBmblO+IEkh1mqjgK5@~3_iJg9p;Z4$95;nXQjEZv(P0iygmn+vC<=D zIfG+yW|u5YvBlyTLaBMBx`vTn{vMBPxvYN8A&xru2>h4t5raFDH+IwA)8&wzHjV0g zo^j_(<?ZW>5^Bg7A-IkyS<2Y_Dgg zt^l^!0lp`qqBKS)F0P+$zQWNHtDsbTzP2KhR4Ms5snXv4Q|z75a+h1$dhnkjk~)Ka zWSnt3+6P3mpZ{2bSy7z19uTjX@Gel0ifY?xKwxs5h4x~UDx~+>dZX&j=rO>iTf?a@ zudsnTvW&^LH_Fkn0%0#dt$toDB=D5FtB1%1DJsNQ5r#E| zF@6QB#jhmC?IJ8LX&D;ET77=H8{JzRYp!%~<+)tU8VkIqDKEwC3chGy@K`QP;-RTd z>4;bs+-uA&`G_P>;GX8phB6OpYurR5lwDahTscQQLE=eSThN%L!t9kp*?~UC>GFKm zH-<036crt2G=yUIw&X|&&dAT+B;3rmvbSv>i3eP*H2FhWzA zbzG2CE~em~5YvkH-pQ4yfmL!HO>|IY3~Q&0G{IG;Q`j^*?Ra3rsLtBKv02jfqwB=X zhVlJBh9R@x{Qw&$Sap3l$xFlsuui|cE3rr!giQi6eIDewqA8=Nt(upbYKaNM_Rr9B zqi~5qMo04B>3OU)n=-bwW)c#$U%6)zHxhpnwua<{zL%?@`T1w8y7Zh>c3%+prIs6A z^diECG^8N_PKI2`k>Bzaxfb1<8!vO8U|V;%vKi<_=MD35#h7I+3VOjO#h& zSd@1@y+ES$KN19xkP_%x2_)zcu-(PsC1FzUK5Y76vhqSy4%1(bwJ*LS6m1+XvR7(5 zzS?73m+x8B_n447k;dg~_{ba++<{(Ij>V8%$It5aU%*`Q$rw+`i(@A@5%7TA*j=I2 z%Y~T2G8lVuhtK*E(GzCybhUezv_NWkZEsKaNzJsBEomNFKjrAV6s!A|Zf@OxR;WA# z9OB3<@IXUsYJj6!{dnh!PXYd69n~5E5d`0uxm^H}e3#i%x1`y2S1fs_b6wZw-OA`N zIPa)1wu&$7_0LxvRv9OnmeQnjmahPyYN2S;Nc4PVPIRG`o7YQOkm)Gp6fVuM%3oJ~ z&R>^JqP(2Bvr%}sG*|ovW!`i;GyQU<7+E=4kVkUlYL6PZ)j<(2HcFh~AIX>w_l3T; zUAi;{Y&diSkX6Q0e2SC5g>9%G@8L(j=sL}xJbo$44j5icN1c!|5LQZgc?XHO(JKm3 z-4Le}8qoev-|H7N3n_M~^{i)m+CAkm*bwhLC_W^sX`4UJmo#puV`0m@_kcl>22ONp zEfekvGYWq|1Qr^{o)-%zG{C>U-;a^UXvo>~i=Z;4+YXOwJ zZixt`6t4>Fe|JcU_s`9{+d?LU(wF ze(bwGf8j%F-?yPpf^Xe?poxh3fr5kAECvME)t11YrvduAV~IdTQT~HzoZ-5U;P&_W zNY&)2$HiSsrq)aGH}X$cV(iGl& zMCc`IC`?0!nbepb8>NUo&f*Vx^P7DCmdmk@-qWgg(kpf8m6#3~J$x%qAZjNgC6VEt zCmH<03|*F-pjy<$5&pXPnv_s|!AWrxveS4WLab31I_6A&x&S4wLUU4|mli#<%&<3G zy~agmSa^E<7kAcZs{T9apT{-8e|Ykv{~!TP6zC$m^XrOeorOMv=Z!niFpABgzh?vd zL&=YQ2vsv8ck|hysGk&@GFI!24;&3RhkVRz!)qzAT^G!|1j(#ExKFuZU8j#sGf$f&;xDoe zDC@}f5e5lN?uv)qAW)x-Tb;t&2{G9{3WsWDryQs8>aP;)5?6QRn^}X6PEO7`P$6Cb zNL%hY@$nD`a%YZBC2?$m<{fK;pu94F9(Eb_(1|op^+Nr&gw(X@48(qD_f2782kuxb zvLgZ^j8R=z$rjsuD^{CR(`g$u8Xx+VZ0hI5u+vZ6d$vKM_&njZy+uvaL?xphZhx+{ zs@mZ1a5rBK813>HIMO>?8cWzvzo_H;sj2mS_MMI-W*tT^NrKt-HC^W$W<7ihe!5vM z^9*?`Hx#2(>kcGQ?}i93rBb?V{CfZs-veAMiW(wb-YARz2gsRq9v|o56rEW8ciL>on?Lt zsHG1$W!p!nf88Xts9~4i>MKg>y?2X;&vgI5P)|v2Fi5kbA+sUXTiZnZ)rRA6W`|_23++$gl?vB}Lw?IZFfX>M7qPXNVDI0`o6j$Vs>&8-*lIwp|XRX z?{6wqXURSqz@R8p9#^+gm=GUeLdL24y+zvI23%n1&cgtmA@6gDVPKMT%)WGj_$zAW z_^~*HD}KMg&j=RpomJL(bqm}|iHd!W*Kku9%JnfgTkpY{<5Dw|R zxHrYQvMQEb@o%V>vhh`1Cc%qcm5wrAiV_t!a%uI3%2!Ws8omqgK&9${O+?~fK7zHTzl2ALIe%Cz{^ zvWf1%bW936J_B{?dlI$~JEa1$_rcfGz0t;S35=(&OX9wgNPkC7>11KeX4=U4W1BsW zR-`>BSV0coe1K?;`fg%0C9pzTHB!r>(n^L9kty`!8vuCp#TpXc6?@r3AZd zrVV=Flk%)-c3!Feq4R}zRW}(DFyiL80h~N60wR{`>nJD9RG}Gq@%nt`Y7ntJ@Ogn+ ze2-atL`}Y>Q&7FEJ~0tiuq_`FXnTVc)&3@m3^g@kM!z?fsTkH_Rb;XJAx}Y7%^#qY zQ34ld1Q4j8)4c}xWKY+nE6UZZvY3dTM{Wi;Q0dsnOAq$72IiJ_{}bMsuBE@c-SCF5ML_O>DTIkW5Py9Lk-Gt!Wy^RVGxsjH>1)0Db_ zyEBQVr|s?oR(=kLqH++PRP6}X{U436MgC{V77YX|u$v~Ch}{gYZ;R!6LxQozo8(mH zMFz;ClKNOuk1(=KocUsYK2p_2qJNz!|1K$T`y^?7BR77XoN0*}m&EG@FtS0*ao@MziFx^#y+;??Osc1qy9>rPq_ zIu2$^czvMbBeWz~T`WX{(+$fglXW!4i)F||wV@cyI?S#auL&P*udMoV0v1~S)yT%r`5?2=DK22Kykls4vC`6gpN+@Lc>n>46*DRmi< zN0#W6Q1Gta;20yHX;2|NlR?${WgY#2{~H-YV>$G8S&-4Iu;JhF-SMzfxD8v^{79?FZuD2~BJW(%!`SgQX@io(xCZsYf8OsfJf>5fmq_l# z>U5XLDQfEVRLh&*22HC?t66IxC~5t5*1q~3%qJRM7Zm+4UsNpMG6m)}NT(aiAYcUU zREv)|nscy0(dN;D5w~wiTigrLn$Fdm7Usr^itFdGJSyXHj`7RjwO^u+)LAyGAo!7; zaBHoa4$q!PI*E@4^|MfDLEC9}a_isuM136nqG24PU(%rw%JbVcdUU^H+s;KxQ!i&m zQ%kdLmZU(}GDbf~ufRU+QJ1h(fi5v9z8z-lS0bxx7}_0wTCnW!LHFofw-ob_q%gPR zT_p>-RV9=)EDx$$oXmbA=irmm^VTF9s+p-;%|hL|)ajS^Afx8uz?i-&dZ*=>NnwnF zsp^aH3h;9CIyMI7lna$*vwRa*mcwftz-6G;^Jt`33w`mP(l6u1G3M3&PK0sCZ^6k) zK3=3t-Qnp24Bk^SygS1!lbmcm+vc|eFLPYg^m~iEC>n1a`#T^~EbXbBJ_|`Z0;qYJ zVv(|GXYCHKmpzlxoi$g8$4h=I258!7C(Gip4BxFCy(iy}2FzV}eam%M2wR%E2G3~A zLFO|4dPbbT<<@fIrVG2z^&>cHS-Ov`9v8`u#!A9eKSUXS4wZGC5Wo3pg;;U+_F0DF zD-IVW_+*Y7lWate`_?pCWj5ub;#>>_P5DPI{%I zW`yF#mTG67_@91?$prSjqX_M(Tv7K<+K6A{@4Thu9e6-hNcA_vZ(ST3Vl4|hNvk(w6O~Q%XGs8p|Pc5Ip18UWGM8@OweRSR_44)&<24@?!Xiu5go-e z7U_gbtsKVo{cWR1hNV&T8bU!DOPoHS8-A3sx!SD)0d0}g1#hhHk@FSPdtB#*|)|5^ASVHcFrW&uZl=JVH5z*wWKFo#0o(bXnt|Ic{%d!Wz(2Sm%+!(f&AYnIht05t`Z-5Ot$En|`h zXh3!5c(0yFe-A4E_9EA9sC#Ap70=%iuwa5@q=0(WfhMCR|BByAJ{`r%yPSl&W3hqz z4gwN!mhU5*R=;|mtKynkskGU9Tnj2Q7e)?B&*w!x8g7cOR8%AlB+ML0*Kz--p?Lj& zfyj5|XH+jDr^4ErB=-B0OPWfT7ATE2M;OH>Pj;Tq^alK1rsh_fi~G$=WA3_4b=M*2 z=7B`^cZ9@05}VQOCx^Kxm$#JHZc>lle?dAJaRFrMMhBPpBrQ1ydmQEd&7^I3I0C9@ z<}9*9E>-bM(#3bzEc3V8Q~YjjrW^KgR;wTMaAr0n(2wqTVi{)eDdG(c*qR7m<6g^j z3}=`Cb6T$M`szD(^SsezZpDtRgQj!_7yx6TvP{ue5U;@-6qykCstztqjndh1R~4)8 zWv{-gT$ARjcA5t_W;!e*j;}*m@Tg{m+rzs8f*vgL`j?&EHbL`jpCFd{8b55l^xce1 z3*|_k`Gv?I;`iudXkVbi?T5r;_rH}?-Yhr%yJttSRBitV`E@p1`B%M)$%pQDthmfk ztEcfcTX}IaFoEFBjp;vxx$;W?nHqt?eBX2{?Ku(6+lWFudLOHY2jeyZq>E>bW*3yn z-IMvv=H*L7ZX4;Y?_+BF+OPUBC~G`CXJZ;19bF5*LOaAwtKw#QQGYD^4&M^a+3Ww2 zL}VTWw^lFQ7a$7bVXsu2Jumac3VxIw4NG{CJosID1H`kErgcKswY_@*)X628kFH>I z3oyJp4jGCCRKFz)A1F{8pJGmt1P*2&EC6*~3(S*k(wONOsGp#i$no6?`a*aeddCwK zUJ3&pTklh*m4EBs`wDSmx#_tq&x`zGkm$8=?*zXs2Hk;$p_UF#nXDQ{mPafcu^g}K zU(ef1fqkN-)+5}0cP2p`gHkt%i$0!?r(h|2Od-|@!;TQZp(UGfJ`*p@6ehHU`MH_$ zcsClFBth|3Ozi>WWPA0UiqAW~&}@9Y`a0qN(0 z&y~LmMCNm@c(Q2a7DDnShpE@R6g-OD;gaLio>f`m32pie{N1-k+FE#wTxewB+eVc{j zJV@#PpeyyD&f|vkkMkd_5xG~)x~97NWtsmXe{Cbz!-xtC%jW&}crekqn>ujL9iR~G zK9kw64K&qdT^z$WBA22yBeuZ*2zL?o@)~JZYJz z%%$j=Iq3yHY6WZz&Ij3-l$}H$EE$?7k z=e?)3>5by&?4IhJ8~VDOV{?t-yjo^<|MS4@|Chh&2Mhu43Y}-4VGrd&+wYW*ggOcT zk7sNTOo6x}`#_BV8Xak62~G|Iuef;_7+r-~{UebBADjY^kpJbQx~Ts`w7=RT1YfdH z6M6wg6_7qA=+*rp=0iqcyC>{_o^SD$yGBKMITfo7r{MLkZ5Jm4RStGBIF|!YJMJkj zXF?>Ojb8pp0z}+qi>PQu)y5naCfGERXIj~i&Pb^jmZj4S*ileBcP)!p6&{YHJgx!3 z%g>XxDh|Qd5iRX>I7{JpS8$v0nZnB)M%_8k_e=@`JPTj;x^eIXVbc5Kqx2mYc17Y! zzAxkUB(6#0Dw_!6YTXM@3WwhfQy)#*sVa)5;S8rCUY{b|!3bB@q;#wb3gpI4FHvgS zvt}2Za-{4M><)sp@!^YeLXZP;L}1~Ddt&t%{sH8kAhR^7d&}3>k(2|MS{wD-Pc$Pj zq}gWb@HYueX0qAuZF8+hGG$}*%#AoLSY11EGL*Tl=~6jU4MJ_|z})|S^=GZY zt;F#sZza@!2TXN6e`UR5w~M60<3IqJd8Re!-iXCMGz4v6&FmB}@oc9~`G$M#Zf6`! zJo$hUL{e+Dr&dNRcELRx6|RFEDRklUh-^uhim9LqWQ%N8w&TE5su8O1!q4si^8lZ| zFNs4oD{*z2-yEx8QD44%)qUg$1s{!xV9`OvaCXiy$K8OLK;sizojBsxKgy#Ikj5u_ zw+KeW>3<~Q3=um!yJ*4Axb<$vX9_+uyrB5tbAymz+@@z?p=VsMKMa_eA!(&bwb&Y% z8b$HhEq?O8D?+M7nU|%bNde2k?!Vc?bM+@J2HpnD*8?r}H%GPwkbxKZG$s~GDjGflnF7nmXLalNGE?S4x3Pcva4<4alMU8_sL?9{S`4{^mI z?<=2X-oZaUSg)-7Y9lDlQ@mr z@@JKuFnlf_B&id-8QX)H@%1f-c!p)tHWcNbdiGYMAX$r!ZImSh9OWmuV+6?ISn2>+ z_SOQ8)hH$ax-2A&N489x+HRUD%)Tv#+_|i|Cv;o%Fk{(1r72Hr0d z=v>)5hZ3n$z!E*ndS)-rWm)_!)@l^mLO@YL%LtkN^d&ROGriFgi;?5{JM1_d&ZRjNjKT3|1ux56)hhAx?8APUy{AU+*v91kb^9Zk&@{kP^uf4kUa67?waG%$^fd zC35h<`ZqBqaFaVmYB#p~4fbEkPTZ!Vl6$=|m|OYvFhDL(HJukRA4eES1C9xU=k`W5 zaht)+@IuD*c*p&Yc^!(TY{xsq;jw2iYfj+J(Nn!J;8@`v~&ys_>6?}XC`=JysViOvSEp=|iPU|e15etgNJ119+j<2p2?=o|5 z>tBBZt#H}y&yy{aIG9Z#G~n3|;*777gT&!MB7@5xiD!y6iCop+V(9)@i@81G_{vBV zJh?bAynMiDN}dzkGNN4-4fQ{%ss|ZFUR2RLQ>c=84Rz1&oK)2bcFrKH)+0PY5#ZY% zbMEcTv_N`L!6Nj5$;LeQh*igch#?Sf?M}@^LEBUK`yx^g3p8vD^+v?mW52! zhs73pXER9&G2`pRhSHB;s|S$>wIeA!cV0?4W!F`sE{oiPkQQc2aUS(?TpV%}43}>L z{0_K&8vIh4&StyQ@uT>qW) z4@z$5VPv$6yIIl>%RZar**F#ZBp+%-#yTwZAs7 z1E#L9Pk>&?f47wH#@tN3yQ~(Qe)D5f8D4Vf(zoQt1mnBpht%~nW6J7Re4T&ndLdwr zsozRRLF#>1S>os77mOGZX<$kLvaoHTTY@xys_B9K2se@60~{6L z>WT(OHVJGRxF|pAEym5$st5Emcw@=}ZseHH!@c17t*2@}&n+C+u3NhfW?F2(_@Yte zId?!W!W^{YQM6Z>1|_k*+jvB4*MfXo?wTj*Wi~-0Aa9M;e*!}sXXlhzZ!gNHJ5#iJ z(DvQq<{_e^I!N!5lxj(zMJSIQV{in{tVw-vV3ZD#Pt0_c{6@k#A zb)r?$qjyP-|1_8?xS60@N<{5Aq}UvC+Jaqg6l@Kg_jwE%N2ia7mV^qdcAjb27<-6g zd{Je+o%<=>Wh|k5a{7NS8Zd@xqjk$?cC^1TzeRwq%sBbIQ+iNs(X+69YeP2pe8v0; z-B@QF`?d3#4@B`TRaM^Ya|e%AZB^>Igp#xY;V56dt&@V$J0lJu5vvMOyE_Gr)79S&(_KBt=sI@;Ho(->8JZ`;6*f?b7fmvRoH+r`^G&TPJh3X zAL93R9n{HA@-5Ci6W9OX4*K(Ip%#il^WSww4LnhFrPoJ30$*beku%JN4vK)*sh4Xz znF?QmH^aRKpYyI|6sc4`G$x-ctbB|n1HNx-TmBf`00n4~bB=W_vDlaP@*KwSgQK9V z>3=Tj;D3p-26 z>urmmjgBP%VV-(H+9UE(#YnNW`4Qe8}g>ZkQ>!2=JBs}7IXexX;;+?*Sx zZsC7*Vk*hUym%V7*m-31CV!UrzTS@PQ&}rWG#z*79?mmD2tf#BP3rkbJjr@mP zuEsg0Z$!Zvr)Tu!tWfL8D3h$6bg_VbyWrOnQibdzw6t}hC?swCAS&|7o1-~{WWSDiw?`>n-=da73KN`HI+6AgKoNCT?bTio-~9>neKokEB*N3 z`>(1kZ%x-f2c^HM2^B7u5bEn*MtdvkfYGc^+P}20_{g!<5P#%%Gm)|(3ML*cBsMdG ze6e5Y`XKH02+g9{T2+-Z7x$DrF{cKM@nCF`JiRP@B3^w@j^|Owf}fY(`-dxjCk46T z)~wNi2pN0p>UUWW{Z7RxYBCbUHL)$*m$ycJ-nL?mvqZklxa_r?UA{^1lA1nW9vsza zPiQVtc59?Rw~Mq1Fi-yv)kCYC=Z6_{ z4opwa@{M)2lzE02A5?t&0p|saRyjz-2HQ}ZVVRGe-)B6Y@W`Y$oAiOHn_#Ioe+9<& zAL_I4*Y>I^Q9cK$9`SJE8aYn=@lisp1E1M#s=_@nvkNaBttum1Gn9C@ny zzG2fXzt151L)5P0 z4{gUxx6{Xvxk{tNif;tLlYs6O$TkQ zxY*4BI=u3-8rq2udmUf2KH;%*@QOdvZN=s6d{Eua{5(n6+(d(1 zC~epN2{{(Oo@zSKNuhU){Bo}VE_r*LC}mM2YLX`A{&wZchpvMlIx!Fea00vy;lf`R z^3s5rtX@f3PR@TMbvv+n3lUz=U!JA$9#MYq!_$o2d5xJDtF>Wc2gh~-%L0UqurVaH z$NHbldMzf@wepTdzf8bn@-4u~(xT2aGQq00yu%%+(+Ne}PzIx)nfA|TQk}MsP1&FA z!36O~8a}(Zuex=5Sv?2-k-&f=C_%3dl38a%)q&YietwVr~eYaV=*%VRpAIXO( zMOuC3PaGbF2B0l4S>1nk90H?L5fR+^{Qqypvi~o?whgSd*g~?i}0=obG>!I^eFcL4ZxoLrS;@h}z=g23%Qy%%V+&XCQt=6k~>@ zysw5~IAp8>1|Vj8Ct?16jNn~EU1eSsAg&4pHB;B9Dgsf?>E%s*vvymsH~zVqp8{As zmxXpPWqsrvsv}%uPmaoul<7r^-UnILc>XRXyAWCuBJcu6t>S+qW#A=2(1C_|AZ7<^ z1HiqVmGN*`W51g#8&nhkwHQy(|Co2AWYWNX% z)u_mfW}~{DN>K~*H;G)`chX6^r7?Lyw8YT~5Ni|r7V~H>Zb7U3TdSC}iz&ry!HsGr z0IwMUyEM%jtN^e`8H|xTl_LR<9A!FWeB;Vhc22lJ2_DEY$K}7sdjuP|z6#jF%*<}ujX&doAE zI(;~-qWWOc#5wx%*2@3}TMJ(Vn;Ob-@~%x9hsFGN{BuGg! zPHa>CULY9&*dRh74LpIokbL+!`gEDaMjNLL=ZvJDuyCy1)g8eVdIUzvJ{dr^7Hq8V z=N2eI{3i%hxniKt5;9@If&^*Y?Mu}^xt;GC&IeV=?gzTu1tkPgIb6U998H`P6|XY! z37eAih|Jxek)(&1aWtZXo>|=;Hmey?wqKa-O4K_C;qLV*UA8gIKN@`}h!zNV z7j%NN52jBgNT8*do@PW4Kfqwb;uXadSa1eR|+B7Uvi}1r4R=4THG!TUusUoD!{KY zkj{M0RK$s4f)c)nqHjF)Dp>*bZd~g;Dz||56{qjI*EmIVkXv9;zb6I+$Up~Y(G4B~ zO`TMqD`&n;zU7FI1p0XaRto1O9H(FKFY@tx9n)19xGfMRdurj12)r}*pg7n?iDUOG zg!QD84!t--4}ec{pD$ZShT4Mm(oiFGYqs%)Ll~)XeeWQH(G1=^lY27pt{|GE1*f9k z(lb)R16!44{J;VH+k1fTROg2oao3~5bLTXkg<}yr5<}j;#&(}9V}*)i`)W{aWXr$@ zmS!%7Y5`Z$SLUkY#181+2gE|>6G^F1C39nY3su0)Jm&Isfb_wquG=w~zlZj=OHDY_ z&PNG!*m(n~3+6K^#8h!B6>q9Tli%d2l-ks2r-hZ)lv$8IVc#yFn;(OqV>TO_?g6C>Cj;{SV zrRKZT+pUgMc~e?tD{bu}L%vR$d#A)?5!Dj-s>81#rLnK5eQAg9Y{Edhg!&tKv6Vce zQz7_it;4F%x8?ZJJ(m}rwZV&5bU>p^WcZ;)|J5#b z`$HT|!$-MQ;SoMO-_*#*xSu7?2{|IJHuajGo?{%2VgfpsZk@vo!Of=?OV06%Z+Sr%OQ#+KM`c9Br-_%nYJ~DU~;u0ucHHG(sx7LdRvD?+_jndw<Xxsc#bZutgw>fPYO)JL$2y)c92IvdZ7;`_h@5U zi#?DV`@}!D*Xj}ZPs^tA1F8_Q^1JqrRl12gzFZN6r@_8&n2-rR33}>c=e&r&J|_jL zpK5J=6%)Uo?ldpgh!4-heC#^rK^jyY%wo)I-!M&LHKfm~3x7%L9E|MWBna&Dr<~UNK50s( zoSV7kZEFR@o2^W|ekPuO88g<6F*#?WZqp4-ts>f?faOkCf$|0V?}bo@#?x6vWL}*; z@lh115DhZ_+r=WG_LvWl{;)mRx5vP26yEtX1Mj|!ykj)qDVCBO!}-9lzjrO$$^-fy zs?<4*Wkbgrav=Oe_*~!ZIP+#?4eo$@uqI0cj{`ANK0XM@F}STkk4~CTJe#XeKqRrL zk}Z4Y%EYRKH|BE8wP`t!HwWEO!)PhGZ;s*FW)GD*xdGtv{#$LpaLpz5wP~P##1THJyRJOh zPk0(J=y}^H!b~Gm8ewOtW;N4Z-FB|r3=+>-$6zYaZ0*sEtyEQF3yaehY zJ7CQpqgQ-t#|~%f_w5VJ5U?BZhPWa)_aRP2w|X)j%O7o+Q!gU#v2o$dqp9y2ZO3#v zg*FA_Lkf_#K2BSRm{T=_nmE!SP11FkKvZm-o}3Zmb`Ui>yl&TqB?ONpOgQJ zIQ+Dd&NGFqsqf54(f%s&yOC}>;IC3sPS+_nn&HJzB3-CDCoeNn{r2s}@TsjJ zcg;xLo36{$!Dyb;ei#o!}^NvXq z_0Zew%(2og=5FuLE_)h6Hdz;uaOVhe3S!plN@C+JNp?wzif7Pj=XX`FAF?&WR9p=k zlyao`kAH$k42g68tjlmjjKqDaHl`Q2)K9N=7zpvxkHR|i*sth}PE=T#NT5ejS}W21 zwi~9R;S-v+b4AB%RRXXai|K0BiAtx?hV!!a5F+)1vFp2Dxr5T!|~bAe7ONXCBF=<%NGM&X#H4K zcX9ogB9-6ax*UnBIUJq^D-J~h9!jMAn{-Z$?t0>U%@lP}&B;k=dda@Ufli`NV)RUZ zt+0Ba(*+T%O*4txtDdqQcJJ6vzPL(23U=qJ?2K6wOrlC|1XKs)R-ApX*} z-=PhqXYJfyr%T?L^JnhWl?hww3?q{iD9X*?tC-ZRL|i|Wse#So_51-jea$ReR8MDP z9Z?~-;P+ORNy6l6nq`r^z1dVZ)jT6(zeCz**Wt2Cl%*(CR~MP{^0^b0bddm)(}Hoz z{Ae*&W|>Y^u48`eg_$Vx8C3Y|*3l#RKpxJpGhf2i&lI{CCe=vx%GkkkUv2rKU>db4 z@h7Dx(wee>gLM5ssGap>B@hTLXYmcFy&bf%IG(=3;@(LYBeL!AZ9px1C|x%1?mPQ+ z+9j@4Jv8gA;NV@)ZNS~7bd%kuq;iihQ(Vdo(j4bIMca`yoh1M{^4xiYQ;oRGnQshL z^+-Qz*GulXB@y++=9SLd!)MQ-u7$I_-ha|9ymjIJ|E zFaW-|aBW`hX%FlH;uOdI;yk3nEtxW~r_KGO5OlvG@OCf`2~umI`MDwS`8|8tGp`#* z7MWR?C;RK2jv_~G3uKS$qBUgI_Iu8~W5Ey09~5trzF|1%7GE`&I0zYtl7kd&4%FQo zbu#vT|E%NglNTo)h=W;daG`E{jX~HGvDC{=d+a_Vk*o4EFzA`xII)Vs{Si=mlWEYD za=LmptGT*jwds)7UCVeQIGULrhs80=Pxt-=c7NZD!eL14jdSH% zJuPTtE~_;+^+B=RNoRaL+nx-4FkD*Innsd`M_Vo4+eZr1}$TR&DayK6I$P}bYj{9-6{3v5w zUzvWamSr#(pyWB7N)S@s`a1iCK~)s4v9uNFa!IXn`!2v^U*j_sPEhUXQ^vvps=V~d zFe6=2yXslpcC>Xfd8Z-Cyz~8aE~z0uJYv&avzGe>R8-@z>g%l3`js~=a}@jFsAT1H zIeGtp;gqfys!%5oL1Ne@{d*)gB83v^y2Q*ld>?6`c|?4Dp=-k)CoAZ^VHCb!DD<8-wOB8*IvtX0M9bb(p)$-i?(@lJY43ABemwa zcHa(BzQG63J2>6l>w3FN4F)x6NzXsS+ggwBSlGE;=x;i~@5YNyn6F^uVm!ffN#G;& zUosXKfSLHqP4vl99#eu&z_54n%Rn|g(?n@%O;wqbAeB}{ZPI)N@RtIp9tIeZ|Ms)o zi_<%#Ai%=pGGxskZVIeuhP%#k$_^0GWlgNa>Qj5`G`!xcEcIjnQevs=r}AM|;<;Q1 zcLs9s!*GHdFyMCkLFfB_$zmmNx)*!5&rX5!v?ZTMZ5sy?bAyf{-~XG&djED}aH-W_ zvh`*BC`AMu(+$4Z0LPVN{MU6Gc@3)lIUK!xU!vUAttwV9Q1PvUUS2gpS7lDeBO&@! z3@f=cQII-bbf4=krt}zHe~2sooFsoII>9KmSwe=AJM457K{x||M`mCE|63daYp2Vz zj!wZi0F)HjlCKT}#K@!e6)#RRv@i_81f8P(5=Rnfde_S=Dtw=l$+CJ?;WT`LdmvJe zyUjLu!gg^Qz&rjQBcZR(5S(;k1Avl0)3gFhn?&AOLkKhx;Q9-H`7Y)@Sb(f;qD7h^{fDdcZJwY z>EG?ix+-e_7zI{X?=# z%(5Omh3t|)PB!|Wvcmf#UYiY1CVxT^(Za2~T4gxCt1tsvhse#F<31QU2&;krl*kN{ zcUnGzSN0t~=5SXUpWIc|M} zv7xr^N)!K{8{7Tdb&8KdkQ}zhBgZbY{!5m%i=eyRHD}Xw&XKF~#|$?HjC9ztXI3~vrrwA`xi=3uk~OG>eYrQ%EE zeQ)T7s8l;R1Pxq-g=d?lJ3cj$C@4Bi$~r(ShjoFeTEo(GM|J|_E6J&2hH4$ppiFmG zyZ2}xDjc(r44MP+oCM3!9bk^Oa#FhrX?1+qz(_tOPJK?f-(+{t41Nm^H+6a6B8n4u zfrW&4y?Oc_hko^bW?loa=*#|~Bse-4on9`5vKs@xDSg{<4~s*b2H`S_XSOJ1I~Mu8R%xs)u!D0TD?`mKhxY-Wrh7hRW^BH*O%6N_QR4P zv;+;5>SD9ndVga@EtZlQ8Y7Ms*1>!s?HOzdm-c0TtRdXQ!heFQRsoVx2O=u-Mpy@! zPIRZsqrf76tkcWh{AhpToDoCB8q_I8S@LK_vW6K9;p;azBtk-s%z70H!$KdA+XA3E~?jH}nHQ!>A z{sx6#hIzMdqcW&y`e+N4tm_FpWAb-#^4r=rNXvVvhwIlvLdBJ2p0Hfnkwn!DNVWp* z=b!TIpq_-`njTn0nzdl7!D$BHplzBZQm+vA^x)g3iwiX0Za*OVN<-*E$sIg^YP*Td zxO>EF1O_j{$u?VVRjG2)ozL{EbBdTV1W%3sZ1B4tXS$lq`zO(;3v%m|U{kV$q{02U zhSsc#MCcp(tP~tkRkLI+Z8CEq5DQivwfRjaA{`siR>p2g%r4tC_{2w_>Q`wy-Pek};1_R?*EN4JEEw z(}G<^w;NVm;jDo<522U-k~uzMf@A>z*6wl(c|9&7ciytJCCi~0mby7a@%4|c#3%!2 z^-@^pv?HrL>$w|%TJrD&<+p^mo-*A;Cjs1%CtVXpt8X{hqVP&DJp0(EnK#*2jJ`R5 z?^;c=v%M>N;)2op3_aYkP&-n7xZlK6>cH$b=-6$`wgNxdu0H^E;Tt(`8#_Kfy#khA zr)n7ri?a-35B-K2eD0Udm|oMuYME<+7@@uUf+pK>{G|dIW?cuCaX7nHhrU9v4YvG2 zSCz)uBa}cuev3SDX8Do6GCe>v%xA6BH)Au6iSepqt4_ol!3_VB0oBjePT~?7RdeAe z{)f@FUq6=fAx?eXG%+tL@ACO9q3>EaNYi9MJy;XI7Bn=yIbQ+!YSX-D6ZTtfDZnvc zb;p-`I`DkDGVn@yrm@4xp~cuH!C_a0VX+o=>hLx^uUTxw{FrNzauU)M1R{0&oHYpS z@+{ux&GWqdNA%7+F4{W}sR|~12t3W8a*MO>-$CMAEjLI`69DX|rS>(4 zKG4@B_scyL*&A+C&C`p+JD8jRDO?SSFZ5jO`s!EW$GhaWM6$l7yM30V_W>T3*`lO&BBxisRnYg>pS>^#?#pY)%wwsW`6Mf-!IM7 zrujIuq?qsD8W2f}K`_dR#6hAnc@D}@i(q=k7AEY~?DA>RqQUCbigg>rhQgIV=rNW2 zLxb_6?WymZm12m#K<*;^q+PvUWbp#jFD=JhzP~os>CsUdJR91E`+zNFsWlrWoY%ZY`rs@H-P4RDeH3G zpahW}@(vE8+>(Ey;^b+jZnr2yZcZRHdT0Yfpc@|)|+ z?)fu5`4cRsr(B^LptET4T$F3D1{QHfE;d52|AOksVj0T4r+zt@wOR2ELBwEMmVK%I z1E-n)`*wxj-szF^xNK`LEi&9P+Mc)?{N;hWYyDb_Zggo>!Qd!r;H1K#|Ar3#@F7?t zc@H(B$Dezc?Y(zZn&te7mPL-3nSNkR9qH&2WK6_6`0e2?qlcmPk#Lxm;e%a+MuV^Z zlvvuTndz`^m}vdreNdi|q$T&WR-p?+ATP;2(A}u>8L9b=PYQ-|@9C{j-24hG(10-{Tn zgG}6%`yQ)8umVFvGa6G^eqljjSx5g>dhXIk0I*m%Sn;cx8?~y+$Xvf^ZdqLh>-Y)a zN5&^mveF+e><>MNi_&!a<};CdpM1ZVNteS6q6;_c3tQz2T!pj@2Hk_`ab3BNM)xY9 z(zXqqx zJ5i4^qeW(>`~+kpPYb8>EM+HhbDIzeolDzGZ+k6i1O^ODQw-w_^A%6azWDBbqJPO~yQF`2xI0@eSic0r)LK20dWW0+hNC$vCR!cj z{LDaiAh0a8U`-(t^DPm+&Y!N|Q0YyQtO#>2)bRH5YRur%vDUg2yd{V?R- zs^83^)F!Jf6T5V|G^9f_O5d5DmLLr_O{eWXj}Zlr!2g4HSu}LpF~Zo)Os$d;va!L`9hKf`s*haw|TlG8H0S~c;Z?Qhy%Bs z$YDdHwVRe9+>`ecT0|^dM;6nEWz$|ZlF`vg-Iw(|E%srum~47?_`Hv-_Y|d=EcSd$ zNK}iN3VHeZ#q=wH<+v(41~JVOVH#~Or<^=I^MACoZ1@FGQiqk6!%0%^}-WUwJc@fmtY zx7JwTu>s@FwhJTY%~+n;sZg<}f64w7f4OTIE?B*8=#r9hn}$24)4zV-^tOTOT@wAE zE@iH{$??pqm*pomx^h&F$iS^YDCHsA8CF*G*&{XE*ZT3*FSdWlyjz@#bg~{J#y1TL zBJ+!16!n!1J3aA~G4`SVCdSBV{!6xYv(Ei#@;zm)%SF|V9G>IF%Wl@L6-ea#Os$#8 z=VBFB#JX-1w@8;q>DReBvC{l4kRycq1-?xZ{D*#17kR(Muq1%Qep8w!Mdo|+ivMFw zHoclwhRWbO$6I>_E&+z-qvuX0232pCeU<{Z9HH4+b*Lpn8+q%s>^hLR+f;7ld1CUP z`X#LKv5=}-vNT(NPo9GC?)ni@*Y(-HcEg@7wbPT$>{Y$Q)OV%K0i8^V2(}YrLd-9G zL28<}Z<*(@OrDnhC`$tMOp(-_{=$#$Qbe8Hldxuw@6}?OLKVkGJ5fm95nQse_jzJY zV>H`uX4*s4OI&b%^AzHVkxDMvCC(8T*A+OVy(NH{-tf>3H)@8^L6)hpN+M__XubVwNJJloqRF`xGJ(T) z8RG4dSLS*&bIRZfh@qyr&ZMZvoUdmN8*R!|=y!tTD&zlPJBrRzYH9K`H5JY_Q?V%e z%8u3UypQ5ORIaW{JacWDv?fR-xMc|KQC@kKvB(3pU9jx&MMu#a^oahSh^IkcfiI~% z@Tt00kHv)9XZ^wG~t)``^*fZ1ZvEV5wC@Fg6iU7i)u$zbRwJ7z9kwCsTKuTS~F ztl6$WF6S|FDRM|Rhg$>5wSn?K=NMmkna)8CF4dv}syO?l{@XIn+5pgBvWHUe?TEi* zBT3~*9{}7vypv3-%Oc)@PWH8;i~KTXKxbe5GGYSN@gk%iaR@^bo2?Sn?}hOc2x+D#O{oWyl9zw zwzl5dO3NxzB=)W#WcX=%R>M5L*5BTDeOCxC-+MsYbx-^NBA)ks%dIKN=XRlq!gKN* z%txhFDb^P>S7E#U3_v>tRqRpMJ&9Y!HEG{BySo;^YKPs zC?#R@R@;9C_X)Fb^=U5O*tRVj zcklA|Ul9KQMXy@j)p^)#YG8DZN?zHvOu-9o6rqAfgRX=cps(glq$VIPF#qtb#k3iv zNYL*>Dn5o1vz;m@J5Q8}RiW|yn>Wu8l3KYFd@$K@$6=k3I=2&Xg!(XfE-pW1#cg&H)5;!@J+)9Eikts zMOfwceCuWZ5_hrmk*x-u1zCy#1B!h=)Uq&7Ul0#0SQTf4W$yytNt)H#iP2IDJ-lEH zWnH6WZv!-#%7eE=i~?jZQlewm4tp0=H;rW7zHMaD%Syp>9b>p=_Dc!L_L@wOXjWg# zrBSeQADnPJ=Z_{`8^^aUGV2xfQ)m$Q3T!|fL3{_vyGwXE9HOIk_T9z1)5EVxGWoaF zt=#Wc-RZ`laL(6C0`62mE<2DwBPY#^ENNO%*Oo5c3U_9WB!tzf}Ap2`5CwrCegkB8`T{oP5g%L%48MlxAK*19$@DR1(c>ic2x2YkJV4klR(1hyH}1$VZDj6zF*I7*nuIYhauG{GC;Iq zj_~pT%W#k3*{;Ot;_9xg^NQE=K({|N@~i|$EmqiNCmGAC`1_e4eq(2b^;m@trM77! z>`mi{QYRhfE4AgtJQ^T!_p%!xJtEIQS*}^pN=Dp02O5h+x4Mfgzx52C@ce8!r^>CS z=;G-_W#=dt&7Kdi*2T#$B+itQrC3#zcMY?xsr?vQtHm(;`=! z9ZL`HosQA7BFkWX)!9rQ{`a}^V*R^Xgrk&ey&W!xuvH)V#F98Ip+~Azx4-WGJkRBd z+>;H=*|y|q6hDnxRmimUcpntp?5h_PiXEsVNmCmi?X3knxh=*Vvm?P!wG zH)8-vFy+E|_}f`=Co7kf9%ZY|9iBgMJ9w~k%)(^Gv9!M>EXt70GUJlv>+q8=07;v@ z)$U??!VpO%CZVgmX`)H(j#L^XuA$q}A#?%Y@>tPN7TeQgHwt2W#I*>OT2{MLEs+PU zI~CZQT}hj+Q*;iWRfJ0mHOk{i`=%Fw3ul|$ou$BBi95M|sPGhp)CJ$K=yR zC=11NU(}$G@2*-xP*=e3Q*1|fYQ@3o^o|~;(OzA_KhInqJXzZDRDM44034N78I--$ z_>IId;w&n&L&BI=wEf&YLiKh0MxKO(${2#fMe!OoTB&^(vpoH(M(;kq`VbdZCpN4s z*EtsNQ3-KX`@~&li0D>-Dh8+6if|~DZpvA!ZF%n$yA+hw{^xu1_EKvMgVEubVaGAp zbc$Hea$^<-HiUVe*p9h~@cpRh{Xo2QOmU3LBJh+B=2+TRD8HxZTDeI{5DP>39S zno03vLLC=u6j$c;wAAbxhb+C`+&A;HpJLaL*eG4&S!Uge8lkllF^r|~*j|%Cv9k9W z^BPZ$QeuRh-=ubjVQDXwMZFDf4w@+^9hv)uC*aA2`Y8wQgKzHEY8I5dcf3f{B8v=Fn(vd_cIiw~ckx<((CHB~b1b(_TT;v;x>x3Rcdb}a zm7$bjtqiFZ=2c{KmfY-N3R`$kRx^BSrd3W^EdBTBE7X#=Fq9d=HBgqdT+f^8x*=Ik?P zu0eaOE$gL017})pOC2|F>u9n4rr%5rhy%p18mgWPBOfHq?@3XAR#NnZ?3_WlKAqrE zv2skEyJ4y1F{kkB(&(MduLV=Efm zhcqS5Vk;n>@<;*F0|KZ4w$wx1Bx4k3P zD3BH;i0su$^kS*Pst!si`g8RQ^=p|rma0X)8jRJ^y_##VuX{<~hLbxo#m>H-f}W}L zRTX2cO%yh{9j|q_B-zwWLq>0V^+U}KL>=kQ{#a8IPmFSh^vuT-wm)mL+TBl;nSUL8q9Q(@P=$k~e5WZmvucSie2O`78}b{1J{) z#Iafx!ct{qywZ%DKJQeHAJ*#&*P=h4>I??KLK{c-IjZAKZ(!V`O9b_Uhw1lPDZuvo zcLD^)r&SNS=FFlZg!ytML-J(r=kB>d?rj=$sLw9t^>dsBj9%E8>I+Q}Gda0+;8W4Z zG3x4dqt(n&%yk12hI>GoyYRtsjw0&Kw5;60F9PjEfHGGEzpMt<@PKdf6e+V4;nu6D z@G16zBv8w0DUkPT`obXN>=K?{cL4w3x%;X!>d@BcPtXw#;CiT_oGyqGR+^Y(B^BnEpPdA-${KE@0yU_F4Z?^+l7j5QWdv2Pbe}ECPb_XbZwnt-4V#_!99-cc3@QR)_ zh8U4jd3_)FkGF6In2!;>@QRy3e6^8%Pf;9){I->0y?+M8Gd80`FODEdOK*3Mu50Xi z!WGw!E!nv{bz=8!*DhplM7C60i)CjE^=%TT9u>sO8tvSxAOuR$#7fswd9gU`8ZO0V z=Oq5BxZ+jxu9-XfhH1^_SiK{=smDa?yJjBK-+@T^-%!KfenuIh{&&|b0Q4)Ha#H0U z>N!uWjtoXS6P#xf`#r|dlRhD0lqtAN`u)?Hl5-7W;d@;%8HWo>C6;j=3hkIm9Z4}6 zpTcy*iil6e^pDT$i^nMI9~6)AL;s0+vCFux>NrxJ+0_bNod0*ng$I7A$@t)g;;b zp-wzEMhsOWo%LPqG;@$*@~L+p%T79Q`$`TPC8Vy&H(W7$^@Cf$BXYE5q_1q-BOz8h zYgHEp(UeZArFv2RmJs4OEzQ>+pM68>_`9*6*YX6w-mm6f=x>XOA-#095O+UNkL zziL|RP>LDpF47|hm6dt%z)r?QQ_=GxB<21CH}lwm>?cH%% z89TXYwh?iA?p5Ve)*!u9{Mgn7=(c^TcPUE>gW9w2$JS^XUAb4~ zwg1VmTvAx0K%E15r&sj4myG|cs%6gz-oCzZKixKmi+YE&4aKnlrHGc<2Uhy~ z;3?WX^TIc^M_*ZIFsx67z9-T{ci_9EFM$YR>)7{!#_y&7{za5v1NW$5OAiUXsXPNX zhZCPv-uyq+!ff2@sb~GHapL_HZ^B|+bnpyb_n*B)0L-o03&St#(t3Kqm5NF^1sqQr zMI8VEAS-|YDEkdy0Gbg1nXFIkXCz;RzhnWmxT&}Q(R(}y56|<1%zoWJzZe=uErT;s z;RjzW0gl)c@P5)il(Uuu|3N9#hNJmNVkxKKQ{W9l{-2kBnlD2ND!(AHpZ^BJd?RF^ za2QNF2js;_cW$E3S1E{xXpBjg&0jK?4gU*D5-27@+ri2t}H3aUe_LUq=JtouWDl$g2BgWlBHJk`ue z{{vKcCP+!0=dS!I!)(t3oSzQG0{|R6S&%Sks*N2sn&f-u!uQ9{gu3MOAafssRHt2B zFDqr_!R*uVLO{>>e!C{k#zl&k)^*2OrLZN*0OedW2fu6er!da6ouT9?`n1aa8ZV*U zB=65R9_zj@mp#sFfLvE!?)R*$I>?Jo4UKSOUHj%zWmb5c_JKDo{rNU)bH}Y)k`ekJ z`VNC!lAe?yO3or`YYycRxDSOeXZ(_8mdp387S;)Z>f5|<=iH`SPw@{@t%H7{Iz4W` zxJ#y5mH%_9&dlF9=s^I-!CFiKl*ul(DErR>a~idtc4*fd)jnZOgh;XcLWo*$om)4J zR-%qcU#-ZbX9Z1x$RtP+m(y)|ul6A0SV${-+cZD5K{FCq$3Ci$H^xLN0*;7wR}wcG z+jg%1oShsO&tBp&)4F54b!JH&{Ik|H^J_x@)8nc3E$HJE^^})fL)Hveo962{u-(v= zEgr=P|GA54Lf`3d#WAS@1yk$Mp0rEuu)OsV%EzOVpw&nk8}qvEoO=z-5fEi>qup_( z;A`G5UK(HeBff?4KMNXekGg-n+GXbzDzU#IC8P7qfbBgQ#WQYh9;QT#7gEFN05IG( z@L%Y#%Zby`E@ls~6Nu|MAw0>htSE1+TLA!(xZz_0)D*&WXC}tM;VQLdM4JT4^aSyn z%RqzuG~wWLVoeX6bufZ!a`_$Y0Oeu8BK~X)E4UzSrscg<#!Uzes9B?v>QKD5JU(_j2n)jER1UDP2dd| z&mV<9w+)5njV@*5QcU#k&GVF2PR83YN}&)%&$ZvMp6wbY?+PF6VqG1nkFY|{G~?wBHO|xt$z%POQk`)0e~zY`nIf_i<9iT zS&OfDgCpAWwSrF<740O>);C~aF4uv96r=}Nf8_EQ!3e(9VOF&!Ph6*61YOlqnfOIr^b#y6zv!dxoZ>He41PGJE zMN>nk`R0fZ*)Zaxa4+)7v~O&HNM<1aSvS)cQ;kn_q2_}eDV~KCu25} zOnB$(tCR;huP@CuIVlFxuquhhN6OdeV-)d{J5{WPw}%`U+&eq{mcNI-xEb1J4Q@82 z+v>@Uy9U~c=TVgs2x08owwfw?tP%akyv-)_xYl@r&o-pZ1jGD!QoV@1?)>wQ+Gaxr z21>){c{OlQZJui%wd0V_eXfBRK4-5q<*MWsc%I>Cll1h!kNKe_ZO}5jDd=Ny)tKsC zx&Q!Q`1lzfAj0g++$t-`pC2kx_O@4ec9VVEByabUFyaL3qqip=d5DU9RrJ*{0 zJm{%)`Hzf}i_8SPsKd5+4)dKe&FkdVo>}y}3nclUEXek`mkexa$W&s+@lUrxg~$63 zVvK#E%)93;8QV43Br(LS5~D|a(gA8&3dMCt;Iv4Mc>iR^i!@BX<`iq`+e_D?KL=cb}!3(xqp4I|Jw2W4d^;}mfSp96PLEc^W-Pm z<(;iuL+XWAo9XANCgJ>-)GaK+adG3#0c($F1f$V<)6vPI@$#a?+A7cvJd(+~@*b66 z-Zzfq9D2;Tb&LCCF7;z$(jM^MJO@|36CibvUr;Lmg*lzsWaQEz##;F5tcU7%gdiwe z#xNt^kAb3iMEB7Eufy7p)DwIcq|tDfbU}1XC5{?B!1o1i&&zg0j|WvUNY(Tjpp&u^ z2`nvx5Q%oci;shT7sSs!zWF_!JKX9dFE@|X;rie-^Ns6g;4$PJC@Fus<(Qm^(Ke$^ zYBE>G0@0y8gT;4C4VOC1324d~dh(2)Pi54dN0ix&#IbvA_NZygjQpOLInvazthu@L z?mT@Ik9}TP@ZnFwK|$F+28zCZaaAO@VzKb≤ImIyk*ahp!b|+}c%L0BuU-zR*Us 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�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 literal 0 HcmV?d00001