camedit
Version:
Small JS image editor wrapped around cropperjs
350 lines (244 loc) • 146 kB
JavaScript
/**
|--------------------------------------------------------------------------
| Camedit Editor
|--------------------------------------------------------------------------
|
| A basic vanilla Javascript image editor. It is a wrapper around the
| [cropperjs](https://github.com/fengyuanchen/cropperjs) library of
| [fengyuanchen](https://github.com/fengyuanchen).
|
| This project was initiated by
| * [R.J. Design Management](https://www.rjdesignmanagement.ch)
|
| and developed by
| * [Christopher Christensen](https://github.com/christopherchristensen)
|
| @author Christopher J. Christensen
| @version 1.0.0
|
| @param EditorID
| @param defaultSettings (optional)
|
**/
import Cropper from 'cropperjs';
import * as blobUtil from 'blob-util';
import ImageFilters from 'canvas-filters';
export default class {
/**
* Constructor of the Editor.
*
* By omitting the defaultSettings parameter the
* constructor will register the regular events
* of the object (such as click on close button,
* etc.)
*
* @param EditorID
* @param defaultSettings
* */
constructor (EditorID, defaultSettings = true) {
this.editorElement = document.querySelector(EditorID);
this.onAfterSaveCallback = (image) => {};
this.imageElement = "";
this.cropper = "";
this.options = {
saveType: 'dataurl',
saveFormat: 'png',
imageQuality: 1.0
};
if (!this.editorElement) {
return console.error(`[ Camedit ] Couldn't find editor in DOM with matching id: ${EditorID}`);
}
// Create DOM elements
this.buildEditor();
// Register events
if (defaultSettings) {
this.registerCloseClick();
this.registerResetClick();
this.registerSaveClick();
}
this.registerFilterChange();
this.registerRotateClick();
this.hasBeenEdited = false;
}
/**
* Retrieve relevant data from the editor.
*
* @return object
* */
get data () {
return {
'dataset': {
'brightness': this.elements.sourceImage.dataset['brightness'],
'contrast': this.elements.sourceImage.dataset['contrast'],
'saturation': this.elements.sourceImage.dataset['saturation'],
'rotation': this.elements.sourceImage.dataset['rotation'],
'width': this.elements.sourceImage.dataset['width'],
'height': this.elements.sourceImage.dataset['height'],
'top': this.elements.sourceImage.dataset['top'],
'left': this.elements.sourceImage.dataset['left']
},
'input': {
'brightness': (() => {
let input = this.elements.brightnessInput;
if (!input) { return undefined; }
return (parseInt(input.value) + 100);
})(),
'contrast': (() => {
let input = this.elements.contrastInput;
if (!input) { return undefined; }
return (parseInt(input.value) + 100);
})(),
'saturation': (() => {
let input = this.elements.saturationInput;
if (!input) { return undefined; }
return (parseInt(input.value) + 100);
})()
}
}
}
/**
* Retrieve relevant DOM elements from the editor.
*
* @return object
* */
get elements () {
return {
'brightnessInput': this.editorElement.querySelector('#camedit-brightness'),
'closeButton': this.editorElement.querySelector('.close'),
'contrastInput': this.editorElement.querySelector('#camedit-contrast'),
'cropperContainer': this.editorElement.querySelector('.cropper-container'),
'cropperViewBox': this.editorElement.querySelector('.cropper-view-box'),
'cropperBackgroundImage': this.editorElement.querySelector('.cropper-hide'),
'cropperBoxImage': (() => {
let cropperViewBox = this.editorElement.querySelector('.cropper-view-box');
if (!cropperViewBox) { return undefined; }
return cropperViewBox.getElementsByTagName('IMG')[0];
})(),
'tempHiddenImage': this.editorElement.querySelector('.camedit-image'),
'editor': this.editorElement,
'sourceImage': this.imageElement,
'imageView': this.editorElement.querySelector('.image-view'),
'loadingGIF': this.editorElement.querySelector('.loading-view'),
'resetButton': this.editorElement.querySelector('button[name="reset"]'),
'rotationButtons': this.editorElement.querySelectorAll('.rotate'),
'saturationInput': this.editorElement.querySelector('#camedit-saturation'),
'saveButton': this.editorElement.querySelector('button[name="save"]')
}
}
/**
* Retrieve relevant values from editor
*
* @return object
* */
get values () {
return {
'imageSource': (this.imageElement) ? this.imageElement.src : undefined,
'originalImageSource': (this.imageElement) ? this.imageElement.dataset['originalSrc'] : undefined
}
}
/**
* Adds given image as DOM elements to the editor.
*
* In the process the image object gets cloned, so
* there is no reference between the given image
* and the returned image.
*
* @param image (DOM element of type IMG)
*
* @return newImage (
* */
appendImageToEditor (image) {
let newImage;
// Append here
this.elements.imageView.appendChild(image);
// Add Camedit specific class as reference
image.classList.add('camedit-image');
newImage = this.elements.editor.querySelector('.camedit-image');
if (this.hasBeenEdited) {
newImage.src = image.dataset['originalSrc'];
}
return newImage;
}
/**
* Apply contrast to image data
**/
applyContrast (imgData, contrast){
let data = imgData.data;
contrast = (contrast/100) + 1; //convert to decimal & shift range: [0..2]
let intercept = 128 * (1 - contrast);
for(let i = 0; i < data.length; i += 4){ //r,g,b,a
data[i] = data[i] * contrast + intercept;
data[i+1] = data[i+1] * contrast + intercept;
data[i+2] = data[i+2] * contrast + intercept;
}
return imgData;
}
/**
* Apply filters to the cropper box canvas before saving.
*
* This method is asynchronous since it is necessary to
* wait for the image to load properly before it can be
* returned with applied filters. For this it uses
* Promises and the image is returned as the resolve
* parameter.
*
* @param canvas
*
* @return Promise
* */
async applyFiltersToCanvas (canvas) {
let context = canvas.getContext('2d');
let tmpImage = new Image();
let brightness = this.elements.sourceImage.dataset['brightness'] - 100;
let contrast = this.elements.sourceImage.dataset['contrast'] - 100;
let saturate = this.elements.sourceImage.dataset['saturation'] - 100;
let imageData = context.getImageData(0, 0, canvas.width, canvas.height);
let filtered;
filtered = ImageFilters.Brightness(imageData, brightness);
filtered = this.applyContrast(filtered, contrast);
filtered = ImageFilters.HSLAdjustment(filtered, 0, saturate, 0);
context.putImageData(filtered, 0, 0);
context.drawImage(canvas, 0, 0, canvas.width, canvas.height);
return new Promise(resolve => {
switch (this.options.saveType) {
case 'binary':
blobUtil.canvasToBlob(canvas, `image/${ this.options.saveFormat }`)
.then((blob) => {
blobUtil.blobToBinaryString(blob).then((binary) => {
tmpImage.onload = () => {
resolve([binary, tmpImage]);
};
tmpImage.src = canvas.toDataURL(`image/${ this.options.saveFormat }`);
});
});
break;
case 'blob':
blobUtil.canvasToBlob(canvas, `image/${ this.options.saveFormat }`)
.then((blob) => {
tmpImage.onload = () => {
resolve(tmpImage);
};
tmpImage.src = blobUtil.createObjectURL(blob);
});
break;
default:
tmpImage.onload = () => {
resolve(tmpImage);
};
tmpImage.src = canvas.toDataURL(`image/${ this.options.saveFormat }`);
break;
}
});
}
/**
* Add required DOM elements into the editor's container.
*
* This method overwrites the existing elements in it's
* container. It is used maily on initiation of the
* object.
*
* @return void
* */
buildEditor () {
this.editorElement.innerHTML = `
<div class="loading-view"><img src="data:image/gif;base64,R0lGODlhyADIAPcAAAAAANbW1v39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAwAfACwAAAAAyADIAAAI/gA/CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza1d7gGX3zN+3/osnGL5yeZXnJ6dHuT5y+5PvG8c3OX9xfZL3E+cfub9wf5H/DRYgSAcM+FeBMyH4mIIyGdgXgzEV6GBeEtIEIWMXwlShfRlG6NiEIUkI4lwi4tShgCOGuKFhJZp4ImAr3tSify82GCOMN7pIY4r01YhXjjmJyKNZQgIFJIU+ypgkXUfqVOReTwYV5V1TGlkliVf+JOSQW22JVJZtgSmlmGt5+eWMcJmpFJpusZmUmmWSSdSWS3ZFJ5cJ0onWnVHxWZaffeo5FqBTwQmWoYUK6hWhVd2Jp5aMWuWoVpPaqWijl3JVKVWbLuroozZ2+tWnoL5E6p+fMnXqWasa1eqeYq9amWqYse5EaqmB3urkrbhKxWuTK/1aJ6y/aigsksIOm1GywGLJbKnPKitXtIgyRK2cUF6rLbWKbestrwt+K660KI57LXjmHvtZupmOZq5syY4n77z01mvvvfjmq+++BgUEACH5BAkDAB8ALAAAAADIAMgAhwAAAN3d3f39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrr3tgufPn0KNLP93cePXi14lnH75dePfgB77+Axf/m3zv8MfRYzfPOzz73e/hx8/tfn36+bfd47etfv3+2v1xFyB4AxL4H236+addggIWWJ6DhB14kn4S2lWhSfUhdmFJFG4Yl4ccZhghTx2O6BOFg4GIYYmAqYgSg39BmBOKMQrVoYtj4ZjSjXqJGBSPeME4FI0W+jgki3MZSdSNOmKlZFFIwvXkkkxKOSWUUa51pVFMNumUkE11mRaRUFVpVpZfmpkjmVGJuaaMabr5FZtTdeklUEBmZSdXdF5l55065cnnnlWhudWfgM4k6JyIJtqSmmQhyhSkkTaKlJxnNQrnjJSqpamjHRFqpaaBYjrqp6BGZGmRqKaq0KpEebUKpkifxijrrBm1muKtnTLEq6ti/Srsr4oNa6ykjx2r7JbFLktsZs7WClq0ho52LG69Tqftttx26+234IYr7riJBQQAIfkECQMAIAAsAAAAAMgAyACHAAAA29vb/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AQQgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezfIA79/AP/oOfnA48YLGjw9MrhwEc+XPj0cnPj149d8HrvPO3ny59t3cu/47/647fHfzzdFDJ59bvXT2uN1Tlw88O/zb9Ovft50fe3/w/5UXYHsDErgfbfaJl+B5C65XIH4P8hdhbfYdKFuFCjb43oSzYZiehw5aGFuFIr5GIoMaWgfihhyOeCKLLcJGYomtzfjhivq9OB+O/umooo858gigjTsKSReNL80YY1lIwqRkk19B6aSSRQL5lpQxPYnlVVtm+SRcXcqkpVthijnmWmXOpGWaSS3505pnuQnUmmwOJWdQdIp1p1B5epUil3By9SdWdNaJ06BZFQqooXMqOhWiXRW6501GRilpU1aOJemkSVZK1qaMhkRkW6CGytGoYJbKE5VHlmpqRElf4uUqpxadqdeskIoUqF+4epqRo4L1impFoCIm7LG4NobssrY+xuyzmD2brGfS9klatbRW5qp43Hbr7bfghivuuOSWa+65OAUEACH5BAkDACAALAAAAADIAMgAhwAAANbW1v39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AEEIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFP7PKC6dU7WrjXCjn1xNm2Ltm9TzK07Iu/eEH8Ddyh8+MIDxY0nTK4cIfPmBp9DH4h8OnHp1rFnt96wOvfj2qH+e/++PHzz8eSjo09PELl54+vZU38Pn/7w+PJB4Je/n737/O39B6BA7tmnW4EDEijggAgm2CCDCwL4IIQGHhhhfhNieCF/G/rXYXoZcvjhdwVWGFuJCeoXIogrkocihf1xV6KJrr0oYYsk2ijiiDLq6CGO2fn4I4/TzQgjkeIJ6aKRGiqZo5NBQhklkEkyuSOSys0YY5VSnqfljVay+OWVVGapJY2nnYlmmmeSWeZ9arqJJXBqrllanUOOuWScYvL5pJ9i2clTnVtiJWhPhB4KWqJ9AnqVokIlCqlOk0YqaVWFZnVpVJluJWmlLnXK1aegpiTqV6QedWpYpJYK0pxSZrX6E6xotboqSm+6ZeutIXVJ1668yubrXcAGO5GehBWb60N4KqasowfJCtmz1CI7WbXPeobtp6ZtS6to3KYo7rjklmvuueimq+667Lbrrk8BAQAh+QQJAwAgACwAAAAAyADIAIcAAADR0dH9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBBCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MeeGByjEvY94MVjNnlp4/qwwtOiXp0iZPoy6perXI1q5BHoAd2yPt2hxn42a9m6Tu3q+Bv74t3OLv4h2PI89NfHlE5c4zQo9+cTp1itavT8yuHeLs5t0V/n4Pbxw8+YPjz2/nrl48+/YI38M3mH6+w/r2GeLPn/C7+fn+8afffgLSJ5+ABBZYUIIKChRgg+gx2OCDEC4ooYIUVjhQhhqCwKGGH0Lo33/tjdjhhiFOmCKGKxZo4okevtjhiCSeRyOMN56Yo44tIigjiD9WuCOQPeY3pJBHqhikiEsqeSF/NNYYXpQ4NsmilT5iCSWVMyZ5ZZEAckkkmPBFKaV2ZvLoZZZa2mfmmdelOWabYYrpJJ1lysmknXeSaeObc/r5J58uAoqknl8SuiWiieKp3ptwOgdppMtNeiijbCpqJKSXauqmpX2uWaehjYqaJ6iFopopqat6WuKkWgdOCSulwM0aK5q2pjorULSGZeutLfVK1q/ApibsWcQWK9uxaiWrLEaC6uXsk+VRO9i0jvZn6mLYduuqZN46K1y43yKXK4zopqvuuuy26+678MYr77z01itVQAAh+QQJAwAgACwAAAAAyADIAIcAAADHx8f9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBBCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx4s8ABhoYYPA02s2CfjxjwfQ9YpeTLOypZtHsCceebmzjk/g74perRm06Q5o25ZenXM1q5fblYdOyXs2ixv41Y5e7ds2r5J9g6+cjhx3rqPjzSu/CTz5sKTQ/84G/j0jc+vg6yuPbr17he5/oMPKX68x/LmO6JPjz07+/Du31tcL38+/foU7+OfqH8/xOrf+acQgALaJ12BDBGIIH/9LThggw4ipGCEDk1IYUMWXrhQhhomxGGHB30IIkEABnhhiSM+CCGIKKYooYgutuiiQTLOOFCJJkaIo40F7cjjjTXy6OOPIAz5o5FCBmkjkksqOSOTTzoZJYwjQhmjlClamSWWVXLJopZfetkhmGFSOSaZGuKY44JqElkYmifCSWGbbtJ5pJw62pmkmHHiyaaeTfI5J6BTmpkmoVv6+aeiBap54KGMNopol5EK6CiRjq4paaX+XXrnpGUK6qCne3KKX6aYkhqoqfWh+imrX/K5Wqqoi8L6nqyr0opgppp2iuuVqgIbbKKgQjospcX2eWyotqbHa6+nPjtrsnny+uqyxv6KrLW5anvmsyuGGO5u4JZrqHnmQuvmuuy26+678MYr77z01mvvvfjmO1VAACH5BAkDACAALAAAAADIAMgAhwAAALe3t/39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AEEIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt2TB+46PZBXL9O+fpXyDbwUMOGjgw8jTay4KF/DjYU+juwYMmWgjC8Hzaz5J+fOPT+D1jl5tM/Spnk+tpz6JurWOV/Ddi169szVtnHizm1zN2+avn/fli38ZfDixokjb3l8OcvmzlWuZh0dL/Tq1pVjLzl9+/Pr3kX+dg+fcjx5k+bPcwevvuN06u3ds4+v8T39kenve7SvHyT//vvNByBF/w24UYEGZoRgghYtyGBFDj44UYQSQvQefBU6RGGGGubHYUQbfqjQhSJOGGKJB5GIooUerjjiiS4OpGKMDM1I44st3liQjTqmCCONPPa4448xBimkjESueCGGOi55pI9Joujkk0NGWeKUVCJp5ZVbiohlliB8maWYVJL5pJlHoimkmj0uyeSNbDZpZJpzrhknnHW2maecewJ5p59dcugmmAINSmiYfQIaaIWGEvpnkY+6GKmSk0qZKKSXSpoppZtauiijlXLZqag52jmql6d+2CiYq44ZKqpon0rYapmvqlqroLdmmKuuqdoaq6y94vrrg7OeuSuwwYKarLKlmjpsgsUa+yy0xyLbrLMC4jkttdsaWK212fJ5rZ7derssr+WaOy6d6ar7rbDtHirvvPTWa++9+Oar77789uvvvwBfFRAAIfkECQMAIAAsAAAAAMgAyACHAAAAwMDA/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AQQgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNoJR44kFbr2rZZ38K9upbtXKt17+LNq3cq375S/wKGWtfuYKeF5R5umngx4saOmRaOzBgyZaWWLxtNrFhz0cyeN08O/Zkz6dKgT//kbFg1UNauhcKOHTQ17Z2mb6/OrZsn69a9c84Ojts2cZq8j+P8rXz58OY1k0OPLn06TObWZz7PHnM7d5fev/63xC7+ZfXyKsmjZ6l+fcr27lGGj18SPv365++P/A1cP8n5/n1kX4AhAUhgRwYeyFGCCmY0YIMbPQihg/lNSCGDFk4kYYYVYcihWhV+SNGGIkZEYokPnYhiQx6uuJCKLirEX4wWwUjjQTbeWFCOOg7EY48gtAikj0IOGWSRQ/7Yo5I6MnmjkzRCGaOULlK5opUoYlmiliJy+aGXHIIZJpJAimmhmROi2SB//RmZkJprklmmnE/CqeCMbrJIZ5Mh5rnjnlHaSaCgBxIaIJ5+yghooH0meuSiVTaaKKKOvimpn5RWalCmmhIJ6ZWfZmnooaF2Oap/p96XKn2cdipQq3+drsqqrPHRul6pW9p666WT8ponrrn6aiSssepaHrGaIlupso4y2yuwphrn6qOCTUuQscdCG2211r6q7ZjSuvrtl+FOW664o3WLY7rq/sluu562Ce+78HrbWb3x4uuuvPXSq6+///Kr78AEF2zwwQgnrPDCDDfs8MMQRywxUQEBACH5BAkDAB8ALAAAAADIAMgAhwAAAMjIyP39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUvW5IGzZ8tiRZtW7Vq2bt/CjWuVbVu6VO0ewFtVL9++dv/mDSw4qt67hZ0e3pv4qd/Gjh9DZnp4smLJlpEuZpxZ8+LOSTeDPip6tNHSpomiTi10NWugrl/7jC2bJ+3aOm/jxql7t83evmkCDy5zM2fivIcjd2l8ee7KznMqj76yOfWa1q9jh65dOPfuxb/+g4eZfTzzz+bDY07Psjz76ujft58u/yP9+h3v488vfn9J/f5pBGCAFsVHoFn9HSiSgQoumGCDHrkHoX0PTrgRgxbyh2GGF1bI4UUDfsjQhiKCGGKJCZGIYkUqrihRiy5GBGOMD81IY0M23rhQjjqm6GGPI/4IpI/rDVmjkEYexGOSAy3J5AdOMhllklMaWeWQVwKZZY9b6till0U+uWOYYhI5V5k4kommQUiu+SWNb8YYp5xqrknQnCu2iaaeZeKZZ512QsmnmIMSSligZp6JqJKFSnnoomw2SiWggUo66aOQFmSplpQi2qmbm3KKaaZNjkqqQJ/uGaqoaJ0aqal7ma7KZap90lorrKTa+qSuhuIKqaxgturqq4gNK6iviwJ7I6+7Ipuss55CW6m0djLrqKLGWnvtccYeK2y3pRabLbbjilvut+B6m2643HZLLrjopmsuvO3KWy+962qa77789uvvvwAHLPDABBds8MEIJ6zwwgw37PDDrgYEACH5BAkDAB8ALAAAAADIAMgAhwAAAKioqP39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKRXmgrNmzZsdCRcu2rduyaoe+RRs36ly4daXezTt1L1+9b/8Cdit4cNvCdgMjfjp3MWPFjpk2jix5MmWlli8nhawZaebORj+Dlst5NFHRpoOiTv1zNeuerl/vjC07J+3aN2/jrql798zevmMCD/5yOHGXpY/jTK7cJvPmNI1DT/l8unDC1nNXz44cO/fo3r/+/w4vHub28tTPoz+pfn3J9u5Jwo8vkjx9lfPvf7Svnz3//u8dBiB+/w1Yn4AGkoVgggEuyOBIBT7oUYQSbpRfhRRRiGFGGm54UYceVgRiiBKNSGJEJp74UIoqNsRiiws5COOHMs4oYo02TvRijgbtyCNBPv4oEI5CrshWkRYRiSRDSi6pUJNOIgRllD0eSSVEU145UJZafsClll9eGSaVY0ZZppNnoklXlw5ZySaTa74ZY5xyJuRmnVLSiedBd+5ZUJ9+bqlnoEMOSqiXZx1aZVqKAmlooIAe+iikiTYqaKWWIspoppNSilemmn5qaad+YsqpqaNueqqqqYra6gFtoF4Ka6yovhprobPSymqrt4baa62N7hqssIoSW6yrq/aKqLLGSoosr7/meuuzqSq7LLPS6mottcNumy2o3AZrrZfjfktrueOmS6667Lbr7rvwxivvvPTWa++9+Oar77789uvvvwAHLPDABLcYEAAh+QQJAwAfACwAAAAAyADIAIcAAACzs7P9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA/CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDig15oKzZs2jTmh17VK3bt3APsO0ZNy5DuHNp1lWrEW3elnvPkhT8d3BguSvXFvZ4eCbixRcbQ2YqebLSwJab7s1MuS7npZs/X/YsGmno0m3tojaterVR0q6Jwo49dDbtoLZv/2ytGzfe3kJ5A/cpfDjP4sZ1Ik+e8zdzum+fE48u/Tj16sqvY2+ufbtN596//ncPr9cteZzgzzs2r77m+PYv08OPz36+zPr2Yb7Pn5gvf/34/cdSgAKqtF+BJhGIIEoKLlhSgw4allaEBkJIIUgWXvhRhhp25F+HD34I4kgcjpiRiCaSNWGKIpXIYkUovujhijJuSGONM/qFI2M67shRjD5GdmOQGAFJJEVGHinRkErC2GOTFjEJ5ZJPTjmRlFY+hGWWDW3J5UJefplQmGIeVGWZXRKGppZqrpmmYm6+WVacDp1Jp5lt3omQnXoWxGefAv0JqKB9EqqnoYfCCSiecy66p6KOEpRnpIFCSmmljV460KSUctpppppi+lionkZq6aWnfjpqqB+kaiqobazCSqqsqNJa66qauvoqq5La+imvm/q6K7CVEtsqrrMaK+ywxCKbq7OoGhuotK1KC2201lJ7ranadkvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AByzwwARDFBAAIfkECQMAIAAsAAAAAMgAyACHAAAA29vb/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AQQgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gNx4YS7as2bNkwypFy7atW7VA3cqd2xbuTbp487K1+1Kv3Ilv+aL0a/bjXsEhCac1eRZxR8V9Fzu2SLhm2cmA9eqUjHmh5p8HOiv8LDS06IJ5kZoWnXrpasd4TzOlK9s17dpJb+NWPXd37r++eQcObrQ38eLAjxNNrnwo8+ZBn0MHPXx63OrWqR/Ofn07d5/Yv/7vDC9+c93yPcmjv+t9fc7z7s2jjc8TPn328++/z68ff+P+/l0GoE3tDShTgQZG9l+CMyHIIEsOPrhShBKmxF+FLlGIIWMLbtjShR6qBGKIFnZIYokCniiiiSpyWFiLKHIGo4syzkgSizYm9mKOJeHIo2E7/ihSkELqWGORHhGJ5GNKLilWk05mBGWUGE1JJWUpXvnkkVpiyWWXFGUJZpVfjimRmGZWhGaamY3FJpluvunla3KeWWadnt2JZ0Jr7slQn36OpmegqA1KKEGGHipQoooyeqijhEIaqKST0qlonpc+FGemf27KKZ+efopQqKIaRGqpiFqK6kCU+nnqqnEgvLqqrLPCOqqqtuIKq66z8oqqr6UCG6ytBwn7qbHHEmuqsssyy6qziEK7qLTTUmststZmq+223Hbr7bfghivuuOSWa+656Kar7rrstuvuu/DGK++89NZr77345qvvvvz26++/AAcs8MAEF2zwwfAGBAAh+QQJAwAmACwAAAAAyADIAIcAAADOzs79/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBNCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtatXiQjCih1LtqzYr0zNql3LFq1QtnDjrnWrU67du2bpysTLt+9YvSz9Ch4M2OTgvxnlFg55mGTbxRsFB84L2aLfvWUrg+WLM7Nmhn15ev58kDNQxKQJ3jWK+jPepK0Xr04btrLdqLULK5561u1tq7m97sYafOtwrQi4xkWbPOty382rPtcbXSpc21QfY8c9l3R12mpT/nMPL/6p9vJNu6NPT349+NHul7aPr3Q+faTq7+OnrH8//P6s/QcgUfYNOBR/BhIoYIJBIchggws+6FOEEopGYYV1kYXhgRpueFqHHv50YYg2gUiihbGdmJOJKmbYW4suFgdjZynOWBOLNtKEY44z7chjTDX+COSLQvYYZJEtHYnkZDIu+ZKSTqYEZZQnEUmlS1ZeudKUWo7EZZeMZQlmlU2OSeZ3Zp6Z5pZlrullm26GiWacIolJJ0hw3ulRnnpyxGefGv0JKEaCDmrZnIZGhmiiiS3K6EWFPhpRpJJC5GilFF2KKVib+tlpZJ8GqmmooI1K6kKmnppQqqqW1mpFaay+qpqsmdLKqa2W4pqrrrzu2WtDsf4q7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AB8xgQAAh+QQJAwAmACwAAAAAyADIAIcAAAC8vLz9/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBNCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3K9SCCr2DDih2LoCtUsmjTpjVrVK3bt2TZ9oRLt+5YuTbt6t1bFu9LvoD5+lUZuLDgwSQNh6V4GLFHxR/rOt4YOOXbyRYB/1WLWaLevGs7M/ysE61ohZJ/mj5NMPXQu6xN0E0KuzPcpmJtuz272PFlqbnx/q7a2+xwq8W37lYOluvyrs2zchb+Fet0v9GJr0acHfj2ydW9/sc9Hf5paNblcY+PLbsv0+/s0yNdz761+6Pw6wu837a2/oL8vebffwD2FxyBCAWo2oEIekXUgA0apCBPEEZYIFAVWlhUhhq2tmB3HSY0IWgghrhhciaKSGGJKQrIYotBoQijUAzOSOOLNs4lY44+7cijjiP+WBqOQubkY5FGyofkTkcuSaKTH0LZY5BSzkRklTJdiSVMWm7ZUpdesgRmmIQpSWZMZp7JJZVqrpRmm2KyCSdKb85Zpp1ZyolnYnruKVKffoYEaKCREerSoIZyhGiiGdXJKEiOPvrYopJWRGmljGF60qWadurpp6CGKuqopJZq6qmopqrqqqy26uqrXbDGKuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvZgGBAAh+QQJAwAmACwAAAAAyADIAIcAAADQ0ND9/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBNCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izWkXAtavXr1qzfh1LtizXsEzNql1LFi1RtnDjgnW7U67du2fp0sTLl6/el30D+/2LUrDhvoRLHu4a8XBikIY9Dn6cEbHJu5QvYnYZN7PEzTLlenYoGifb0QpL9zyNmmBnoWtbD2RdVG1r2kjNesat1HZi3k3LEo5NVThd4lWNh9W9fK5W382db2Xutu1V5cO9Tpf+WPtU6pTH/krFnln8U/K7uSdFP9p8b+uyZ3t/Pz9+QcZL3dt3Xf+t/v384VebegDKl9eABxaYUIKwCahgagj45+CDB/W3GoEUBhghUBhmqCGHE3q44E8dingfgzlZaGKFKNpU4oon8hQijAjNuFeLNI6ok405spgijz0atOFNOAapY01AGimki0UqWSOTTkI0ZExJRllXk1beNxOWWf44ZZc+fQlmmGKOuWOZZpqGZppqsnmhm6vB+aacO9JZp50p4pmnnkTy6ed+a/7JUqCCqkRooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrVLDGKuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678FIYEAAh+QQJAwAeACwAAAAAyADIAIcAAADd3d39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA9CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izZjXAtavXr1qxfh1LtizXsE3Nql1LFu1QtnDjgnW7U67du2fp0sTLl6/el30D+/2bUrDhvoRJHo54uGtikIM5Gn688e5JxJQtxgVsN7NEuXs7e27INifo0QlL+zyNeuDat3BbC1R7NDZqs0tVU6ad9nXislJ10wVO1bdb4lWNa20bFvfyscedX2UeHXlxr7upT52bWTtU6J6l/jsFP9o6U/K3vSdF39o8Uu6yZ6s36jj+QfZF4dt3rZ9o//3y/QcUdgAihF9QeRWoEIH+GaAgafUJxeCDBk64WoQUVmhhXRhmqGGCq3no0IamgSjigiTa1OGJH/ZkIosorliTjDDe96KKNUJEo0w35qihTg76OOKOgAnJWJA4GvkQkSwhqeSQTsYU5ZML9UjlT1auNOWVqWXJJYdfSuhlmDcxSeaMW54JZJpq4jRmm1KyCSeac7pYJ09y3imlnnXxaZqfbgJapqCE7pdnoYUhOtOhijbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrWbDGKuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z0ohYQACH5BAkDAB8ALAAAAADIAMgAhwAAAN/f3/39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cr14YGvYMOKHXug61OyaNOmNVtUrdu3ZNn2hEu37li5Nu3q3VsW70u+gPn6VRm4sODBJA9LNBwWMci6Hxk71gg3ZeDJFt3+VYzZodq8djt7jqtTr+iEaIFCPk2Q9NDVp+8ipRu7MdPKmMVCfetYt1Tefm1XBW5WuFXiW41j1Zz8K1vmy53LhT5cevC11fsixj7V+mTuu7X+dwbf1Lto8krN15Z9WzxrgamXqn8Pn/1s+gjjH3WPv7V9ovz1559vAAq4kGtCBWjggGAVuOCBBP6k4IMMzlcahQ39t9OEGFbIIU0fdjhQhCLOphxOIZZYX4Mqpsdiiya+CKNRJ86YYI02qiZjjjfuyKOOFv7IE45CDuljkUYGiWRORy5ZWpNOoqhklDVBSWWVU145k5VaysRllzB9CeZmYz6ZYpkriYlmmmeuaVmbbp6UZZxvwklnYnbeKdKcepbEZ58j/QnonoOGWehfh7qUZ6IbLcpoRoI+SpmjklYUaaUYUYrpRJpuGlGnnoYq6qiklmrqqaimquqqrLbq6qthsMYq66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IYr7rjklmvuueimq+667Lbr7rvwxivvvPTWa++9+Oarr74BAQAh+QQJAwAfACwAAAAAyADIAIcAAADd3d39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA/CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtatXjgfCih1LtqzYr0zNql3LFq1QtnDjrnWbU67du2bpysTLt+9YvSv9Ch4M2KRcjYP/FgbZdmTixWDzBvYL+aJkmJQrRyyLs6/mhpx3ev6MUPFPvqQLmh56N/WH1UXxfj6b1m7lsFFtA6Yt9TBd3FZ1ewWO1TfXA12NF0f+NW5W4s3hXmWu1zlV6oWl9549N3fqxk6x/nNX67p39/JPwaNven49e/Luw8OPXzs0/aXt7yPNr9/o/P77XQbgUQIOGFuBBrJmX4IHksWgfws++FaEEgJFYYU+IYhhTxduKJqDHgbVYYidgUhihrCdqNOIKtZkYosrpgjjTS/OSKOMNs5UY44u4sgjZj7++FKQQrZEZJGT8YbkXkouCSR0Tg7ZZJRGTkklS1ZeqVKWWqJ0ZJcifQkmY1yOSVKZZoYJZZqGrcnmmW6+qaZ4cjoWZ50foYlnZHu22WdJd/65UaCCZkRooZbRieigii5qaKOOJhqpR4dOupmlHUGK6USabnqpp4aCilGloipEaqmloWpRp6qa2ipFbay+elCsshJEa60D3Yrra7s+pGuvwC70a63DBmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AByzwwASjGxAAIfkECQMAHwAsAAAAAMgAyACHAAAA1tbW/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4APwgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gSx4YS7as2bNkwypFy7atW7VA3cqd2xbuTbp487K1+/KtRL1y+aLc6xGwWcEjz540nBYxx7J9DTu+CJmm5MkRG+MEjPnhgbh5Oyv8PFSv6IKkjYY+nTrp6tNM8cJuKnt2bLq2bwfOvXYu76W+f7veLfxo8OKqiSMvqnx5ab/OiTaPDrou9efWrweFrr062u5Cuf6D7yl+vM7y5nOiT3+XMHue2d+fdy9/M/367b/jV69/f37F/v1XWYA23UdgTAYeCFOCCrbEYIMsPQhhShJOOBiAFkaGYYYObsjhSv19GKGHIl54WIkjDogihSeuyGKLLi4GY4xizUhjYjbeKBKJOoLEY4+F5QhkkJoNGZKQRm6EZJIZ/cgkRk4+SZmKUipJZZVNXonllEVuCaWWXlYEZpgTjUlmZl2eSZGZajrEZpsMvQnnaGnO6VmddjYkZ54G7cknQX7+KVCgghL6J56CJoRoogctyihqYz3qZqSSxklppXRiaqmmdLbGKaSefjqQo5heKiqkpzYa6qmmpjroqmyswipqq67K+imtqdp6q6uo8jqqr4ACO6iwwxKrq6bHImsssR8kW6mzzD4b7bLTVmvttdhmq+223Hbr7bfghivuuOSWa+656Kar7rrstuvuu/DGK++89NZr77345qvvvvz26++/AAcs8MA3BQQAIfkECQMAHwAsAAAAAMgAyACHAAAAw8PD/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4APwgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4pNeaCs2bNo05odi1St27dwD7DlCZdh3LhzaaLVeFdtXpZnSfYN/FdwWcCD5Rb2qDhm4sVTH0OGKnmy08qWm/bNTPku56ebPzMNLXop6dJJPaNWqnp1W7yuU8OObbQ1baK2bw+drXt33d64fwMXynv4z+LGeyJPvlM4c5/On9N9K/049erKr2PXGX37ze7ea/6CDz9TO3mb48/DNK9er9v26NnDX/9+fvn69mXKz98SP/+X+/2nkn8CIuZXgS4RiCBZBy5o4F4OrqRghCVNSKFhaV3IYIYaotRghxV+CKJIFo7IGIcmjiRiih+VyCJfKL7YYowydrRijTBCiOOJhO1oI40+YnRjkBUNSeRERh4pEZBKUsRkk0vqCGWRUk6JZJVWRvRklg1tyeVCXn6ZUJhiIoRlmXb1iKZDZ645pppugglnnG+uRWeadt6pUJt6CsRnnx/82aegehJ6p6F0zgkoQYou6meejhbUqKOTAlqppZBGOtClgx6mqaSZfsppoZ5+ymippgYaqqarsoqqqWutRhorpa+KWqutjaWqqq6b3uoqr4/mmqqvsgo7rLG2AvuossTKquyuzD6LrKjPBirttdFiC+y01Xbr7bfghivuuOSWa+656Kar7rrstuvuu/DGK++89NZr77345qvvvvz26++/AAcsMHYBAQAh+QQJAwAeACwAAAAAyADIAIcAAAC8vLz9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA9CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDim15oKzZs2bHQkXLtq3btGq1vkUbd+vcsnXlzs2b9S5frHv/Xg0smCrhwlIPI177dvFUxY6bQo6s1C9lp5MvI22sWTLnzpU/g06aebTQ0qaBok7tczVrnq5f64wtGyft2jZv46ape7fM3r5hAg/uUjRx2G6P/zSu3Dbz5rmfQ+edfPrs6tZvDs9eUjp34di//s/0Lp5s+PLgz6Mvrn69+bbuY5KPf7I9/ZTz75O0r99k/v4h8QfgSP8N2FGBBnIkYIIfIchgRgs+qCB8EnZHYYX7XYhhgBpu2GCHHh4IYogTskUiSBGeOFGKKkbEYosQjQijRS/OyFCNNiqEY44I7cijQT7+WJCMQj5EZJENHYnkQkoumVCTTh4EZZRDmkhljFZe6dCUWnrApZZfXhkmlWNGWaaTZy6ZZZc30sVmkm6+yWSccj5JZ51S3oknQWvuWeVZfvaoZ6BeDhqooYcCSuifcC06UJ+LIuqnpHhCSiillSrq6KONblpop5tiWqemnooqJ6mhouqoqquC2ipeaZ5yCmusrEY6K62uvhqrrLsKVOult5YarLAH9Pqpsbm2auyxvSYLbLHIQtustLsOm+qy1iobLbbU4sottst6GW63pY4brrnnpqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AB+xhQAAh+QQJAwAfACwAAAAAyADIAIcAAADHx8f9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA/CBxIsKDBgwgTKlzIsK